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
3 changes: 3 additions & 0 deletions .github/workflows/RavenClient.yml
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,9 @@ jobs:
- name: Install embedded RavenDB
run: pip install ravendb-embedded

- name: Install zstandard
run: pip install zstandard

- name: Run certifi script
run: python ./.github/workflows/add_ca.py

Expand Down
26 changes: 7 additions & 19 deletions ravendb/documents/commands/stream.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
from ravendb.http.server_node import ServerNode
from ravendb.http.raven_command import RavenCommand, RavenCommandResponseType
from ravendb.json.metadata_as_dictionary import MetadataAsDictionary

from ravendb.util.request_utils import RequestUtils

_T = TypeVar("_T")

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

def send(self, session: requests.Session, request: requests.Request) -> requests.Response:
return session.request(
request.method,
url=request.url,
data=request.data,
files=request.files,
cert=session.cert,
headers=request.headers,
stream=True,
)
prepared_request = session.prepare_request(request)
RequestUtils.remove_zstd_encoding(prepared_request)
return session.send(prepared_request, cert=session.cert, stream=True)

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

def send(self, session: requests.Session, request: requests.Request) -> requests.Response:
return session.request(
request.method,
url=request.url,
data=request.data,
files=request.files,
cert=session.cert,
headers=request.headers,
stream=True,
)
prepared_request = session.prepare_request(request)
RequestUtils.remove_zstd_encoding(prepared_request)
return session.send(prepared_request, cert=session.cert, stream=True)

def is_read_request(self) -> bool:
return True
12 changes: 4 additions & 8 deletions ravendb/http/raven_command.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
from ravendb.http.http_cache import HttpCache
from ravendb.http.misc import ResponseDisposeHandling
from ravendb.http.server_node import ServerNode
from ravendb.util.request_utils import RequestUtils


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

def send(self, session: requests.Session, request: requests.Request) -> requests.Response:
return session.request(
request.method,
url=request.url,
data=request.data,
files=request.files,
cert=session.cert,
headers=request.headers,
)
prepared_request = session.prepare_request(request)
RequestUtils.remove_zstd_encoding(prepared_request)
return session.send(prepared_request, cert=session.cert)

def set_response_raw(self, response: requests.Response, stream: bytes) -> None:
raise RuntimeError(
Expand Down
28 changes: 28 additions & 0 deletions ravendb/tests/issue_tests/test_RDBC_940.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
from ravendb.tests.test_base import TestBase


class TestDocument:
def __init__(self, name: str = None):
self.name = name


class TestRDBC940(TestBase):
def setUp(self):
super(TestRDBC940, self).setUp()

def test_operations_with_zstandard_imported(self):
import zstandard

document_id = "test-documents/1"

with self.store.open_session() as session:
test_doc = TestDocument(name="Test Document")
session.store(test_doc, document_id)
session.save_changes()

with self.store.open_session() as session:
loaded_doc = session.load(document_id, TestDocument)

with self.store.open_session() as session:
session.delete(document_id)
session.save_changes()
20 changes: 20 additions & 0 deletions ravendb/util/request_utils.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import requests


class RequestUtils:

# https://issues.hibernatingrhinos.com/issue/RDBC-940
# If user has installed module 'zstd' or 'zstandard',
# 'requests' module will automatically add 'zstd' to 'Accept-Encoding' header.
# This causes exceptions. Excluding 'zstd' from the header in this workaround,
# while we keep investigating cause of the issue.
@staticmethod
def remove_zstd_encoding(request: requests.PreparedRequest) -> None:
accept_encoding = request.headers.get("Accept-Encoding")

if "zstd" in accept_encoding:
encodings = [
encoding.strip() for encoding in accept_encoding.split(",") if encoding.strip().lower() != "zstd"
]
new_header_value = ", ".join(encodings)
request.headers["Accept-Encoding"] = new_header_value
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
setup(
name="ravendb",
packages=find_packages(exclude=["*.tests.*", "tests", "*.tests", "tests.*"]),
version="7.1.2.post2",
version="7.1.2.post3",
long_description_content_type="text/markdown",
long_description=open("README_pypi.md").read(),
description="Python client for RavenDB NoSQL Database",
Expand Down