Mike M. created CXF-9129:
----------------------------

             Summary: Chunked attachment streaming not working when using 
ws-security
                 Key: CXF-9129
                 URL: https://issues.apache.org/jira/browse/CXF-9129
             Project: CXF
          Issue Type: Bug
          Components: JAX-WS Runtime
    Affects Versions: 4.1.1
         Environment: CXF Version: 4.1.1
OS: Windows 11
Java Version: openjdk 21.0.7 2025-04-15 LTS
Container: Spring Boot 3.4.4 / Tomcat 10.1.39
            Reporter: Mike M.


We have a project that uses JAX-WS with ws-security. The policy is set to sign 
and encrypt all messages. Some operations involve long responses. These 
responses have a size of multiple megabytes and take some time to process on 
the server. We have the problem that some layer-7 firewalls or http proxies 
don't like to wait too long before receiving at least the response headers. 
They tend to cut the connection with a timeout-type error before the server is 
done processing the full response.

To mitigate this, we are trying to do the following: The part of the response 
that takes long to process has already been encapsulated into an attachment 
like this:

{code:xml}
<xs:complexType name="ExampleOperationResponseType">
    <xs:sequence>
        <xs:element name="data" type="xs:base64Binary" 
xmime:expectedContentTypes="application/octet-stream" />
    </xs:sequence>
</xs:complexType>
{code}

We are trying to use the DataHandler API provided by the JAXB binding to let 
the server stream the response attachment. The idea being that: if the server 
can return the main response-body immediately and return the attachment using a 
chunked Transfer-Encoding of MTOM attachments, this could prevent the TCP 
connection from sitting idle and prevent proxies from cutting it.

When we try that without ws-security, it seems to work exactly like that. 
However, as soon as we add signing and/or encryption, the server behaves 
differently: It caches the whole response while writing the attachment. Only 
when it's fully done writing the attachment, it sends the response to the 
client in one go (despite having a "{{Transfer-Encoding: chunked}}" http 
header).

In order to facilitate reproducing this, I created a standalone dummy project 
that contains a unit test showing the issue:

https://github.com/netmikey/cxf-security-boot-test

See the CxfAttachmentStreamingTest. The tests in this class send a request to 
the server. The server then returns a response that contains a binary 
attachment. The server is set up such that it takes some time to stream the 
attachment data. We expect chunked streaming to take place. That is: the client 
should obtain the response in chunks while the server is still streaming the 
attachment. That is checked by capturing the timestamps of when the client 
receives the initial response body and when the server finishes streaming. It 
is expected that the client starts receiving the response before the server 
finishes streaming.

Am I wrong expecting attachment streaming to work when ws-security is in place? 
If so, why couldn't this work? If not, is this an issue that could be fixed?



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

Reply via email to