One thing I forgot to mention: to prevent the crash, I also had to change
the following in xml\XMLParserXerces.cpp:

Ln 79:
const AnyElement* XMLParserXerces::next(bool isCharData)
{
    bool bCanParseMore = false;
        if(!m_bFirstParsed)
        {
-           m_pParser->parseFirst(*m_pInputSource, m_ScanToken);
-           m_bFirstParsed = TRUE;
+           m_bFirstParsed = m_pParser->parseFirst(*m_pInputSource,
m_ScanToken);
+           if (!m_bFirstParsed)
+                       return NULL;
        }

Kind regards,
Iwan Tomlow

-----Original Message-----
From: Iwan Tomlow [mailto:[EMAIL PROTECTED] 
Sent: dinsdag 21 februari 2006 8:53
To: 'Apache AXIS C User List'
Cc: 'axis-c-dev@ws.apache.org'
Subject: RE: SSL Client


Hello,

Just to let you know I managed to get the SSL configured using
vc\transport\Axis3\HTTPSSLChannel.
However, I think I stumbled over a bug in the transport layer, because the
Axis-client was always crashing when using SSL. Can't seem to access the
CVS-sources at the moment, so I don't know if it has been noticed and fixed
already, so I'll post it here.

Debugging showed the Xerces-parser was using bogus data to throw a
UTF8FormatException, so the following code in ClientAxisEngine.cpp failed:

Ln 223:
        int nSoapVersion = m_pDZ->getVersion ();
        if (nSoapVersion == VERSION_LAST)     /* version not supported */
        {
            Status = AXIS_FAIL;
                //      return AXIS_FAIL;

The status was indeed AXIS_FAIL, but because the return-statement is
commented out, the subsequent call to "m_pDZ->getHeader ();" caused a crash
in the Xerces parser.

I finally tracked it down to what I think is a bug in the getBytes() in
axis3/HTTPTransport.cpp (Ln 588). Probably because of using SSL, what I was
receiving after the HTTP-header was always a first chunk containing *only*
the chunk size + CRLF, nothing more. This caused the following code to never
execute extra reads to really get any of the chunk data:

                //There might be chunk extensions in there too but we may
not need them
                                unsigned int endOfChunkData =
m_strReceived.find( "\r\n");

                // make sure we have read at least some part of the message
                                if ( endOfChunkData == std::string::npos)
                                {

endOfChunkData was 3 in this case (data was "4db\r\n"), and data was never
read. I tried to fix it like this, which worked for me (not at all sure that
this is a complete and trustworhty fix); this should make sure at least some
of the actual chunk data is read before continuing:

                // make sure we have read at least some part of the message
-                               if( endOfChunkData == std::string::npos)
+                               std::string::size_type nLen =
m_strReceived.length ();
+                               if ( endOfChunkData == std::string::npos ||
+                                               endOfChunkData + 2 >= nLen )
                                {
                                        iIterationCountdown = 100;

                                        do
                                        {
                                                m_pszRxBuffer [0] = '\0';
                                                *m_pActiveChannel >>
m_pszRxBuffer;

                                                if( strlen( m_pszRxBuffer)
== 0)
                                                {
        
iIterationCountdown--;
                                                }
                                                else
                                                {
                                                        iIterationCountdown
= 100;
                                                }

-                                               m_strReceived =
m_pszRxBuffer;
-                                               endOfChunkData =
m_strReceived.find( "\r\n");
-                                       } while( endOfChunkData ==
std::string::npos && iIterationCountdown > 0);
+                                               m_strReceived +=
m_pszRxBuffer;
+                                               nLen = m_strReceived.length
();
+                                               endOfChunkData =
m_strReceived.find("\r\n");
+                                       } while( ( endOfChunkData ==
std::string::npos || endOfChunkData + 2 >= nLen ) 
+                                                               &&
iIterationCountdown > 0);
                                }

Kind regards,
Iwan Tomlow


-----Original Message-----
From: Iwan Tomlow [mailto:[EMAIL PROTECTED] 
Sent: vrijdag 17 februari 2006 16:31
To: 'axis-c-user@ws.apache.org'
Subject: SSL Client


Hi, I've been happily using Axis C++ 1.5 for client development, but now
urgently (and unwarned) need to be able to access the webserver over https.
I know it should be possible to link OpenSSL with Axis, but seem to be
unable to find the right documentation (the info at
http://ws.apache.org/axis/cpp/winuser-guide.html#ssl is absolutely cryptic
to me - where is vc\transport\Axis2\Axis2SSLChannel?)

Does anyone know how to get a client working over https?
What I get now = HTTPTransportException:Client attempted to use secure
transport (https) without an SSL layer

Strange thing is that the client works automatically when testing internally
- does Axis somehow 'downgrade' to normal htpp if https can't be used? Or
does this have to do something with me already having build OpenSSL on my
development machine?

Thanks in advance for any pointers,
Iwan Tomlow

Reply via email to