You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@cxf.apache.org by Mark Struberg <st...@yahoo.de.INVALID> on 2017/03/09 14:45:41 UTC

Re: MediaType matching question

Since there was no obvious movement over in JAX-RS I added a comment on the ticket as well

txs and LieGrue,
strub

> Am 09.12.2016 um 20:55 schrieb Sergey Beryozkin <sb...@gmail.com>:
> 
> Hi Mark, oops,
> sorry for the doubt earlier, but it looks like an obvious bug which CXF has not have :-), hence my doubt.
> I've reproduced it, and indeed I agree it is not a CXF but the actual API bug, I've reproduced it:
> 
> type.equals(MEDIA_TYPE_WILDCARD) || other.type.equals(MEDIA_TYPE_WILDCARD
> 
> This statement makes sense for many cases but I agree it will confuse anyone who will see 'application/octet-stream' matching with '*/*+json'.
> 
> The problem is, it may be tricky convince the group it is a bug.
> Lets give it a try:
> 
> https://java.net/jira/browse/JAX_RS_SPEC-538
> (please vote and/or comment)
> 
> 
> It does make sense to have
> 
> 
> (type.equals(MEDIA_TYPE_WILDCARD) || other.type.equals(MEDIA_TYPE_WILDCARD) &&
> 
> 
> (subtype.equals(MEDIA_TYPE_WILDCARD) || other.subtype.equals(MEDIA_TYPE_WILDCARD)
> 
> At the moment consider having something like "application/*+json" instead of "*/*+json"
> 
> 
> Thanks, Sergey
> 
> On 09/12/16 18:47, Mark Struberg wrote:
>> Yes it does, but it doesn't seem to be a CXF bug. The bug is in the RI API (and in geronimo we ported the logic 1:1).
>> I'm also not sure if this is a 'bug' in the API or in the spec.
>> 
>> From a user pov it seems counter intuitive at least.
>> 
>> LieGrue,
>> strub
>> 
>>> Am 09.12.2016 um 18:22 schrieb Sergey Beryozkin <sb...@gmail.com>:
>>> 
>>> Hmm,
>>> are you saying CXF will match "*/*+json" against application/octet-stream ? I have to sign off right now, but I honestly doubt it, I'll check later on.
>>> 
>>> 
>>> Thanks, Sergey
>>> 
>>> 
>>> 
>>> On 09/12/16 17:11, Mark Struberg wrote:
>>>>> Do you expect a "*/*+json" match the application/octet-stream ?
>>>> 
>>>> 
>>>> No, I did not expect that. But that's exactly how the code of MediaType#isCompatible behaves currently :(
>>>> 
>>>> 
>>>> 
>>>> LieGrue,
>>>> strub
>>>> 
>>>> 
>>>> 
>>>> 
>>>>> On Friday, 9 December 2016, 17:24, Sergey Beryozkin <sb...@gmail.com> wrote:
>>>>>> Hi Mark, welcome,
>>>>> 
>>>>> Do you expect a "*/*+json" match the application/octet-stream ?
>>>>> And how is the method parameter accepting a multipart payload is typed,
>>>>> as InputStream ?
>>>>> 
>>>>> As a side note with WebClient you can use a more dedicated Attachment
>>>>> code but on the server side, if you need to stay 100% compliant, then
>>>>> yes, you;d need to read from InputStream and parse the payload manually
>>>>> - CXF MultipartProvider will not touch it unless it is annotated with a
>>>>> CXF specific annotation
>>>>> 
>>>>> Cheers, Sergey
>>>>> 
>>>>> 
>>>>> On 09/12/16 16:17, Mark Struberg wrote:
>>>>>> While debugging through this didn't get used as far as I remember.
>>>>>> 
>>>>>> Maybe MultipartProvider uses an alternative path to detect the handlers?
>>>>>> 
>>>>>> LieGrue,
>>>>>> strub
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>>> On Friday, 9 December 2016, 17:15, Romain Manni-Bucau
>>>>> <rm...@gmail.com> wrote:
>>>>>>>> Hey Mark,
>>>>>>> 
>>>>>>> have a look
>>>>>>> to
>>>>> org.apache.cxf.jaxrs.provider.ProviderFactory.MessageBodyWriterComparator
>>>>>>> (and the reader companion) maybe. Got aligned in cxf "jaxrs
>>>>> 2" for
>>>>>>> spec
>>>>>>> alignment
>>>>>>> 
>>>>>>> 
>>>>>>> Romain Manni-Bucau
>>>>>>> @rmannibucau <https://twitter.com/rmannibucau> |  Blog
>>>>>>> <https://blog-rmannibucau.rhcloud.com> | Old Blog
>>>>>>> <http://rmannibucau.wordpress.com> | Github
>>>>>>> <https://github.com/rmannibucau> |
>>>>>>> LinkedIn <https://www.linkedin.com/in/rmannibucau> | JavaEE
>>>>> Factory
>>>>>>> <https://javaeefactory-rmannibucau.rhcloud.com>
>>>>>>> 
>>>>>>> 
>>>>>>> 2016-12-09 17:10 GMT+01:00 Mark Struberg
>>>>> <st...@yahoo.de.invalid>:
>>>>>>> 
>>>>>>>> good evening!
>>>>>>>> 
>>>>>>>> My first post to CXF, so I excuse if I ask something obvious ;)
>>>>>>>> 
>>>>>>>> We have the following code over in Apache OpenWebBeans /
>>>>> Meecrowave:
>>>>>>>> 
>>>>>>>> @Produces({
>>>>>>>>         "application/json", "*/json",
>>>>>>>>         "*/*+json", "*/x-json",
>>>>>>>>         "*/javascript", "*/x-javascript"
>>>>>>>> })
>>>>>>>> @Consumes({
>>>>>>>>         "application/json", "*/json",
>>>>>>>>         "*/*+json", "*/x-json",
>>>>>>>>         "*/javascript", "*/x-javascript"
>>>>>>>> })
>>>>>>>> public static class ConfiguredJsonbJaxrsProvider<T> extends
>>>>>>>> JsonbJaxrsProvider<T> {
>>>>>>>> 
>>>>>>>> I tried to use the CXF WebClient to send a multipart form with a
>>>>> file
>>>>>>>> attachment. MediaType is application/octet-stream.
>>>>>>>> Sadly I always triggered our Johnzon JSONB provider
>>>>> (johnzon.apache.org).
>>>>>>>> 
>>>>>>>> The reason is that */json seems to match ANY other MediaType,
>>>>> regardless
>>>>>>>> of the subtype. Is this intended?
>>>>>>>> The code I found during debugging is the following in
>>>>> geronimo-jaxrs_2.0
>>>>>>>> MediaType:
>>>>>>>> 
>>>>>>>> public boolean isCompatible(MediaType other) {
>>>>>>>>     return other != null &&
>>>>> (type.equals(MEDIA_TYPE_WILDCARD) ||
>>>>>>>> other.type.equals(MEDIA_TYPE_WILDCARD) ||
>>>>>>>>         (type.equalsIgnoreCase(other.type) &&
>>>>>>> (subtype.equals(MEDIA_TYPE_WILDCARD)
>>>>>>>> || other.subtype.equals(MEDIA_TYPE_WILDCARD))) ||
>>>>>>>>         (type.equalsIgnoreCase(other.type) &&
>>>>>>>> this.subtype.equalsIgnoreCase(other.subtype)));
>>>>>>>> }
>>>>>>>> 
>>>>>>>> 
>>>>>>>> I'm geronimo PMC myself so I can even fix it. But would need
>>>>> some
>>>>>>> feedback
>>>>>>>> how it should behave.
>>>>>>>> https://svn.apache.org/repos/asf/geronimo/specs/trunk/
>>>>>>>> geronimo-jaxrs_2.0_spec/
>>>>>>>> 
>>>>>>>> I did a quick look at the RI and now I'm even more confused:
>>>>>>>> 
>>>>>>>>     public boolean isCompatible(MediaType other) {
>>>>>>>>         return other != null && // return false if other
>>>>> is null,
>>>>>>> else
>>>>>>>>                 (type.equals(MEDIA_TYPE_WILDCARD) ||
>>>>>>>> other.type.equals(MEDIA_TYPE_WILDCARD) || // both are wildcard
>>>>> types, or
>>>>>>>>                         (type.equalsIgnoreCase(other.type)
>>>>> &&
>>>>>>>> (subtype.equals(MEDIA_TYPE_WILDCARD)
>>>>>>>>                                 ||
>>>>>>> other.subtype.equals(MEDIA_TYPE_WILDCARD)))
>>>>>>>> || // same types, wildcard sub-types, or
>>>>>>>>                         (type.equalsIgnoreCase(other.type)
>>>>> &&
>>>>>>>> this.subtype.equalsIgnoreCase(other.subtype))); // same types
>>>>> &
>>>>>>> sub-types
>>>>>>>>     }
>>>>>>>> 
>>>>>>>> It says "both are wildcard types" but the code is
>>>>> actually ONE of
>>>>>>> them is
>>>>>>>> a wildcard type, isn't?
>>>>>>>>  (type.equals(MEDIA_TYPE_WILDCARD) ||
>>>>>>> other.type.equals(MEDIA_TYPE_WILDCARD)
>>>>>>>> || // both are wildcard types, or
>>>>>>>> 
>>>>>>>> 
>>>>>>>> Any hints are highly welcome, my head is already hurting...
>>>>>>>> 
>>>>>>>> What are the actual rules for matching MediaTypes? What does the
>>>>> spec
>>>>>>>> define?
>>>>>>>> 
>>>>>>>> txs and LieGrue,
>>>>>>>> strub
>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>> 
>>>>> 
>>>>> 
>>>>> --
>>>>> 
>>> 
>>> 
>>> --
>>> Sergey Beryozkin
>>> 
>>> Talend Community Coders
>>> http://coders.talend.com/
>> 
> 
> 
> -- 
> Sergey Beryozkin
> 
> Talend Community Coders
> http://coders.talend.com/


Re: MediaType matching question

Posted by Sergey Beryozkin <sb...@gmail.com>.
Hi Mark

Thanks; sorry there's no progress there, it is a spec issue and hence 
the best we can get there is to have it addressed for 2.1. Having you 
commenting there is good as it shows the issue is really affecting some 
users.

Can we think of some workarounds ? Can you temporarily add some 
protection code to isReadable() of your provider, where it will check if 
a media subtype contains 'json' - if no then isReadable will return false ?

Sergey


On 09/03/17 14:45, Mark Struberg wrote:
> Since there was no obvious movement over in JAX-RS I added a comment on the ticket as well
>
> txs and LieGrue,
> strub
>
>> Am 09.12.2016 um 20:55 schrieb Sergey Beryozkin <sb...@gmail.com>:
>>
>> Hi Mark, oops,
>> sorry for the doubt earlier, but it looks like an obvious bug which CXF has not have :-), hence my doubt.
>> I've reproduced it, and indeed I agree it is not a CXF but the actual API bug, I've reproduced it:
>>
>> type.equals(MEDIA_TYPE_WILDCARD) || other.type.equals(MEDIA_TYPE_WILDCARD
>>
>> This statement makes sense for many cases but I agree it will confuse anyone who will see 'application/octet-stream' matching with '*/*+json'.
>>
>> The problem is, it may be tricky convince the group it is a bug.
>> Lets give it a try:
>>
>> https://java.net/jira/browse/JAX_RS_SPEC-538
>> (please vote and/or comment)
>>
>>
>> It does make sense to have
>>
>>
>> (type.equals(MEDIA_TYPE_WILDCARD) || other.type.equals(MEDIA_TYPE_WILDCARD) &&
>>
>>
>> (subtype.equals(MEDIA_TYPE_WILDCARD) || other.subtype.equals(MEDIA_TYPE_WILDCARD)
>>
>> At the moment consider having something like "application/*+json" instead of "*/*+json"
>>
>>
>> Thanks, Sergey
>>
>> On 09/12/16 18:47, Mark Struberg wrote:
>>> Yes it does, but it doesn't seem to be a CXF bug. The bug is in the RI API (and in geronimo we ported the logic 1:1).
>>> I'm also not sure if this is a 'bug' in the API or in the spec.
>>>
>>> From a user pov it seems counter intuitive at least.
>>>
>>> LieGrue,
>>> strub
>>>
>>>> Am 09.12.2016 um 18:22 schrieb Sergey Beryozkin <sb...@gmail.com>:
>>>>
>>>> Hmm,
>>>> are you saying CXF will match "*/*+json" against application/octet-stream ? I have to sign off right now, but I honestly doubt it, I'll check later on.
>>>>
>>>>
>>>> Thanks, Sergey
>>>>
>>>>
>>>>
>>>> On 09/12/16 17:11, Mark Struberg wrote:
>>>>>> Do you expect a "*/*+json" match the application/octet-stream ?
>>>>>
>>>>>
>>>>> No, I did not expect that. But that's exactly how the code of MediaType#isCompatible behaves currently :(
>>>>>
>>>>>
>>>>>
>>>>> LieGrue,
>>>>> strub
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>> On Friday, 9 December 2016, 17:24, Sergey Beryozkin <sb...@gmail.com> wrote:
>>>>>>> Hi Mark, welcome,
>>>>>>
>>>>>> Do you expect a "*/*+json" match the application/octet-stream ?
>>>>>> And how is the method parameter accepting a multipart payload is typed,
>>>>>> as InputStream ?
>>>>>>
>>>>>> As a side note with WebClient you can use a more dedicated Attachment
>>>>>> code but on the server side, if you need to stay 100% compliant, then
>>>>>> yes, you;d need to read from InputStream and parse the payload manually
>>>>>> - CXF MultipartProvider will not touch it unless it is annotated with a
>>>>>> CXF specific annotation
>>>>>>
>>>>>> Cheers, Sergey
>>>>>>
>>>>>>
>>>>>> On 09/12/16 16:17, Mark Struberg wrote:
>>>>>>> While debugging through this didn't get used as far as I remember.
>>>>>>>
>>>>>>> Maybe MultipartProvider uses an alternative path to detect the handlers?
>>>>>>>
>>>>>>> LieGrue,
>>>>>>> strub
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>> On Friday, 9 December 2016, 17:15, Romain Manni-Bucau
>>>>>> <rm...@gmail.com> wrote:
>>>>>>>>> Hey Mark,
>>>>>>>>
>>>>>>>> have a look
>>>>>>>> to
>>>>>> org.apache.cxf.jaxrs.provider.ProviderFactory.MessageBodyWriterComparator
>>>>>>>> (and the reader companion) maybe. Got aligned in cxf "jaxrs
>>>>>> 2" for
>>>>>>>> spec
>>>>>>>> alignment
>>>>>>>>
>>>>>>>>
>>>>>>>> Romain Manni-Bucau
>>>>>>>> @rmannibucau <https://twitter.com/rmannibucau> |  Blog
>>>>>>>> <https://blog-rmannibucau.rhcloud.com> | Old Blog
>>>>>>>> <http://rmannibucau.wordpress.com> | Github
>>>>>>>> <https://github.com/rmannibucau> |
>>>>>>>> LinkedIn <https://www.linkedin.com/in/rmannibucau> | JavaEE
>>>>>> Factory
>>>>>>>> <https://javaeefactory-rmannibucau.rhcloud.com>
>>>>>>>>
>>>>>>>>
>>>>>>>> 2016-12-09 17:10 GMT+01:00 Mark Struberg
>>>>>> <st...@yahoo.de.invalid>:
>>>>>>>>
>>>>>>>>> good evening!
>>>>>>>>>
>>>>>>>>> My first post to CXF, so I excuse if I ask something obvious ;)
>>>>>>>>>
>>>>>>>>> We have the following code over in Apache OpenWebBeans /
>>>>>> Meecrowave:
>>>>>>>>>
>>>>>>>>> @Produces({
>>>>>>>>>         "application/json", "*/json",
>>>>>>>>>         "*/*+json", "*/x-json",
>>>>>>>>>         "*/javascript", "*/x-javascript"
>>>>>>>>> })
>>>>>>>>> @Consumes({
>>>>>>>>>         "application/json", "*/json",
>>>>>>>>>         "*/*+json", "*/x-json",
>>>>>>>>>         "*/javascript", "*/x-javascript"
>>>>>>>>> })
>>>>>>>>> public static class ConfiguredJsonbJaxrsProvider<T> extends
>>>>>>>>> JsonbJaxrsProvider<T> {
>>>>>>>>>
>>>>>>>>> I tried to use the CXF WebClient to send a multipart form with a
>>>>>> file
>>>>>>>>> attachment. MediaType is application/octet-stream.
>>>>>>>>> Sadly I always triggered our Johnzon JSONB provider
>>>>>> (johnzon.apache.org).
>>>>>>>>>
>>>>>>>>> The reason is that */json seems to match ANY other MediaType,
>>>>>> regardless
>>>>>>>>> of the subtype. Is this intended?
>>>>>>>>> The code I found during debugging is the following in
>>>>>> geronimo-jaxrs_2.0
>>>>>>>>> MediaType:
>>>>>>>>>
>>>>>>>>> public boolean isCompatible(MediaType other) {
>>>>>>>>>     return other != null &&
>>>>>> (type.equals(MEDIA_TYPE_WILDCARD) ||
>>>>>>>>> other.type.equals(MEDIA_TYPE_WILDCARD) ||
>>>>>>>>>         (type.equalsIgnoreCase(other.type) &&
>>>>>>>> (subtype.equals(MEDIA_TYPE_WILDCARD)
>>>>>>>>> || other.subtype.equals(MEDIA_TYPE_WILDCARD))) ||
>>>>>>>>>         (type.equalsIgnoreCase(other.type) &&
>>>>>>>>> this.subtype.equalsIgnoreCase(other.subtype)));
>>>>>>>>> }
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> I'm geronimo PMC myself so I can even fix it. But would need
>>>>>> some
>>>>>>>> feedback
>>>>>>>>> how it should behave.
>>>>>>>>> https://svn.apache.org/repos/asf/geronimo/specs/trunk/
>>>>>>>>> geronimo-jaxrs_2.0_spec/
>>>>>>>>>
>>>>>>>>> I did a quick look at the RI and now I'm even more confused:
>>>>>>>>>
>>>>>>>>>     public boolean isCompatible(MediaType other) {
>>>>>>>>>         return other != null && // return false if other
>>>>>> is null,
>>>>>>>> else
>>>>>>>>>                 (type.equals(MEDIA_TYPE_WILDCARD) ||
>>>>>>>>> other.type.equals(MEDIA_TYPE_WILDCARD) || // both are wildcard
>>>>>> types, or
>>>>>>>>>                         (type.equalsIgnoreCase(other.type)
>>>>>> &&
>>>>>>>>> (subtype.equals(MEDIA_TYPE_WILDCARD)
>>>>>>>>>                                 ||
>>>>>>>> other.subtype.equals(MEDIA_TYPE_WILDCARD)))
>>>>>>>>> || // same types, wildcard sub-types, or
>>>>>>>>>                         (type.equalsIgnoreCase(other.type)
>>>>>> &&
>>>>>>>>> this.subtype.equalsIgnoreCase(other.subtype))); // same types
>>>>>> &
>>>>>>>> sub-types
>>>>>>>>>     }
>>>>>>>>>
>>>>>>>>> It says "both are wildcard types" but the code is
>>>>>> actually ONE of
>>>>>>>> them is
>>>>>>>>> a wildcard type, isn't?
>>>>>>>>>  (type.equals(MEDIA_TYPE_WILDCARD) ||
>>>>>>>> other.type.equals(MEDIA_TYPE_WILDCARD)
>>>>>>>>> || // both are wildcard types, or
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Any hints are highly welcome, my head is already hurting...
>>>>>>>>>
>>>>>>>>> What are the actual rules for matching MediaTypes? What does the
>>>>>> spec
>>>>>>>>> define?
>>>>>>>>>
>>>>>>>>> txs and LieGrue,
>>>>>>>>> strub
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>>
>>>>
>>>>
>>>> --
>>>> Sergey Beryozkin
>>>>
>>>> Talend Community Coders
>>>> http://coders.talend.com/
>>>
>>
>>
>> --
>> Sergey Beryozkin
>>
>> Talend Community Coders
>> http://coders.talend.com/
>


-- 
Sergey Beryozkin

Talend Community Coders
http://coders.talend.com/