`base_url` with a query string produces malformed request URLs

Aperta
#1,236 4 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

@mohsinaliwork686-rgb ci sta già lavorando.

Dal 26/10/2026.

Valutazione

Difficoltà
4/5
Tempo stimato
3-5 giorni
Idoneità per principianti
52/100
Tipo di issue
Bug
Chiarezza
Abbastanza chiara
Stato di attività
Attiva
Stack tecnologico
python
Ambito
api, backend

Direzione di ricerca

Start in _client.py by reading _enforce_trailing_slash and _merge_url, focusing on their use of raw_path when base_url contains a query. Reproduce both examples, then confirm with maintainers whether query-bearing base URLs should be rejected or supported; done means tests cover both relative requests and params= without malformed or missing paths.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

A base_url that contains a query string is not rejected, but every relative request built from it has a broken URL. Reproduced on httpx2 2.13.1:

import httpx2

client = httpx2.Client(base_url="https://example.com/api?key=k")
print(repr(client.base_url))
# URL('https://example.com/api?key=k/')

print(client.build_request("GET", "items").url)
# https://example.com/api?key=k/items

print(client.build_request("GET", "items", params={"b": "2"}).url)
# https://example.com/api?b=2

In the first request the path ends up inside the query (key becomes k/items). In the second the path items is lost entirely. No error is raised in either case, so the request silently goes to the wrong URL.

Cause

Both steps operate on raw_path, which includes the query:

  • _enforce_trailing_slash (_client.py) appends / to url.raw_path, so the slash lands after the query: /api?key=k/.
  • _merge_url builds self.base_url.raw_path + merge_url.raw_path.lstrip(b"/"), so the request path is appended after the query too.

The second case then loses the path because params= replaces the whole query (#905), and the query now holds the path.

Possible fixes

  1. Reject a base_url with a query string in the base_url setter, with a message pointing to params=.
  2. Support it: operate on path rather than raw_path in both places and merge the base query into the request's params.
Lingua principale
Python
Stelle
1.6k
Fork
103
Merge medio
1g 19h
PR unite (30g)
25

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di pydantic/httpx2

Tutte le issue di pydantic/httpx2

Issue simili

Altre issue su Python

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.