Code Monkey home page Code Monkey logo

Comments (29)

asvetlov avatar asvetlov commented on September 2, 2024 4

Fixed by #160

from aiohttp-cors.

kirzharov avatar kirzharov commented on September 2, 2024 2

I'm faced with this issue with POST requests and CORS also, but everything works fine with this code:

from aiohttp_cors import setup as cors_setup, ResourceOptions

...

routes = [
    web.get("/", handle),
    web.post("/something", another_handle),
]

app.router.add_routes(routes)

cors = cors_setup(
    app,
    defaults={
        "*": ResourceOptions(
            allow_credentials=True, expose_headers="*", allow_headers="*",
        )
    },
)

for route in list(app.router.routes()):
    cors.add(route)

Versions: aiohttp 3.6.2 and aiohttp-cors 0.7.0

Maybe this will help someone else with this issue.

from aiohttp-cors.

asvetlov avatar asvetlov commented on September 2, 2024 1

Guys, the library has several technical debts.
I've converted all tests to pytest fixtures usage and replaced yield from with async/await syntax.
Next thing is getting rid of special flag for aiohttp.web.View support in favor of isinstance 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.

from aiohttp-cors.

asvetlov avatar asvetlov commented on September 2, 2024 1

Thanks for remember.
Yesterday travis was overwhelmed, I forgot to initiate a new release building procedure.
Done

from aiohttp-cors.

kamikaze avatar kamikaze commented on September 2, 2024

Actually with the following code CORS doesn't work even for 2.3.10:

    for resource in app.router.resources():
        cors.add(resource)

from aiohttp-cors.

kamikaze avatar kamikaze commented on September 2, 2024

Route definition:

@routes.post('/api/users')
async def create_user(request: Request):
    return web.json_response(status=web.HTTPCreated.status_code)

from aiohttp-cors.

asyd avatar asyd commented on September 2, 2024

We have the issue here, have you found a workaround?

from aiohttp-cors.

asyd avatar asyd commented on September 2, 2024

Ok thanks for your answer!

from aiohttp-cors.

mheppner avatar mheppner commented on September 2, 2024

I hate to be that guy, but will there be a new release to PyPI? I see there was a commit to bump the version, but I don't see it published yet. Thanks :)

from aiohttp-cors.

kamikaze avatar kamikaze commented on September 2, 2024

Having following error:

CORS preflight request failed: request method 'POST' is not allowed for 'http://example.com' origin

with:
aiohttp==3.0.9
aiohttp-cors==0.7.0

same code works for aiohttp 2 and aiohttp-cors 0.6.0. Is there real example of adding routes to cors that do work and was tested?

from aiohttp-cors.

kamikaze avatar kamikaze commented on September 2, 2024

https://github.com/aio-libs/aiohttp-cors/blob/master/aiohttp_cors/urldispatcher_router_adapter.py#L296

Here resource_config.method_config is an empty dict. So if not setting default allow_methods to '*' globally - requests do not work with CORS

from aiohttp-cors.

kamikaze avatar kamikaze commented on September 2, 2024

btw. Adding to cors with both methods doesn't help:

    for resource in app.router.resources():
        cors.add(resource)
    for route in list(app.router.routes()):
        if not isinstance(route.resource, StaticResource):  # <<< WORKAROUND
            cors.add(route)

from aiohttp-cors.

valentinmk avatar valentinmk commented on September 2, 2024

The same for me. Rolled back to aiohttp 2 and aiohttp_cors 0.6.0

from aiohttp-cors.

valentinradu avatar valentinradu commented on September 2, 2024

Same here. aiohttp 2.0 + aiohttp-cors 0.6.0 seems to be a good solution for now.

from aiohttp-cors.

asvetlov avatar asvetlov commented on September 2, 2024

Guys, if somebody wants to provide a PR -- you are welcome.
I'm convinced that the problem exists but have no estimation for the fix.

from aiohttp-cors.

valentinradu avatar valentinradu commented on September 2, 2024

@asvetlov I'll try to look into it over the weekend. Btw, for me, this only happens on localhost, all other places work fine.

from aiohttp-cors.

asvetlov avatar asvetlov commented on September 2, 2024

Cool!

from aiohttp-cors.

valentinmk avatar valentinmk commented on September 2, 2024

I could make some progress to solve this problem.
This problem happens when you tried to name all routes as it recommended by Swagger notation.
And I do not find any fast solution to fix it.
Script to reproduce this problem:

import asyncio
import aiohttp
import aiohttp_cors
from aiohttp.web_runner import GracefulExit


async def handler(request):
    return aiohttp.web.Response(
        text="Hello!",
        headers={
            "X-Custom-Server-Header": "Custom data",
        })

app = aiohttp.web.Application()

cors = aiohttp_cors.setup(app, defaults={
    "http://request-from": aiohttp_cors.ResourceOptions(
            allow_credentials=True,
            expose_headers="*",
            allow_headers="*",
        ),
    })

routes = [{
    'method': 'GET',
    'path': '/test',
    'handler': handler,
    'name': 'test-good'
    }, {
    'method': 'POST',
    'path': '/test',
    'handler': handler,
    'name': 'test-good'
    }, {
    'method': 'GET',
    'path': '/test-bad',
    'handler': handler,
    'name': 'test-bad-get'
    }, {
    'method': 'POST',
    'path': '/test-bad',
    'handler': handler,
    'name': 'test-bad-post'
    }, ]
for route in routes:
    cors.add(
        app.router.add_route(
            method=route['method'],
            path=route['path'],
            handler=route['handler'],
            name=route['name']
        )
    )
loop = asyncio.get_event_loop()
handler = app._make_handler()
server = loop.run_until_complete(
    loop.create_server(
        handler,
        host='localhost',
        port='8081'
    )
)

try:
    loop.run_forever()
except (GracefulExit, KeyboardInterrupt):
    pass
finally:
    loop.stop()

GET and POST for /test works perfect.
GET and POST for /test-bad isn't work as expected.

For self._resource_config at

resource_config = self._resource_config[resource]

we will get some thing like that:

{
  <PlainResource 'test-bad-get'  /test-bad>: instance(_ResourceConfig):
    default_config: {
    },
    method_config: {
      'GET': {
      },
    }
  <PlainResource 'test-bad-post'  /test-bad>: instance(_ResourceConfig):
    default_config: {
    },
    method_config: {
      'POST': {
      },
    }
  <PlainResource 'test-good'  /test>: instance(_ResourceConfig):
    default_config: {
    },
    method_config: {
      'GET': {
      },
      'POST': {
      },
    }
}

But for OPTION request to url /test-bad resource nether with Access-Control-Request-Method set to 'GET' or 'POST' at

resource = self._request_resource(preflight_request)

will return every time:

<PlainResource 'test-bad-get'  /test-bad>

So we try to find method POST in <PlainResource 'test-bad-get' /test-bad> node of self._resource_config and couldn't as it designed.

from aiohttp-cors.

asvetlov avatar asvetlov commented on September 2, 2024

That's interesting.
Technically test-bad-get and test-bad-post are the same resource which always returns the same URL in url_for().
Perhaps aiohttp should raise a warning on trying to add the same URL pattern under different names.

Would be nice to fix aiohttp-cors to correctly process this case as well maybe but I not sure how complex the fix is.

from aiohttp-cors.

jersobh avatar jersobh commented on September 2, 2024

I have this problem also. I'm keeping with aiohttp 2.3.10. Thanks.

from aiohttp-cors.

valentinradu avatar valentinradu commented on September 2, 2024

aiohttp-3.3.2 + aiohttp-cors-0.7.0 works fine too! <3

from aiohttp-cors.

TTRh avatar TTRh commented on September 2, 2024

Hey guys ! I think i have the same issue. @valentinmk did you find a workaround ?

from aiohttp-cors.

valentinradu avatar valentinradu commented on September 2, 2024

@TTRh I used the above mentioned versions and it worked. Unfortunately I was not able to make it work with the latest version.

from aiohttp-cors.

jersobh avatar jersobh commented on September 2, 2024

from aiohttp-cors.

TTRh avatar TTRh commented on September 2, 2024

Hum only rollbacking to aiohttp 2 worked for me :/

from aiohttp-cors.

atalaybaysal avatar atalaybaysal commented on September 2, 2024
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)

This code worked for me with aiohttp 3.5.4, aiohttp-cors 0.7.0

from aiohttp-cors.

makusudi avatar makusudi commented on September 2, 2024

up)
same problems with aiohttp 3.6.2 and aiohttp-cors 0.7.0

from aiohttp-cors.

asvetlov avatar asvetlov commented on September 2, 2024

Pull Request for aiohttp-cors is welcome!

from aiohttp-cors.

leiyugithub avatar leiyugithub commented on September 2, 2024
from aiohttp_cors import setup as cors_setup, ResourceOptions

thanks it's work for me

from aiohttp-cors.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.