Skip to content

Commit 8d270f9

Browse files
committed
fix: guard JSON parsing, avoid header mutation, handle timeouts
1 parent 149906c commit 8d270f9

File tree

1 file changed

+19
-9
lines changed

1 file changed

+19
-9
lines changed

authcaptureproxy/auth_capture_proxy.py

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import asyncio
44
import logging
55
import re
6+
from json import JSONDecodeError
67
from functools import partial
78
from ssl import SSLContext, create_default_context
89
from typing import Any, Callable, Dict, List, Optional, Text, Tuple, Union
@@ -382,8 +383,15 @@ async def _process_multipart(reader: MultipartReader, writer: MultipartWriter) -
382383
else:
383384
data = convert_multidict_to_dict(await request.post())
384385
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
387395
if data:
388396
self.data.update(data)
389397
_LOGGER.debug("Storing data %s", data)
@@ -426,33 +434,35 @@ async def _process_multipart(reader: MultipartReader, writer: MultipartWriter) -
426434
if skip_auto_headers:
427435
_LOGGER.debug("Discovered skip_auto_headers %s", skip_auto_headers)
428436
headers.pop(SKIP_AUTO_HEADERS)
437+
# Avoid accidental header mutation across branches/calls
438+
req_headers: dict[str, Any] = dict(headers)
429439
_LOGGER.debug(
430440
"Attempting %s to %s\nheaders: %s \ncookies: %s",
431441
method,
432442
site,
433-
headers,
443+
req_headers,
434444
self.session.cookies.jar,
435445
)
436446
try:
437447
if mpwriter:
438448
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
440450
)
441451
elif data:
442452
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
444454
)
445455
elif json_data:
446456
for item in ["Host", "Origin", "User-Agent", "dnt", "Accept-Encoding"]:
447457
# remove proxy headers
448-
if headers.get(item):
449-
headers.pop(item)
458+
if req_headers.get(item):
459+
req_headers.pop(item)
450460
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
452462
)
453463
else:
454464
resp = await getattr(self.session, method)(
455-
site, headers=headers, follow_redirects=True
465+
site, headers=req_headers, follow_redirects=True
456466
)
457467
except ClientConnectionError as ex:
458468
return await self._build_response(

0 commit comments

Comments
 (0)