Ok. In trunk, I relaxed the list of possible REST methods. I am not sure 
this is the right solution.

Is there a comprehensive list of all possible REST methods somewhere?

massimo


On Thursday, 19 September 2013 21:13:08 UTC-5, Bernard Letourmy wrote:
>
> Workaround found.
> After digging a little bit more yesterday,  we found out the restful 
> Request handler in gluon/globals.py actually filtered the OPTIONS http verb.
> Rejecting it with a 400 http exception. Thus the CORS preflight request 
> sent by the browser never reached our code in controller.
> The browser getting an error when sending OPTIONS request (with the 
> Access-Control-Request-Method=PUT header for ex.) considers the Cross 
> origin PUT request is not allowed and then never proceed with the actual 
> PUT.
>
> So here is what we did:
> - In globals.py (v 2.5.1 but also applies to 2.6.3)
>
> diff globals.py ~/git/web2py/gluon/globals.py
>     153,154c152,153
>
>     <                     if not method in ['GET', 'POST', 'DELETE', 'PUT'
> , 'OPTIONS']:
>     <                         raise HTTP(400, "invalid method")
>     ---
>     >                 if not method in ['GET', 'POST', 'DELETE', 'PUT']:
>     >                     raise HTTP(400, "invalid method")
>
>
>
> Then in our controller added handler for the OPTIONS verb also
>
> @request.restful()
> def rest():
>     #import pdb;pdb.set_trace()
>     response.view = 'generic.'+request.extension
>     def GET(*args,**vars):
>         patterns = 'auto'
>         parser = db.parse_as_rest(patterns,args,vars)
>         if parser.status == 200:
>             return dict(content=parser.response)
>         else:
>             raise HTTP(parser.status,parser.error)
>     def POST(table_name,**vars):
>         return db[table_name].validate_and_insert(**vars)
>     def PUT(table_name,record_id,**vars):
>         return db(db[table_name]._id==record_id).update(**vars)
>     def DELETE(table_name,record_id):
>         print "DELETE called"
>         return db(db[table_name]._id==record_id).delete()
>     def OPTIONS(*args,**vars):
>         print "OPTION called"
>         return True
>     
>     return dict(GET=GET, POST=POST, PUT=PUT, DELETE=DELETE, OPTIONS=
> OPTIONS) 
>
>
>
> Any suggestion of how to do without patching web2py, wsgi middleware maybe 
>  ?
>
> How about implementing CORS support in a more generic way in web2py ?
>
> Thanks
> Bernard (Kanesh's colleague)
>

-- 
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
--- 
You received this message because you are subscribed to the Google Groups 
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to web2py+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to