At some point, we're going to need to try some experiments with a
browser and make sure that whatever it is we've done actually works.
Unfortunately, htmlunit doesn't have this client side yet (I'm working
on a patch). I suppose I should read the source of Chromium or
something, unless you beat me to it.

On Mon, Dec 5, 2011 at 11:04 AM, Sergey Beryozkin <sberyoz...@gmail.com> wrote:
> On 05/12/11 16:00, Benson Margulies wrote:
>>
>> On Mon, Dec 5, 2011 at 10:42 AM, Sergey Beryozkin<sberyoz...@gmail.com>
>>  wrote:
>>>
>>> Hi
>>>
>>> On 05/12/11 15:15, Sergey Beryozkin wrote:
>>>>
>>>>
>>>> On 05/12/11 13:23, Benson Margulies wrote:
>>>>>
>>>>>
>>>>> On Mon, Dec 5, 2011 at 7:15 AM, Sergey Beryozkin<sberyoz...@gmail.com>
>>>>> wrote:
>>>>>>
>>>>>>
>>>>>> Hi Benson, all
>>>>>>
>>>>>> At the moment the in CORS filter returns 'null' during a preflight
>>>>>> check,
>>>>>> whenever some check fails, which means that most likely an HTTP
>>>>>> status code
>>>>>> will be returned to do with failure at the selection algorithm stage,
>>>>>> but
>>>>>> that status code may not necessarily to be the one expected by the
>>>>>> CORS
>>>>>> client ? I'm wondering of we should return some more specific HTTP
>>>>>> status
>>>>>> code instead of depending on the runtime to eventually fail this
>>>>>> preflight
>>>>>> request.
>>>>>
>>>>>
>>>>>
>>>>> Maybe I don't understand filters.
>>>>>
>>>>> The cors spec never, ever, calls for failing the overall HTTP request.
>>>>> It calls for adding extra headers if the request is good, and not
>>>>> adding them if it is bad, and otherwise leaving it alone.
>>>>
>>>>
>>>> Are you referring to the actual request which follows a preflight
>>>> request
>>>> ?
>>>>
>>>> I'm looking at [1] and I'm not sure how does the client (browser ?) can
>>>> decide that a preflight request was not successful.
>>>>
>>>> The filter returns Response.ok().build() in the end of the preflight
>>>> check, which indeed will let the out CORS filter to finalize the
>>>> preflight response but in cases where the preflight check was not good
>>>> then I believe a random HTTP error status will be returned depending on
>>>> where the selection algorithm fails afterwards (may be it is a path
>>>> mismatch or unexpected verb/content-type/accept-type).
>>>>
>>> I can see the out filter sets certain values
>>> in case of a preflight response - but it can only guess that the
>>> preflight
>>> took place only if the in filter managed to reach the end of its
>>> preflight
>>> processing.
>>>
>>> I guess we need to set a message with a "preflight" and return
>>> Response.ok().build() in all the branches in the in preflight handler,
>>> right ?
>>
>>
>>
>> That's exactly what I'm trying to sort out with the w3c mailing list.
>> There are two cases:
>>
>> 1) There's an @OPTIONS method that applies. In this case, it seems
>> pretty clear to me that the appropriate response is whatever comes
>> from the @OPTIONS method.
>>
> +1
>
>
>> 2) There's no @OPTIONS method. In this case, I'm leaning to returning
>> an OK whether the preflight algorithm succeeds or fails, on the
>> grounds that the server successfully handled the OPTIONS -- and the
>> returned headers are the information the client was looking for.
>>
> I think it is still 410 - it does not matter to the client side why it is
> 410 (network/domain error or a custom preflight check error), either way
> it's a failure, but I'll pause a bit :-)
>
> Cheers, SErgey
>
>
>>
>>>
>>>>
>>>>
>>>>>
>>>>> Now, we could design a unified JAX-RS security feature that
>>>>> incorporated CORS as part of its job. It could, if asked, fail
>>>>> requests if they failed to meet the requirements.
>>>>>
>>>
>>> By the way, I start thinking we should move this code to its own
>>> rs/security/cors because it is really about the security and something
>>> tells
>>> me some more code will come :-)
>>
>>
>> no argument.
>>
>>>
>>> Cheers, Sergey
>>>
>>>
>>>>
>>>> [1] http://www.w3.org/TR/cors/
>>>>
>>>>>>
>>>>>> The other question which we've discussed with Benson is what to do in
>>>>>> the
>>>>>> case like this:
>>>>>>
>>>>>> @Path("/somepath")
>>>>>> public class Resource {
>>>>>> @GET
>>>>>> @Produces("application/xml")
>>>>>> public Book getXML() {}
>>>>>>
>>>>>> @GET
>>>>>> @Produces("application/json")
>>>>>> public Book getXML() {}
>>>>>> }
>>>>>>
>>>>>> The info CORS provides is sufficient enough to select either of the
>>>>>> the
>>>>>> above 2 methods thus the question is what to do at the preflight
>>>>>> check.
>>>>>> In this case we thought we can expect a
>>>>>> CrossResourceSharingAnnotation being
>>>>>> added to the 'good' method, or even to the all of them, possibly uing
>>>>>> a
>>>>>> class-level annotation:
>>>>>>
>>>>>> @Path("/somepath")
>>>>>> @CrossResourceSharingAnnotation(...)
>>>>>> public class Resource {
>>>>>> @GET
>>>>>> @Produces("application/xml")
>>>>>> public Book getXML() {}
>>>>>>
>>>>>> @GET
>>>>>> @Produces("application/json")
>>>>>> public Book getXML() {}
>>>>>> }
>>>>>>
>>>>>> or in case of POST:
>>>>>>
>>>>>> @Path("/somepath")
>>>>>> public class Resource {
>>>>>> @POST
>>>>>> @Consumes("application/xml")
>>>>>> @CrossResourceSharingAnnotation(...)
>>>>>> public void addXML(Book) {}
>>>>>>
>>>>>> @POST
>>>>>> @Consumes("multipart/form-data")
>>>>>> public void upload(MultipartBody) {}
>>>>>> }
>>>>>>
>>>>>> We can also think of some configuration tricks.
>>>>>> Ex, if the consumer does know that only an upload POST method is
>>>>>> 'valid'
>>>>>> then we can configure a CORS filter with the acceptType value which
>>>>>> will be
>>>>>> passed on to the JAXRS runtime to confirm that such a method actually
>>>>>> exists
>>>>>>
>>>>>> For the record, as agreed with Benson, I updated the filter to
>>>>>> delegate to
>>>>>> the runtime to find a valid matching method during a preflight check
>>>>>> which
>>>>>> is more secure than depending on the custom annotation
>>>>>>
>>>>>> Cheers, Sergey
>>>>>>
>>>>>> --
>>>>>> Sergey Beryozkin
>>>>>>
>>>>>> Talend Community Coders
>>>>>> http://coders.talend.com/
>>>>>>
>>>>>> Blog: http://sberyozkin.blogspot.com
>>>>
>>>>
>>>>
>>>
>>>
>>> --
>>> Sergey Beryozkin
>>>
>>> Talend Community Coders
>>> http://coders.talend.com/
>>>
>>> Blog: http://sberyozkin.blogspot.com

Reply via email to