[
https://issues.apache.org/jira/browse/AXISCPP-930?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
nadir amra closed AXISCPP-930.
------------------------------
Resolution: Fixed
Fix Version/s: current (nightly)
I believe this has finally be resolved.
Problems:
==============================================
=== 1 === Chunked processing
The transport did not keep track of how many bytes of the chunk had been
consumed, and thus if not all of the chunk was consumed the next time through
it would assume that the remaining partial chunk was part of the chunk size,
resulting in the transport to be in a weird state, to say the least.
=== 2 === Chunk processing
The transport did not remove CRLF's from the input buffers correctly or
completely, again resulting in possible weird states.
=== 3 === Chunk processing
Chunk size processing returned 0 when passed an invalid chunk size. This caused
me headaches to no end. Again, causing transport to not be in a valid state.
=== 4 === Non-chunked process, no Content-Length
Non-chunked processing where there is no content-length may occasionally result
in AxisGenException with no message detailing what is wrong. This was a result
on the reliance of an uninitialized m_iContentLength class variable. This was
an intermittent error.
==============================================
To fix the problems above, I created a new state, eSOAPMessageHasContentLength,
and seperated the logic for state processing so that getBytes() now calls:
getBytes_MessageIsChunked()
getBytes_MessageIsNotChunked()
getBytes_MessageHasContentLength()
I also create resetInputStateMachine() so that it will properly initialize the
state variables from whereever it is called.
In addition, the transport did not recover from connections that had been
closed by the Channel when reopen was false. I added code so that a Channel's
reopenRequired() is invoked to determine if an open should be done. More
information on this will be in AXISCPP-481.
I also ensure that when evaluating a chunk-size string, it is valid - i.e. all
hexadecimal characters. Otherwise, an exception is thrown. Before, it would
simple return some value. This caused me headaches to no end. Once I added
this, it revealed that the mockserver did not handle CRLF correctly, so I had
to fix that and now it does so properly as long as chunk sizes as set to ###
(except the last, which must be 0).
On the performance side, there is a lot less substring'ing. I make heavy use
of the string erase() function, and there is now no reason to seperate chunked
messages when copying data to parser buffer. In addition, the channel use to
read from socket in own buffer and then copy it to transport buffer, that is no
longer the case. I have also added some minor infrastructure that in the
future will let us read the data into the parser buffer directly. However, I
still have some work to do on this.
I also added support for new SoapTransport.h method isThereResponseData() that
will be used for one-way requests. More on this will be in AXISCPP-925.
Finally, and probably more important of all, I added lots of comments so that
at least it will be easy next time to understand what is going on and the
intricacies of the logic. Prior to this there was a lot of "hidden"
assumptions, to put it kindly, that caused me much pain when moving code
around. No comments is a bad thing, people! :-)
So have at it and let me know if there are any problems.
> Chunked encoding is not implemented correctly
> ---------------------------------------------
>
> Key: AXISCPP-930
> URL: https://issues.apache.org/jira/browse/AXISCPP-930
> Project: Axis-C++
> Issue Type: Bug
> Components: Transport (axis3)
> Affects Versions: 1.5 Final
> Environment: Solaris 8
> Reporter: Michael Dufel
> Assigned To: nadir amra
> Fix For: current (nightly)
>
>
> <Rant>The chunked transfer encoding is broken and results in a 'peekNextChar'
> error similar to the one described in AXISCPP-555. I was forced to re-write
> HTTPTransport::getBytes() from almost the ground up because of the
> unreadableness of the code. Nested do/while loops??? Come on ... Yes I know,
> I am a code snob. </Rant>
> I believe the problem in the original code was reflected in the case that the
> buffer from the channel contains data in the following form:
> <some continued data>CRLF
> <chunk length 1>CRLF
> <some data 1><CRLF>
> <chunk length 2>CRLF
> <some data 2>CRLF
> .
> .
> .
> <chunk length n>CRLF
> <some data n>
> everything after <chunk length 2> was being dropped by the transport library.
> The transport library sends a 'TRANSPORT FINISHED' response and the xml
> parser is only given a partial message to deal with. This causes the
> 'peekNextChar' error.
> Yes, I know that solaris 8 is not supported in Axis 1.5, but this is a
> protocol issue, not a platform related issue. Again, since I had to re-write
> the getBytes method, I can't offer a code snippet which will 'magically' fix
> this problem.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]