[ 
http://issues.apache.org/jira/browse/AXIS-2084?page=comments#action_12315937 ] 

Stefano Meneghello commented on AXIS-2084:
------------------------------------------

client Axis 1.2.1, Win XP, 2K (JDK 1.4.2, 1.5), .net web service.

After the patch, I obtained the following:

AxisFault
 faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Client
 faultSubcode: 
 faultString: In the record 819A034047D4A96C72F4E2CC92FB63BF, the number of 
bytes in the Data field is less than 418001, which is the value indicated in 
the ContentLength field.
 faultActor: http://192.168.1.13/test/test1.asmx
 faultNode: 
 faultDetail:... (I don't insert full stack trace, since I've inserted some 
println inside the code)

with a >2 MB pdf DIME attachment.

Before the patch, the error was "Type_Length of the final record chunk must be 
zero...".

Here is the output of my println's:

DimeBodyPart.send (position:2)
bytes1: 1048576, bytes2: 0
do: bytes1: 1048576, bytes2: 1048576
sendChunk: pos:2, chunk:1, length: 1048576 (1048576)
sendHeader: BEC:1
sendHeader: 1048576 (0,16,0,0)
sendChunk: padding: 0
do: bytes1: 1048576, bytes2: 418001
sendChunk: pos:2, chunk:3, length: 1048576 (1048576)
sendHeader: BEC:1
sendHeader: 1048576 (0,16,0,0)
sendChunk: padding: 0
do: bytes1: 418001, bytes2: -1
sendChunk: pos:2, chunk:2, length: 418001 (1048576)
sendHeader: BEC:2
sendHeader: 418001 (0,6,96,-47)
sendChunk: padding: 3

Hope this could help.

Stefano

> Dime attachements: Type_Length of the final record chunk must be zero
> ---------------------------------------------------------------------
>
>          Key: AXIS-2084
>          URL: http://issues.apache.org/jira/browse/AXIS-2084
>      Project: Apache Axis
>         Type: Bug
>   Components: Serialization/Deserialization
>     Versions: 1.2, 1.2.1
>  Environment: Microsoft XP
>     Reporter: Coralia Silvana Popa
>     Assignee: Davanum Srinivas
>  Attachments: EchoAttachment.java
>
> Large files sent as DIME attachments are not correct serialized. Seems that 
> the 
> When reading a series of chunked records, the parser assumes that the first 
> record without the CF flag is the final record in the chunk; in this case, 
> it's the last record in my sample. The record type is specified only in the 
> first record chunk, and all remaining chunks must have the TYPE_T field and 
> all remaining header fields (except for the DATA_LENGTH field) set to zero.
> Seems that Type_Length (and maybe other header fields) is not set to 0 for 
> the last chunk. The code work correct when there is only one chunck.
> The problem is in class: org.apache.axis.attachments.DimeBodyPart, in method 
> void send(java.io.OutputStream os, byte position, DynamicContentDataHandler 
> dh, final long maxchunk)
> I suggest the following code the fix this problem:
> void send(java.io.OutputStream os, byte position, DynamicContentDataHandler 
> dh,
>             final long maxchunk)
>             throws java.io.IOException {
>       
>               BufferedInputStream in = new 
> BufferedInputStream(dh.getInputStream());
>               
>               final int myChunkSize = dh.getChunkSize();
>               
>               byte[] buffer1 = new byte[myChunkSize]; 
>               byte[] buffer2 = new byte[myChunkSize]; 
>               
>               int bytesRead1 = 0 , bytesRead2 = 0;
>               bytesRead1 = in.read(buffer1);
>               
>               if(bytesRead1 < 0) {
>                 sendHeader(os, position, 0, (byte) 0);
>                 os.write(pad, 0, dimePadding(0));
>                 return;
>               }
>               byte chunknext = 0;
>               do {
>                       bytesRead2 = in.read(buffer2);
>                       
>                       if(bytesRead2 < 0) {
>                               //last record...do not set the chunk bit.
>                               //buffer1 contains the last chunked record!
>                               sendChunk(os, position, buffer1, 0, bytesRead1, 
> chunknext);
>                               break;
>                       }
>                       
>                       sendChunk(os, position, buffer1, 0, bytesRead1,(byte) 
> (CHUNK | chunknext) );
>                       chunknext = CHUNK_NEXT;
>                       //now that we have written out buffer1, copy buffer2 
> into to buffer1
>                       System.arraycopy(buffer2,0,buffer1,0,myChunkSize);
>                       bytesRead1 = bytesRead2;
>                       
>               }while(bytesRead2 > 0);
>     }

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira

Reply via email to