Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions framework/deproxy/deproxy_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,15 +38,15 @@ def __init__(
self.segment_gap = segment_gap
self.__polling_lock: Optional[threading.Lock] = None

Stateful.__init__(self, id_=id_)

self._tcp_logger = logging.LoggerAdapter(
logging.getLogger("tcp"), extra={"service": f"{self}"}
)
self._http_logger = logging.LoggerAdapter(
logging.getLogger("http"), extra={"service": f"{self}"}
)

Stateful.__init__(self, id_=id_)

def __str__(self):
return f"{self.__class__.__name__}({self.bind_addr}:{self.port})"

Expand Down
26 changes: 18 additions & 8 deletions framework/deproxy/deproxy_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -277,7 +277,11 @@ def make_requests(self, requests): ...
def make_request(self, request, **kwargs): ...

async def send_request(
self, request, expected_status_code: Optional[str] = None, timeout=5
self,
request,
expected_status_code: Optional[str] = None,
timeout=5,
msg: Optional[str] = None,
) -> None:
"""
Form and send one HTTP request. And also check that the client has received a response and
Expand All @@ -286,13 +290,14 @@ async def send_request(
curr_responses = len(self.responses)

self.make_request(request)
await self.wait_for_response(timeout=timeout, strict=bool(expected_status_code))
await self.wait_for_response(timeout=timeout, strict=bool(expected_status_code), msg=msg)

if expected_status_code:
assert curr_responses + 1 == len(self.responses), "Deproxy client has lost response."
assert expected_status_code in self.last_response.status, (
f"HTTP response status codes mismatch. Expected - {expected_status_code}. "
+ f"Received - {self.last_response.status}"
msg
or f"HTTP response status codes mismatch. Expected - {expected_status_code}. "
+ f"Received - {self.last_response.status}\nThe last response:\n{self.last_response}\n"
)

def send_bytes(self, data: bytes, expect_response=False):
Expand Down Expand Up @@ -336,7 +341,12 @@ async def wait_for_connection_close(self, timeout=5, strict=False, adjust_timeou
return timeout_not_exceeded

async def wait_for_response(
self, timeout=5, strict=False, adjust_timeout=True, n: Optional[int] = None
self,
timeout=5,
strict=False,
adjust_timeout=True,
n: Optional[int] = None,
msg: Optional[str] = None,
):
"""
Try to use strict mode whenever it's possible
Expand All @@ -349,9 +359,9 @@ async def wait_for_response(
adjust_timeout=adjust_timeout,
)
if strict:
assert (
timeout_not_exceeded != False
), f"Timeout exceeded while waiting response: {timeout}"
assert timeout_not_exceeded != False, (
msg or f"Timeout exceeded while waiting response: {timeout}"
)
return timeout_not_exceeded

def receive_response(self, response: deproxy_message.Response) -> None:
Expand Down
3 changes: 3 additions & 0 deletions framework/deproxy/deproxy_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -275,6 +275,9 @@ def set_response(self, response: str | bytes | deproxy_message.Response) -> None
elif isinstance(response, deproxy_message.Response):
self.__response = response.msg.encode()

if self.__response and len(self.__response.decode(errors="ignore")) < 1024:
self._http_logger.info(f"Set response:\n{self.__response.decode(errors='ignore')}")

@property
def last_request(self) -> Optional[deproxy_message.Request]:
if not self.requests:
Expand Down
17 changes: 12 additions & 5 deletions tests/cache/test_conditional.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
__copyright__ = "Copyright (C) 2022-2023 Tempesta Technologies, Inc."
__license__ = "GPL2"

import time
import unittest

from framework.deproxy.deproxy_client import DeproxyClient
Expand Down Expand Up @@ -316,7 +317,7 @@ async def test_mod_since_nc_with_invalid_date(self):
marks.Param(
name="last_modified_nc",
response_headers="Date: Mon, 12 Dec 2016 13:59:39 GMT\r\n",
if_modified_since=lambda: "Mon, 5 Dec 2016 13:59:39 GMT",
if_modified_since=lambda timestamp: "Mon, 5 Dec 2016 13:59:39 GMT",
expected_status="200",
),
marks.Param(
Expand All @@ -328,7 +329,7 @@ async def test_mod_since_nc_with_invalid_date(self):
marks.Param(
name="last_modified_and_date_nc",
response_headers="",
if_modified_since=lambda: "Mon, 5 Dec 2016 13:59:39 GMT",
if_modified_since=lambda timestamp: "Mon, 5 Dec 2016 13:59:39 GMT",
expected_status="200",
),
]
Expand All @@ -352,11 +353,17 @@ async def test_response_without(
request=client.create_request(method="GET", uri="/page.html", headers=[]),
expected_status_code="200",
)
request = client.create_request(
method="GET",
uri="/page.html",
headers=[("If-Modified-Since", if_modified_since(timestamp=time.time() + 5))],
)
await client.send_request(
request=client.create_request(
method="GET", uri="/page.html", headers=[("If-Modified-Since", if_modified_since())]
),
request=request,
expected_status_code=expected_status,
msg=f"Unexpected response status for:\n"
f" - response Date header - {client.last_response.headers.get("Date")};\n"
f" - request If-Modified-Since header - {request.headers.get("If-Modified-Since")}\n",
)

self.assertEqual(len(srv.requests), 1, "Server has received unexpected number of requests.")
Expand Down