Skip to content

Commit 4cddca8

Browse files
πŸ› Stabilize transport JSON text encoding
1 parent c250d95 commit 4cddca8

2 files changed

Lines changed: 29 additions & 7 deletions

File tree

β€Žnonebot/adapters/discord/serialization.pyβ€Ž

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
from dataclasses import dataclass
22
import json
3-
from typing import Any, Literal
3+
from typing import Any, TypeAlias, TypedDict
44

55
from nonebot.compat import PYDANTIC_V2
6+
from nonebot.internal.driver import FileTypes
67
from pydantic import BaseModel
78

89
if PYDANTIC_V2:
@@ -16,6 +17,19 @@
1617
if PYDANTIC_V2:
1718
_JSON_ADAPTER = TypeAdapter(Any)
1819

20+
MultipartFormData: TypeAlias = dict[str, FileTypes]
21+
22+
23+
class JsonTransportRequest(TypedDict):
24+
json: dict[str, Any]
25+
26+
27+
class MultipartTransportRequest(TypedDict):
28+
files: MultipartFormData
29+
30+
31+
EncodedPreparedRequest: TypeAlias = JsonTransportRequest | MultipartTransportRequest
32+
1933

2034
@dataclass(frozen=True, slots=True)
2135
class PreparedRequest:
@@ -61,7 +75,11 @@ def prepare_request( # noqa: PLR0913
6175
def encode_json_text(value: object) -> str:
6276
if PYDANTIC_V2:
6377
return _JSON_ADAPTER.dump_json(value).decode()
64-
return json.dumps(value, default=pydantic_encoder)
78+
return json.dumps(
79+
value,
80+
default=pydantic_encoder,
81+
separators=(",", ":"),
82+
)
6583

6684

6785
def encode_model_json_text( # noqa: PLR0913
@@ -133,8 +151,8 @@ def _build_multipart_payload(
133151
files: list[File],
134152
*,
135153
attachment_owner_path: tuple[str, ...] = (),
136-
) -> dict[str, Any]:
137-
multipart: dict[str, Any] = {}
154+
) -> MultipartFormData:
155+
multipart: MultipartFormData = {}
138156
container = _resolve_attachment_owner(payload, attachment_owner_path)
139157
has_attachments = "attachments" in container
140158
attachments = container.get("attachments", [])
@@ -151,7 +169,11 @@ def _build_multipart_payload(
151169

152170
if isinstance(attachments, list) and has_attachments:
153171
container["attachments"] = attachments
154-
multipart["payload_json"] = (None, encode_json_text(payload), "application/json")
172+
multipart["payload_json"] = (
173+
None,
174+
encode_json_text(payload).encode(),
175+
"application/json",
176+
)
155177
return multipart
156178

157179

β€Žtests/test_outbound_transport_serialization.pyβ€Ž

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,8 @@ def _payload_json_text(
6060
files: Sequence[tuple[str, tuple[object, object, object | None]]] | None,
6161
) -> str:
6262
payload_json = _files_to_mapping(files)["payload_json"][1]
63-
assert isinstance(payload_json, str)
64-
return payload_json
63+
assert isinstance(payload_json, (bytes, str))
64+
return payload_json.decode() if isinstance(payload_json, bytes) else payload_json
6565

6666

6767
def _assert_transport_datetime(actual: str, expected: datetime) -> None:

0 commit comments

Comments
Β (0)