Skip to content

Commit 09df0e7

Browse files
[CAT-103] FIX: Support gzip deserialization (#116)
* ADD: gzip as a valid MIME type * REMOVE: gzip decompression check by extension
1 parent 9e8083e commit 09df0e7

File tree

4 files changed

+28
-23
lines changed

4 files changed

+28
-23
lines changed

indico/http/client.py

+9-12
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
1-
import logging
2-
import requests
31
import http.cookiejar
4-
from pathlib import Path
5-
from contextlib import contextmanager
2+
import logging
63
from collections import defaultdict
4+
from contextlib import contextmanager
5+
from copy import deepcopy
6+
from pathlib import Path
77
from typing import Union
8+
9+
import requests
10+
from indico.client.request import HTTPRequest
811
from indico.config import IndicoConfig
12+
from indico.errors import IndicoAuthenticationFailed, IndicoRequestError
913
from indico.http.serialization import deserialize
10-
from indico.errors import IndicoRequestError, IndicoAuthenticationFailed
11-
from indico.client.request import HTTPRequest
1214
from requests import Response
13-
from copy import deepcopy
1415

1516
logger = logging.getLogger(__file__)
1617

@@ -128,14 +129,10 @@ def _make_request(
128129
# code, api_response =
129130
url_parts = path.split(".")
130131
json = False
131-
gzip = False
132132
if len(url_parts) > 1 and (url_parts[-1] == "json" or url_parts[-2] == "json"):
133133
json = True
134134

135-
if url_parts[-1] == "gz":
136-
gzip = True
137-
138-
content = deserialize(response, force_json=json, gzip=gzip)
135+
content = deserialize(response, force_json=json)
139136

140137
# If auth expired refresh
141138
if response.status_code == 401 and not _refreshed:

indico/http/serialization.py

+8-7
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
"""
22
Handles deserialization / decoding of responses
33
"""
4-
from collections import defaultdict
54
import cgi
6-
import json
7-
import io
85
import gzip
6+
import io
7+
import json
98
import logging
10-
import msgpack
119
import traceback
10+
from collections import defaultdict
1211

12+
import msgpack
1313
from indico.errors import IndicoDecodingError
1414

1515
logger = logging.getLogger(__name__)
@@ -25,11 +25,10 @@ def raw_bytes(content, *args, **kwargs):
2525
return content
2626

2727

28-
def deserialize(response, gzip=False, force_json=False):
28+
def deserialize(response, force_json=False):
2929
content_type, params = cgi.parse_header(response.headers.get("Content-Type"))
3030

31-
content = None
32-
if gzip:
31+
if content_type in ["application/x-gzip", "application/gzip"]:
3332
content = decompress(response)
3433
else:
3534
content = response.content
@@ -85,5 +84,7 @@ def zip_serialization(content, charset=None):
8584
"image/png": image_serialization,
8685
"image/jpg": image_serialization,
8786
"application/zip": zip_serialization,
87+
"application/x-gzip": raw_bytes,
88+
"application/gzip": raw_bytes,
8889
},
8990
)
1.16 KB
Binary file not shown.

tests/unit/http/test_unit_serialization.py

+11-4
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
1-
from unittest.mock import MagicMock
2-
from pathlib import Path
31
import logging
2+
from pathlib import Path
3+
from unittest.mock import MagicMock
44

55
import pytest
6-
7-
from indico.http.serialization import deserialize
86
from indico.errors import IndicoDecodingError
7+
from indico.http.serialization import deserialize
98

109

1110
@pytest.fixture(scope="function")
@@ -26,6 +25,7 @@ def _mock_loader(mime, charset):
2625
with open(path, "rb") as f:
2726
content = f.read()
2827
response_mock.content = content
28+
response_mock.raw.data = content
2929
return response_mock
3030

3131
return _mock_loader
@@ -66,6 +66,13 @@ def test_deserialize_pdf(mock_loader):
6666
assert isinstance(content, bytes)
6767

6868

69+
def test_deserialize_gzip(mock_loader):
70+
response = mock_loader("application/gzip", "")
71+
content = deserialize(response)
72+
73+
assert isinstance(content, bytes)
74+
75+
6976
def test_deserialize_unknown(mock_loader):
7077
response = mock_loader("unknown", "")
7178
try:

0 commit comments

Comments
 (0)