diff --git a/aiogram/api/session/aiohttp.py b/aiogram/api/session/aiohttp.py index d981caeb..ea814c84 100644 --- a/aiogram/api/session/aiohttp.py +++ b/aiogram/api/session/aiohttp.py @@ -1,17 +1,21 @@ -import json -from typing import Optional, TypeVar +from typing import Optional, TypeVar, Callable from aiohttp import ClientSession, FormData -from ..methods import Request, TelegramMethod from .base import PRODUCTION, BaseSession, TelegramAPIServer +from ..methods import Request, TelegramMethod T = TypeVar("T") class AiohttpSession(BaseSession): - def __init__(self, api: TelegramAPIServer = PRODUCTION): - super(AiohttpSession, self).__init__(api=api) + def __init__( + self, + api: TelegramAPIServer = PRODUCTION, + json_loads: Optional[Callable] = None, + json_dumps: Optional[Callable] = None, + ): + super(AiohttpSession, self).__init__(api=api, json_loads=json_loads, json_dumps=json_dumps) self._session: Optional[ClientSession] = None async def create_session(self): @@ -23,7 +27,7 @@ class AiohttpSession(BaseSession): await self._session.close() def build_form_data(self, request: Request): - form = FormData() + form = FormData(quote_fields=False) for key, value in request.data.items(): if value is None: continue @@ -41,7 +45,7 @@ class AiohttpSession(BaseSession): form = self.build_form_data(request) async with self._session.post(url, data=form) as response: - raw_result = await response.json() + raw_result = await response.json(loads=self.json_loads) response = call.build_response(raw_result) self.raise_for_status(response) diff --git a/aiogram/api/session/base.py b/aiogram/api/session/base.py index abfb1860..1c9ec27d 100644 --- a/aiogram/api/session/base.py +++ b/aiogram/api/session/base.py @@ -2,7 +2,7 @@ import abc import asyncio import datetime import json -from typing import TypeVar, Union, Any, List, Dict +from typing import TypeVar, Union, Any, List, Dict, Optional, Callable from pydantic.dataclasses import dataclass @@ -31,8 +31,16 @@ PRODUCTION = TelegramAPIServer( class BaseSession(abc.ABC): def __init__( - self, api: TelegramAPIServer = PRODUCTION, json_loads=json.loads, json_dumps=json.dumps + self, + api: TelegramAPIServer = PRODUCTION, + json_loads: Optional[Callable] = None, + json_dumps: Optional[Callable] = None, ): + if json_loads is None: + json_loads = json.loads + if json_dumps is None: + json_dumps = json.dumps + self.api = api self.json_loads = json_loads self.json_dumps = json_dumps