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

Guillaume Chauvet updated CXF-8975:
-----------------------------------
    Description: 
Hello,

I'm contacting you because I'm experiencing a problem that seems to be a bug 
when calling a REST service in multipart mode via jarxr-client in proxy mode. 
I'm working with version 3.1.4 but I've also tested with version 3.5.7 (Unable 
to use a more recent version for technical reasons).
h2. Description of the problem:
h3. Current code:

I have an interace containing the following signature:
{code:java}
@Consumes({ "multipart/form-data" })
@Produces({ "application/json" })
FileId create(MultipartBody body);
{code}
Then code to call the service (code from an integration test):
{code:java}
@Resource(name = "myApi") // defined in a spring context with jaxrs:client
private MyApi api;

@Test
public void addContent() {
    final Attachment file = new Attachment("file", 
MimeTypeUtils.TEXT_PLAIN_VALUE, IOUtils.toInputStream("TEST"));
    final MultipartBody body = new MultipartBody(file);
    final FileId result = api.create(body);
    assertNotNull(result);
}
{code}
h3. Result obtained:

I obtain the following trace:
{noformat}
INFOS: Outbound Message
---------------------------
ID: 1
Address: https://XXXXXXXXXXXXXXXXXX/file
Http-Method: POST
Content-Type: multipart/form-data; 
boundary="uuid:e8db85d9-f27e-4220-97c6-3f5ec4c3e08f"
Headers: {Accept=[application/json], Authorization=[Bearer 
XXXXXXXXXXXXXXXXXXXX]}
Payload: --uuid:e8db85d9-f27e-4220-97c6-3f5ec4c3e08f
Content-Type: text/plain
Content-Transfer-Encoding: binary
Content-ID: <file>

TEST
--uuid:e8db85d9-f27e-4220-97c6-3f5ec4c3e08f--
{noformat}
... and the webservice response:
{noformat}
--------------------------------------
févr. 02, 2024 10:02:50 AM org.apache.cxf.interceptor.LoggingInInterceptor
INFOS: Inbound Message
----------------------------
ID: 1
Response-Code: 500
Encoding: ISO-8859-1
Content-Type: application/json
Headers: {cache-control=[no-cache, no-store, max-age=0, must-revalidate], 
Content-Length=[7930], content-type=[application/json], date=[Fri, 2 Feb 2024 
09:02:50 GMT], expires=[0], pragma=[no-cache], 
x-content-type-options=[nosniff], x-frame-options=[DENY], x-xss-protection=[1; 
mode=block]}
Payload: {"type":"XXXXX","title":"Unhandled Error","status":500,"detail":"Maybe 
more than one part sent, epilogue is not empty, or CRLF is missing before end 
delimiter ? 4 bytes read for file part but 2 expected according to 
content-length header."}
{noformat}
After a bit of digging, I realized that the problem lies in the 
writeAttachments method of the AttachmentSerializer class:
{code:java}
StringWriter writer = new StringWriter();                
writer.write("\r\n--");
writer.write(bodyBoundary);
writer.write("--"); // <--- HERE
out.write(writer.getBuffer().toString().getBytes(encoding));
out.flush();
{code}
I was able to correct my problem locally by making this correction:
{code:java}
StringWriter writer = new StringWriter();                
writer.write("\r\n--");
writer.write(bodyBoundary);
writer.write("--\r\n"); // <------ fixing her
out.write(writer.getBuffer().toString().getBytes(encoding));
out.flush();
{code}
And the call succeeds with a 201 code and a JSON response as expected

However, I'm dubious about stumbling across such an error, so I wonder if I've 
missed something?

Sincerely

  was:
Hello,

I'm contacting you because I'm experiencing a problem that seems to be a bug 
when calling a REST service in multipart mode via jarxr-client in proxy mode. 
I'm working with version 3.1.4 but I've also tested with version 3.5.7 (Unable 
to use a more recent version for technical reasons).
h2. Description of the problem:
h3. Current code:

I have an interace containing the following signature:
{code:java}
@Consumes({ "multipart/form-data" })
@Produces({ "application/json" })
FileId create(MultipartBody body);
{code}
Then code to call the service (code from an integration test):
{code:java}
@Resource(name = "myApi") // defined in a spring context with jaxrs:client
private MyApi api;

@Test
public void addContent() {
    final Attachment file = new Attachment("file", 
MimeTypeUtils.TEXT_PLAIN_VALUE, IOUtils.toInputStream("TEST"));
    final MultipartBody body = new MultipartBody(file);
    final FileId result = api.create(body);
    assertNotNull(result);
}
{code}
h3. Result obtained:

I obtain the following trace:
{noformat}
INFOS: Outbound Message
---------------------------
ID: 1
Address: https://XXXXXXXXXXXXXXXXXX/file
Http-Method: POST
Content-Type: multipart/form-data; 
boundary="uuid:e8db85d9-f27e-4220-97c6-3f5ec4c3e08f"
Headers: {Accept=[application/json], Authorization=[Bearer 
XXXXXXXXXXXXXXXXXXXX]}
Payload: --uuid:e8db85d9-f27e-4220-97c6-3f5ec4c3e08f
Content-Type: text/plain
Content-Transfer-Encoding: binary
Content-ID: <fichier>

TEST
--uuid:e8db85d9-f27e-4220-97c6-3f5ec4c3e08f--
{noformat}
... and the webservice response:
{noformat}
--------------------------------------
févr. 02, 2024 10:02:50 AM org.apache.cxf.interceptor.LoggingInInterceptor
INFOS: Inbound Message
----------------------------
ID: 1
Response-Code: 500
Encoding: ISO-8859-1
Content-Type: application/json
Headers: {cache-control=[no-cache, no-store, max-age=0, must-revalidate], 
Content-Length=[7930], content-type=[application/json], date=[Fri, 2 Feb 2024 
09:02:50 GMT], expires=[0], pragma=[no-cache], 
x-content-type-options=[nosniff], x-frame-options=[DENY], x-xss-protection=[1; 
mode=block]}
Payload: {"type":"XXXXX","title":"Unhandled Error","status":500,"detail":"Maybe 
more than one part sent, epilogue is not empty, or CRLF is missing before end 
delimiter ? 4 bytes read for file part but 2 expected according to 
content-length header."}
{noformat}
After a bit of digging, I realized that the problem lies in the 
writeAttachments method of the AttachmentSerializer class:
{code:java}
StringWriter writer = new StringWriter();                
writer.write("\r\n--");
writer.write(bodyBoundary);
writer.write("--"); // <--- HERE
out.write(writer.getBuffer().toString().getBytes(encoding));
out.flush();
{code}
I was able to correct my problem locally by making this correction:
{code:java}
StringWriter writer = new StringWriter();                
writer.write("\r\n--");
writer.write(bodyBoundary);
writer.write("--\r\n"); // <------ fixing her
out.write(writer.getBuffer().toString().getBytes(encoding));
out.flush();
{code}
And the call succeeds with a 201 code and a JSON response as expected

However, I'm dubious about stumbling across such an error, so I wonder if I've 
missed something?

Sincerely


> Missing \r\n in multipart request
> ---------------------------------
>
>                 Key: CXF-8975
>                 URL: https://issues.apache.org/jira/browse/CXF-8975
>             Project: CXF
>          Issue Type: Bug
>          Components: JAX-RS
>    Affects Versions: 3.1.4, 3.5.7
>            Reporter: Guillaume Chauvet
>            Priority: Major
>
> Hello,
> I'm contacting you because I'm experiencing a problem that seems to be a bug 
> when calling a REST service in multipart mode via jarxr-client in proxy mode. 
> I'm working with version 3.1.4 but I've also tested with version 3.5.7 
> (Unable to use a more recent version for technical reasons).
> h2. Description of the problem:
> h3. Current code:
> I have an interace containing the following signature:
> {code:java}
> @Consumes({ "multipart/form-data" })
> @Produces({ "application/json" })
> FileId create(MultipartBody body);
> {code}
> Then code to call the service (code from an integration test):
> {code:java}
> @Resource(name = "myApi") // defined in a spring context with jaxrs:client
> private MyApi api;
> @Test
> public void addContent() {
>     final Attachment file = new Attachment("file", 
> MimeTypeUtils.TEXT_PLAIN_VALUE, IOUtils.toInputStream("TEST"));
>     final MultipartBody body = new MultipartBody(file);
>     final FileId result = api.create(body);
>     assertNotNull(result);
> }
> {code}
> h3. Result obtained:
> I obtain the following trace:
> {noformat}
> INFOS: Outbound Message
> ---------------------------
> ID: 1
> Address: https://XXXXXXXXXXXXXXXXXX/file
> Http-Method: POST
> Content-Type: multipart/form-data; 
> boundary="uuid:e8db85d9-f27e-4220-97c6-3f5ec4c3e08f"
> Headers: {Accept=[application/json], Authorization=[Bearer 
> XXXXXXXXXXXXXXXXXXXX]}
> Payload: --uuid:e8db85d9-f27e-4220-97c6-3f5ec4c3e08f
> Content-Type: text/plain
> Content-Transfer-Encoding: binary
> Content-ID: <file>
> TEST
> --uuid:e8db85d9-f27e-4220-97c6-3f5ec4c3e08f--
> {noformat}
> ... and the webservice response:
> {noformat}
> --------------------------------------
> févr. 02, 2024 10:02:50 AM org.apache.cxf.interceptor.LoggingInInterceptor
> INFOS: Inbound Message
> ----------------------------
> ID: 1
> Response-Code: 500
> Encoding: ISO-8859-1
> Content-Type: application/json
> Headers: {cache-control=[no-cache, no-store, max-age=0, must-revalidate], 
> Content-Length=[7930], content-type=[application/json], date=[Fri, 2 Feb 2024 
> 09:02:50 GMT], expires=[0], pragma=[no-cache], 
> x-content-type-options=[nosniff], x-frame-options=[DENY], 
> x-xss-protection=[1; mode=block]}
> Payload: {"type":"XXXXX","title":"Unhandled 
> Error","status":500,"detail":"Maybe more than one part sent, epilogue is not 
> empty, or CRLF is missing before end delimiter ? 4 bytes read for file part 
> but 2 expected according to content-length header."}
> {noformat}
> After a bit of digging, I realized that the problem lies in the 
> writeAttachments method of the AttachmentSerializer class:
> {code:java}
> StringWriter writer = new StringWriter();                
> writer.write("\r\n--");
> writer.write(bodyBoundary);
> writer.write("--"); // <--- HERE
> out.write(writer.getBuffer().toString().getBytes(encoding));
> out.flush();
> {code}
> I was able to correct my problem locally by making this correction:
> {code:java}
> StringWriter writer = new StringWriter();                
> writer.write("\r\n--");
> writer.write(bodyBoundary);
> writer.write("--\r\n"); // <------ fixing her
> out.write(writer.getBuffer().toString().getBytes(encoding));
> out.flush();
> {code}
> And the call succeeds with a 201 code and a JSON response as expected
> However, I'm dubious about stumbling across such an error, so I wonder if 
> I've missed something?
> Sincerely



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

Reply via email to