[ 
https://issues.apache.org/jira/browse/CXF-9258?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Freeman Yue Fang updated CXF-9258:
----------------------------------
    Attachment: wsrm-retransmission-attachments-reproducer.zip

> WS-RM retransmission of messages with attachments (SwA/MTOM) sends an invalid 
> multipart request
> -----------------------------------------------------------------------------------------------
>
>                 Key: CXF-9258
>                 URL: https://issues.apache.org/jira/browse/CXF-9258
>             Project: CXF
>          Issue Type: Bug
>          Components: WS-* Components
>    Affects Versions: 4.1.9, 4.2.4, 3.6.13
>            Reporter: Freeman Yue Fang
>            Assignee: Freeman Yue Fang
>            Priority: Major
>         Attachments: wsrm-retransmission-attachments-reproducer.zip
>
>
> When a WS-RM application message with attachments (SwA or MTOM) is 
> retransmitted from the in-memory retransmission queue, the retransmitted 
> request is invalid. The server fails with:
> {noformat}
> org.apache.cxf.interceptor.Fault: Couldn't find MIME boundary: --uuid:...
>     at 
> org.apache.cxf.interceptor.AttachmentInInterceptor.handleMessage(AttachmentInInterceptor.java:60)
> {noformat}
> so the message is never delivered, although it is retransmitted until the 
> retransmission limit.
> h3. Cause
> {{RetransmissionQueueImpl.doResend()}} reuses the original message and runs 
> its interceptor chain again, starting after {{RMCaptureOutInterceptor}}. Two 
> message properties left over from the first transmission break the attachment 
> handling:
> # {{AttachmentOutInterceptor}} sets {{ATTACHMENT_OUT_CHECKED}} on the message 
> to avoid being invoked twice (added by CXF-7952 in 3.3.6/3.4.0). On the 
> retransmission, the flag is still set, so the interceptor does nothing: the 
> request is sent with the multipart Content-Type of the first transmission, 
> but its body is the bare SOAP envelope, without the MIME parts and the 
> attachments.
> # {{AttachmentSerializer.writeProlog()}} replaces {{Message.CONTENT_TYPE}} 
> (e.g. {{text/xml}}) with the multipart Content-Type, and uses 
> {{Message.CONTENT_TYPE}} as the type of the root part. On the retransmission, 
> it uses the multipart Content-Type of the first transmission instead, so the 
> {{type}}/{{start-info}} parameters and the Content-Type of the root part 
> contain the previous multipart Content-Type, including its boundary, e.g.:
> {noformat}
> multipart/related; type="multipart/related"; boundary="uuid:c331e22c-..."; 
> start="<[email protected]>"; start-info="multipart/related; 
> type=\"text/xml\"; boundary=\"uuid:6a734010-...\"; 
> start=\"<[email protected]>\"; start-info=\"text/xml\""
> {noformat}
> h3. How to reproduce
> Send a one-way message with a SwA attachment (or with MTOM enabled) through a 
> WS-RM client, and lose the first transmission (e.g. with the 
> {{MessageLossSimulator}} of the ws-rm systests), so that the server only 
> receives the retransmission.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to