httpx icon indicating copy to clipboard operation
httpx copied to clipboard

httpx is deleting url query parameters that do not explicitly specify a value

Open fastily opened this issue 3 years ago • 5 comments

The following program

import asyncio
import httpx

async def main():
    async with httpx.AsyncClient() as client:
        r = await client.get("https://httpbin.org/get?foobar", params={'hello': "world"})
        print(r.url)

asyncio.run(main())

should print https://httpbin.org/get?hello=world&foobar

However, the actual output is https://httpbin.org/get?hello=world

It appears that httpx is deleting url query parameters that do not explicitly specify a value.

Thanks for having a look

fastily avatar Aug 04 '22 10:08 fastily

Good afternoon!

This case reproduce in httpx.Client. If such behaviour is bug, I want to fix it

blablatdinov avatar Aug 05 '22 12:08 blablatdinov

It appears that httpx is deleting url query parameters that do not explicitly specify a value.

To determine if your assessment here is correct, try the same example but with foobar=something.

tomchristie avatar Aug 05 '22 12:08 tomchristie

@tomchristie you're right if use key-value pair in url, it's work. But what to do in case of query param without value (only key). In this discussion I found the opinion, that query can contain query param wiithout value

blablatdinov avatar Aug 05 '22 12:08 blablatdinov

It appears that httpx is deleting url query parameters that do not explicitly specify a value.

To determine if your assessment here is correct, try the same example but with foobar=something.

It works fine? That isn't related to the bug I'm reporting however. Have you tried running my example? Url parameters that do not have an explicit value are being deleted.

fastily avatar Aug 06 '22 08:08 fastily

To determine if your assessment here is correct, try the same example but with foobar=something.

It works fine? That isn't related to the bug I'm reporting however.

Great, so we've determined that your assessment is correct. This is specifically occurring for parameters without a value.

So, yes, that looks broken to me.

Confirmed this to myself with...

import httpx

r = httpx.get("https://httpbin.org/get?foobar", params={'hello': "world"})
print(r.request.url)  # https://httpbin.org/get?hello=world

r = httpx.get("https://httpbin.org/get?foobar=abc", params={'hello': "world"})
print(r.request.url)  # https://httpbin.org/get?foobar=abc&hello=world

tomchristie avatar Aug 10 '22 13:08 tomchristie