|
3 | 3 | import asyncio |
4 | 4 | import logging |
5 | 5 | import re |
| 6 | +from json import JSONDecodeError |
6 | 7 | from functools import partial |
7 | 8 | from ssl import SSLContext, create_default_context |
8 | 9 | from typing import Any, Callable, Dict, List, Optional, Text, Tuple, Union |
@@ -382,8 +383,15 @@ async def _process_multipart(reader: MultipartReader, writer: MultipartWriter) - |
382 | 383 | else: |
383 | 384 | data = convert_multidict_to_dict(await request.post()) |
384 | 385 | json_data = None |
385 | | - if request.has_body: |
386 | | - json_data = await request.json() |
| 386 | + # Only attempt JSON decoding for JSON requests; avoid raising for form posts. |
| 387 | + if request.has_body and ( |
| 388 | + request.content_type == "application/json" |
| 389 | + or request.content_type.endswith("+json") |
| 390 | + ): |
| 391 | + try: |
| 392 | + json_data = await request.json() |
| 393 | + except (JSONDecodeError, ValueError): |
| 394 | + json_data = None |
387 | 395 | if data: |
388 | 396 | self.data.update(data) |
389 | 397 | _LOGGER.debug("Storing data %s", data) |
@@ -426,33 +434,35 @@ async def _process_multipart(reader: MultipartReader, writer: MultipartWriter) - |
426 | 434 | if skip_auto_headers: |
427 | 435 | _LOGGER.debug("Discovered skip_auto_headers %s", skip_auto_headers) |
428 | 436 | headers.pop(SKIP_AUTO_HEADERS) |
| 437 | + # Avoid accidental header mutation across branches/calls |
| 438 | + req_headers: dict[str, Any] = dict(headers) |
429 | 439 | _LOGGER.debug( |
430 | 440 | "Attempting %s to %s\nheaders: %s \ncookies: %s", |
431 | 441 | method, |
432 | 442 | site, |
433 | | - headers, |
| 443 | + req_headers, |
434 | 444 | self.session.cookies.jar, |
435 | 445 | ) |
436 | 446 | try: |
437 | 447 | if mpwriter: |
438 | 448 | resp = await getattr(self.session, method)( |
439 | | - site, data=mpwriter, headers=headers, follow_redirects=True |
| 449 | + site, data=mpwriter, headers=req_headers, follow_redirects=True |
440 | 450 | ) |
441 | 451 | elif data: |
442 | 452 | resp = await getattr(self.session, method)( |
443 | | - site, data=data, headers=headers, follow_redirects=True |
| 453 | + site, data=data, headers=req_headers, follow_redirects=True |
444 | 454 | ) |
445 | 455 | elif json_data: |
446 | 456 | for item in ["Host", "Origin", "User-Agent", "dnt", "Accept-Encoding"]: |
447 | 457 | # remove proxy headers |
448 | | - if headers.get(item): |
449 | | - headers.pop(item) |
| 458 | + if req_headers.get(item): |
| 459 | + req_headers.pop(item) |
450 | 460 | resp = await getattr(self.session, method)( |
451 | | - site, json=json_data, headers=headers, follow_redirects=True |
| 461 | + site, json=json_data, headers=req_headers, follow_redirects=True |
452 | 462 | ) |
453 | 463 | else: |
454 | 464 | resp = await getattr(self.session, method)( |
455 | | - site, headers=headers, follow_redirects=True |
| 465 | + site, headers=req_headers, follow_redirects=True |
456 | 466 | ) |
457 | 467 | except ClientConnectionError as ex: |
458 | 468 | return await self._build_response( |
|
0 commit comments