aiohttp-cors: Problems with aiohttp 3.0.1
This code works fine with aiohttp 2.3.10:
def setup_routes(app):
app.router.add_routes(routes)
setup_swagger(app,
api_base_url='/',
swagger_url='/api/doc',
description='API testing interface',
title='API',
api_version='2.0.0')
cors = aiohttp_cors.setup(app, defaults={
"*": aiohttp_cors.ResourceOptions(
allow_credentials=True,
expose_headers="*",
allow_headers="*",
)
})
for route in list(app.router.routes()):
if not isinstance(route.resource, StaticResource): # <<< WORKAROUND
cors.add(route)
curl -H "Origin: http://example.com" -H "Access-Control-Request-Method: POST" -H "Access-Control-Request-Headers: X-Requested-With" -X OPTIONS --verbose localhost:8080/api/users
* Trying ::1...
* TCP_NODELAY set
* connect to ::1 port 8080 failed: Connection refused
* Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 8080 (#0)
> OPTIONS /api/users HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.58.0
> Accept: */*
> Origin: http://example.com
> Access-Control-Request-Method: POST
> Access-Control-Request-Headers: X-Requested-With
>
< HTTP/1.1 200 OK
< Access-Control-Allow-Origin: http://example.com
< Access-Control-Allow-Credentials: true
< Access-Control-Allow-Methods: POST
< Access-Control-Allow-Headers: X-REQUESTED-WITH
< Content-Length: 0
< Content-Type: application/octet-stream
< Date: Wed, 14 Feb 2018 23:19:55 GMT
< Server: Python/3.6 aiohttp/2.3.10
<
But following (fixed OPTIONS error, adding routes differently) code fails for aiohttp 3.0.1:
# This code fails with:
# RuntimeError: Added route will never be executed, method OPTIONS is already registered
# for route in list(app.router.routes()):
# if not isinstance(route.resource, StaticResource): # <<< WORKAROUND
# cors.add(route)
for resource in app.router.resources():
cors.add(resource)
Same cURL request results in:
* Trying ::1...
* TCP_NODELAY set
* connect to ::1 port 8080 failed: Connection refused
* Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 8080 (#0)
> OPTIONS /api/users HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.58.0
> Accept: */*
> Origin: http://example.com
> Access-Control-Request-Method: POST
> Access-Control-Request-Headers: X-Requested-With
>
< HTTP/1.1 403 Forbidden
< Content-Type: text/plain; charset=utf-8
< Content-Length: 99
< Date: Wed, 14 Feb 2018 23:21:01 GMT
< Server: Python/3.6 aiohttp/3.0.1
<
* Connection #0 to host localhost left intact
CORS preflight request failed: request method 'POST' is not allowed for 'http://example.com' origin
About this issue
- Original URL
- State: open
- Created 6 years ago
- Comments: 29 (7 by maintainers)
Fixed by #160
I’m faced with this issue with POST requests and CORS also, but everything works fine with this code:
Versions:
aiohttp
3.6.2 andaiohttp-cors
0.7.0Maybe this will help someone else with this issue.
Thanks for remember. Yesterday travis was overwhelmed, I forgot to initiate a new release building procedure. Done
Guys, the library has several technical debts. I’ve converted all tests to pytest fixtures usage and replaced
yield from
withasync/await
syntax. Next thing is getting rid of special flag foraiohttp.web.View
support in favor ofisinstance
check. After getting this done the code will be ready to adopting to aiohttp 3. I expect to find a time for it in a week.