From eb96c590fffafb6170d1d216cf09fb3763864b2b Mon Sep 17 00:00:00 2001 From: Andre Ambrosio Boechat Date: Tue, 3 May 2022 13:45:55 -0300 Subject: [PATCH] Copy the way aiohttp builds the request url with query parameters --- vcr/stubs/aiohttp_stubs.py | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/vcr/stubs/aiohttp_stubs.py b/vcr/stubs/aiohttp_stubs.py index f95ee7c..d7d7cb8 100644 --- a/vcr/stubs/aiohttp_stubs.py +++ b/vcr/stubs/aiohttp_stubs.py @@ -8,7 +8,8 @@ from aiohttp import ClientConnectionError, ClientResponse, RequestInfo, streams from aiohttp import hdrs, CookieJar from http.cookies import CookieError, Morsel, SimpleCookie from aiohttp.helpers import strip_auth_from_url -from multidict import CIMultiDict, CIMultiDictProxy +from multidict import CIMultiDict, CIMultiDictProxy, MultiDict +from typing import Union, Mapping from yarl import URL from vcr.errors import CannotOverwriteExistingCassetteException @@ -229,6 +230,16 @@ def _build_cookie_header(session, cookies, cookie_header, url): return c.output(header="", sep=";").strip() +def _build_url_with_params(url_str: str, params: Mapping[str, Union[str, int, float]]) -> URL: + # This code is basically a copy&paste of aiohttp. + # https://github.com/aio-libs/aiohttp/blob/master/aiohttp/client_reqrep.py#L225 + url = URL(url_str) + q = MultiDict(url.query) + url2 = url.with_query(params) + q.extend(url2.query) + return url.with_query(q) + + def vcr_request(cassette, real_request): @functools.wraps(real_request) async def new_request(self, method, url, **kwargs): @@ -242,10 +253,7 @@ def vcr_request(cassette, real_request): if auth is not None: headers["AUTHORIZATION"] = auth.encode() - request_url = URL(url) - if params: - request_url = URL(url).with_query(params) - + request_url = URL(url) if not params else _build_url_with_params(url, params) c_header = headers.pop(hdrs.COOKIE, None) cookie_header = _build_cookie_header(self, cookies, c_header, request_url) if cookie_header: