[
https://issues.apache.org/jira/browse/CXF-7860?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16636144#comment-16636144
]
ASF GitHub Bot commented on CXF-7860:
-------------------------------------
andymc12 opened a new pull request #453: CXF-7860: Reprocess @FormParam parms
so they contain the latest data
URL: https://github.com/apache/cxf/pull/453
This addresses an issue surfaced by the Jakarta JAX-RS API community in
Issue [659](https://github.com/eclipse-ee4j/jaxrs-api/issues/659) where a
parameter marked as `@FormParam` may be injected with a value that is
inconsistent with an entity `Form` parameter. The latter will have the latest
contents of the HTTP form body stream whereas the former will not -
modifications made to the HTTP form body during filters or interceptors will be
lost, thus it is possible that the following code would fail:
```
@POST
public Response processForm(@FormParam("value") String value, Form form) {
assertEquals(value, form.asMap().getFirst("value"));
}
```
This change ensures that the `@FormParam` parameters will match the values
in the `Form` parameter. There is probably an optimization that I am missing
that would only perform this logic if the input stream were modified -
suggestions welcome on how I could best do this. Thanks!
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]
> JAX-RS @FormParam parameters are not updated when form content is modified
> --------------------------------------------------------------------------
>
> Key: CXF-7860
> URL: https://issues.apache.org/jira/browse/CXF-7860
> Project: CXF
> Issue Type: Bug
> Components: JAX-RS
> Affects Versions: 3.2.6
> Reporter: Andy McCright
> Assignee: Andy McCright
> Priority: Major
>
> The JAX-RS community noticed a difference in behavior between CXF and
> Jersey/RESTEasy where form data in the HTTP body is modified prior to
> invoking the resource method. There are two differences noted:
> 1) CXF does not invoke a MessageBodyReader (or any ReaderInterceptors) when
> there is no entity parameter. I believe that this is proper behavior - or at
> least an appropriate optimization since there is no parameter, why bother
> creating one with a MBR (and it's associated ReaderInterceptors)?
> 2) When the resource method contains both a Form parameter (entity) _and_ a
> parameter annotated with `@FormParam`, and a Filter or interceptor, etc. has
> modified the content of of the HTTP body, the value injected for the
> `@FormParam` parameter does not reflect those modifications, but the Form
> entity parameter does. This seems inconsistent, and (IMO) violates the
> spirit of the spec - note that there is no TCK test for this case, so CXF is
> still compliant - but it differs from other implementations. Here is an
> example:
>
>
> {code:java}
> @Provider
> public class FormReaderInterceptor implements ReaderInterceptor {
> private static final Logger LOG =
> LogUtils.getL7dLogger(FormReaderInterceptor.class);
> @Override
> public Object aroundReadFrom(ReaderInterceptorContext ctx) throws
> IOException, WebApplicationException {
> BufferedReader br = new BufferedReader(new
> InputStreamReader(ctx.getInputStream()));
> String line;
> while ((line = br.readLine()) != null) {
> LOG.info("readLine: " + line);
> }
> ByteArrayInputStream bais = new
> ByteArrayInputStream("value=MODIFIED".getBytes());
> ctx.setInputStream(bais);
> return ctx.proceed();
> }
> }
> {code}
>
> {code:java}
> @POST
> public Response processForm(@FormParam("value") String value, Form form)
> {...
> {code}
>
> If the HTTP request body contains "value=ORIGINAL", then when CXF invokes the
> processForm method, it will pass "ORIGINAL" to the String value, but will
> pass a Form object that contains a MultivaluedMap with entry
> "value=MODIFIED". To be consistent with Jersey and RESTEasy, CXF should
> inject MODIFIED as the String value.
>
> See JAX-RS API [Issue
> 659|https://github.com/eclipse-ee4j/jaxrs-api/issues/659] for more details.
>
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)