theelous3 / asks

Async requests-like httplib for python.
MIT License
508 stars 63 forks source link

asks returns a different response than requests and aiohttp for the same request. #130

Closed Spyder-exe closed 5 years ago

Spyder-exe commented 5 years ago

Hello, I'm trying to work with trio and asks to send requests to a loyality card service. So I'd like to send a request to their inquiry api: Here goes using requests:

import requests
r = requests.post("https://merchant.opticard.com/public/do_inquiry.asp", data={'company_id':'Dt', 'FirstCardNum1':'foo', 'g-recaptcha-response':'foo','submit1':'Submit'})

This will return "Invalid ReCaptcha" and this is normal, and what I want

Same thing using aiohttp:

import asyncio
import aiohttp

async def fetch(session, url):
    async with session.post(url, data={'company_id':'Dt', 'FirstCardNum1':'foo', 'g-recaptcha-response':'foo','submit1':'Submit'} ) as response:
        return await response.text()

async def main():
    async with aiohttp.ClientSession() as session:
        html = await fetch(session, 'https://merchant.opticard.com/public/do_inquiry.asp')
        print(html)

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

Now this also returns "Invalid ReCaptcha", so that's all nice and good.

However now, using trio/asks:

import asks
import trio

async def example():
    r = await asks.post('https://merchant.opticard.com/public/do_inquiry.asp', data={'company_id':'Dt', 'FirstCardNum1':'foo', 'g-recaptcha-response':'foo','submit1':'Submit'})
    print(r.text)
trio.run(example)

This returns a completely different response with 'Your session has expired to protect your account. Please login again.', this error/message can be accessed normally when inputting an invalid url such as 'https://merchant.opticard.com/do_inquiry.asp' instead of 'https://merchant.opticard.com/public/do_inquiry.asp'.

I have no idea where this error is coming from, I tried setting headers, cookies, encoding, nothing seems to make it work. I tried replicating the issue, but the only way I managed to replicate the result with aiohttp and requests is by setting an incorrect url like 'https://merchant.opticard.com/do_inquiry.asp' instead of 'https://merchant.opticard.com/public/do_inquiry.asp'.

This must be an issue from asks, maybe due to encoding or formatting, but I have no idea why it does this.

Spyder-exe commented 5 years ago

Found where the issue was coming from, opened a new issue at #131