Skip to content

Commit 456675b

Browse files
authored
Merge pull request #251 from yh-0/RDBC-940
RDBC-940 v7.1 Zstd-compression data prevents simple store.
2 parents 9eb4049 + 74664a0 commit 456675b

File tree

6 files changed

+63
-28
lines changed

6 files changed

+63
-28
lines changed

.github/workflows/RavenClient.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,9 @@ jobs:
7575
- name: Install embedded RavenDB
7676
run: pip install ravendb-embedded
7777

78+
- name: Install zstandard
79+
run: pip install zstandard
80+
7881
- name: Run certifi script
7982
run: python ./.github/workflows/add_ca.py
8083

ravendb/documents/commands/stream.py

Lines changed: 7 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from ravendb.http.server_node import ServerNode
1010
from ravendb.http.raven_command import RavenCommand, RavenCommandResponseType
1111
from ravendb.json.metadata_as_dictionary import MetadataAsDictionary
12-
12+
from ravendb.util.request_utils import RequestUtils
1313

1414
_T = TypeVar("_T")
1515

@@ -52,15 +52,9 @@ def process_response(self, cache: HttpCache, response: requests.Response, url) -
5252
raise RuntimeError("Unable to process stream response", e)
5353

5454
def send(self, session: requests.Session, request: requests.Request) -> requests.Response:
55-
return session.request(
56-
request.method,
57-
url=request.url,
58-
data=request.data,
59-
files=request.files,
60-
cert=session.cert,
61-
headers=request.headers,
62-
stream=True,
63-
)
55+
prepared_request = session.prepare_request(request)
56+
RequestUtils.remove_zstd_encoding(prepared_request)
57+
return session.send(prepared_request, cert=session.cert, stream=True)
6458

6559
def is_read_request(self) -> bool:
6660
return True
@@ -97,15 +91,9 @@ def process_response(self, cache: HttpCache, response: requests.Response, url) -
9791
raise RuntimeError("Unable to process stream response: " + e.args[0], e)
9892

9993
def send(self, session: requests.Session, request: requests.Request) -> requests.Response:
100-
return session.request(
101-
request.method,
102-
url=request.url,
103-
data=request.data,
104-
files=request.files,
105-
cert=session.cert,
106-
headers=request.headers,
107-
stream=True,
108-
)
94+
prepared_request = session.prepare_request(request)
95+
RequestUtils.remove_zstd_encoding(prepared_request)
96+
return session.send(prepared_request, cert=session.cert, stream=True)
10997

11098
def is_read_request(self) -> bool:
11199
return True

ravendb/http/raven_command.py

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from ravendb.http.http_cache import HttpCache
1313
from ravendb.http.misc import ResponseDisposeHandling
1414
from ravendb.http.server_node import ServerNode
15+
from ravendb.util.request_utils import RequestUtils
1516

1617

1718
class RavenCommandResponseType(Enum):
@@ -97,14 +98,9 @@ def set_response(self, response: Optional[str], from_cache: bool) -> None:
9798
)
9899

99100
def send(self, session: requests.Session, request: requests.Request) -> requests.Response:
100-
return session.request(
101-
request.method,
102-
url=request.url,
103-
data=request.data,
104-
files=request.files,
105-
cert=session.cert,
106-
headers=request.headers,
107-
)
101+
prepared_request = session.prepare_request(request)
102+
RequestUtils.remove_zstd_encoding(prepared_request)
103+
return session.send(prepared_request, cert=session.cert)
108104

109105
def set_response_raw(self, response: requests.Response, stream: bytes) -> None:
110106
raise RuntimeError(
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
from ravendb.tests.test_base import TestBase
2+
3+
4+
class TestDocument:
5+
def __init__(self, name: str = None):
6+
self.name = name
7+
8+
9+
class TestRDBC940(TestBase):
10+
def setUp(self):
11+
super(TestRDBC940, self).setUp()
12+
13+
def test_operations_with_zstandard_imported(self):
14+
import zstandard
15+
16+
document_id = "test-documents/1"
17+
18+
with self.store.open_session() as session:
19+
test_doc = TestDocument(name="Test Document")
20+
session.store(test_doc, document_id)
21+
session.save_changes()
22+
23+
with self.store.open_session() as session:
24+
loaded_doc = session.load(document_id, TestDocument)
25+
26+
with self.store.open_session() as session:
27+
session.delete(document_id)
28+
session.save_changes()

ravendb/util/request_utils.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import requests
2+
3+
4+
class RequestUtils:
5+
6+
# https://issues.hibernatingrhinos.com/issue/RDBC-940
7+
# If user has installed module 'zstd' or 'zstandard',
8+
# 'requests' module will automatically add 'zstd' to 'Accept-Encoding' header.
9+
# This causes exceptions. Excluding 'zstd' from the header in this workaround,
10+
# while we keep investigating cause of the issue.
11+
@staticmethod
12+
def remove_zstd_encoding(request: requests.PreparedRequest) -> None:
13+
accept_encoding = request.headers.get("Accept-Encoding")
14+
15+
if "zstd" in accept_encoding:
16+
encodings = [
17+
encoding.strip() for encoding in accept_encoding.split(",") if encoding.strip().lower() != "zstd"
18+
]
19+
new_header_value = ", ".join(encodings)
20+
request.headers["Accept-Encoding"] = new_header_value

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
setup(
44
name="ravendb",
55
packages=find_packages(exclude=["*.tests.*", "tests", "*.tests", "tests.*"]),
6-
version="7.1.2.post2",
6+
version="7.1.2.post3",
77
long_description_content_type="text/markdown",
88
long_description=open("README_pypi.md").read(),
99
description="Python client for RavenDB NoSQL Database",

0 commit comments

Comments
 (0)