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

Zagyvai Balazs updated CXF-1653:
--------------------------------

    Attachment: JAXRSUtils.patch

proposed patch

> Deviation from spec: unnecessary check for @ProduceMime of sub-resource 
> locators
> --------------------------------------------------------------------------------
>
>                 Key: CXF-1653
>                 URL: https://issues.apache.org/jira/browse/CXF-1653
>             Project: CXF
>          Issue Type: Bug
>          Components: REST
>    Affects Versions: 2.1
>            Reporter: Zagyvai Balazs
>            Priority: Minor
>         Attachments: JAXRSUtils.patch, test.zip
>
>
> Hi,
> I'm experimenting with restful services, and stumbled upon something that 
> seems to be a deviation from the specification in CXF's implementation of 
> jax-rs: when matching a request to resource methods, CXF tries to match the 
> @ProduceMime value of sub-resource locators with the request's Accept header. 
> See the second condition in the first line of the below code snippet from 
> JAXRSUtils.findTargetMethod():
> if (ori.isSubResourceLocator() && matchMimeTypes(requestType, acceptType, 
> ori)) {
>       candidateList.put(ori, map);
> } else if (ori.getHttpMethod().equalsIgnoreCase(httpMethod)
>                  && matchMimeTypes(requestType, acceptType, ori)) {
> The call to matchMimeTypes() in the first condition is problematic for two 
> reasons:
>   1. (in my understanding) according to the specification, sub-resource 
> locators never has to be filtered by media types. See spec v0.6 
> (https://jsr311.dev.java.net/drafts/spec20080131.pdf) section 2.5: step 2.(d) 
> applies to sub-resource locators, and filters them only by URI template 
> matching. Then the 4th point of step 3.(a) filters methods by matching their 
> @ProduceMime values with the request's Accept header, but at this step we 
> only have resource methods at hand, and no sub-resource locators at all.
>   2. This code introduces a bug by which an NPE will be thrown in the else 
> branch of the above code snippet, when ori is a sub-resource locator, and the 
> if condition in the first line evaluates to false due to mismatching 
> mime-types. In this case ori.getHttpMethod() still returns null, thus 
> ori.getHttpMethod().equalsIgnoreCase(httpMethod) throws an NPE when 
> evaluating the second if. This happens if the first media type in the 
> request's Accept header doesn't match with the @ProduceMime value of the 
> sub-resource locator. (see the attached test-case showing this bug).
> Basically, it doesn't make any sense to annotate a sub-resource locator with 
> @ProduceMime, as it doesn't produce any content, just relays the request to 
> another resource class. The specification confirms this when stating (section 
> 2.4 in spec v0.6): "Application classes can declare the supported request and 
> response media types using the @ProduceMime and @ConsumeMime annotations. 
> These annotations MAY be applied to a resource method, a resource class, or 
> to an entity provider..." The mentioned three things don't include 
> sub-resource locators according to the terminology in section 1.5.
> Ok, sorry for the longish description, I just wanted to propose the attached 
> patch removing the matchMimeTypes() call from the first line above.
> Thanks,
> Balazs

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to