Skip to content

Commit f180e7a

Browse files
authored
DefaultCompressionManager has "active" defaults (#17)
1 parent 98012ca commit f180e7a

File tree

3 files changed

+45
-20
lines changed

3 files changed

+45
-20
lines changed

arangoasync/client.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ class ArangoClient:
4343
responses. Enable it by passing an instance of
4444
:class:`DefaultCompressionManager
4545
<arangoasync.compression.DefaultCompressionManager>`
46-
or a subclass of :class:`CompressionManager
46+
or a custom subclass of :class:`CompressionManager
4747
<arangoasync.compression.CompressionManager>`.
4848
4949
Raises:
@@ -143,8 +143,8 @@ async def db(
143143
auth (Auth | None): Login information.
144144
token (JwtToken | None): JWT token.
145145
verify (bool): Verify the connection by sending a test request.
146-
compression (CompressionManager | None): Supersedes the client-level
147-
compression settings.
146+
compression (CompressionManager | None): If set, supersedes the
147+
client-level compression settings.
148148
149149
Returns:
150150
Database: Database API wrapper.

arangoasync/compression.py

+5-6
Original file line numberDiff line numberDiff line change
@@ -86,17 +86,16 @@ class DefaultCompressionManager(CompressionManager):
8686
Args:
8787
threshold (int): Will compress requests to the server if
8888
the size of the request body (in bytes) is at least the value of this option.
89-
Setting it to -1 will disable request compression (default).
89+
Setting it to -1 will disable request compression.
9090
level (int): Compression level. Defaults to 6.
91-
accept (str | None): Accepted encoding. By default, there is
92-
no compression of responses.
91+
accept (str | None): Accepted encoding. Can be disabled by setting it to `None`.
9392
"""
9493

9594
def __init__(
9695
self,
97-
threshold: int = -1,
96+
threshold: int = 1024,
9897
level: int = 6,
99-
accept: Optional[AcceptEncoding] = None,
98+
accept: Optional[AcceptEncoding] = AcceptEncoding.DEFLATE,
10099
) -> None:
101100
self._threshold = threshold
102101
self._level = level
@@ -132,7 +131,7 @@ def content_encoding(self) -> str:
132131
return self._content_encoding
133132

134133
def needs_compression(self, data: str | bytes) -> bool:
135-
return self._threshold != -1 and len(data) >= self._threshold
134+
return len(data) >= self._threshold
136135

137136
def compress(self, data: str | bytes) -> bytes:
138137
if isinstance(data, bytes):

arangoasync/connection.py

+37-11
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
from arangoasync import errno, logger
1616
from arangoasync.auth import Auth, JwtToken
17-
from arangoasync.compression import CompressionManager, DefaultCompressionManager
17+
from arangoasync.compression import CompressionManager
1818
from arangoasync.exceptions import (
1919
AuthHeaderError,
2020
ClientConnectionAbortedError,
@@ -52,7 +52,7 @@ def __init__(
5252
self._host_resolver = host_resolver
5353
self._http_client = http_client
5454
self._db_name = db_name
55-
self._compression = compression or DefaultCompressionManager()
55+
self._compression = compression
5656

5757
@property
5858
def db_name(self) -> str:
@@ -100,6 +100,38 @@ def prep_response(request: Request, resp: Response) -> Response:
100100
resp.error_message = body.get("errorMessage")
101101
return resp
102102

103+
def compress_request(self, request: Request) -> bool:
104+
"""Compress request if needed.
105+
106+
Additionally, the server may be instructed to compress the response.
107+
The decision to compress the request is based on the compression strategy
108+
passed during the connection initialization.
109+
The request headers and may be modified as a result of this operation.
110+
111+
Args:
112+
request (Request): Request to be compressed.
113+
114+
Returns:
115+
bool: True if compression settings were applied.
116+
"""
117+
if self._compression is None:
118+
return False
119+
120+
result: bool = False
121+
if request.data is not None and self._compression.needs_compression(
122+
request.data
123+
):
124+
request.data = self._compression.compress(request.data)
125+
request.headers["content-encoding"] = self._compression.content_encoding
126+
result = True
127+
128+
accept_encoding: str | None = self._compression.accept_encoding
129+
if accept_encoding is not None:
130+
request.headers["accept-encoding"] = accept_encoding
131+
result = True
132+
133+
return result
134+
103135
async def process_request(self, request: Request) -> Response:
104136
"""Process request, potentially trying multiple hosts.
105137
@@ -198,15 +230,7 @@ async def send_request(self, request: Request) -> Response:
198230
ArangoClientError: If an error occurred from the client side.
199231
ArangoServerError: If an error occurred from the server side.
200232
"""
201-
if request.data is not None and self._compression.needs_compression(
202-
request.data
203-
):
204-
request.data = self._compression.compress(request.data)
205-
request.headers["content-encoding"] = self._compression.content_encoding
206-
207-
accept_encoding: str | None = self._compression.accept_encoding
208-
if accept_encoding is not None:
209-
request.headers["accept-encoding"] = accept_encoding
233+
self.compress_request(request)
210234

211235
if self._auth:
212236
request.auth = self._auth
@@ -335,6 +359,7 @@ async def send_request(self, request: Request) -> Response:
335359
raise AuthHeaderError("Failed to generate authorization header.")
336360

337361
request.headers["authorization"] = self._auth_header
362+
self.compress_request(request)
338363

339364
resp = await self.process_request(request)
340365
if (
@@ -416,6 +441,7 @@ async def send_request(self, request: Request) -> Response:
416441
if self._auth_header is None:
417442
raise AuthHeaderError("Failed to generate authorization header.")
418443
request.headers["authorization"] = self._auth_header
444+
self.compress_request(request)
419445

420446
resp = await self.process_request(request)
421447
self.raise_for_status(request, resp)

0 commit comments

Comments
 (0)