Skip to content

Commit 42090ac

Browse files
Merge pull request #6 from thewebscraping/bugs/request-file
bugs: fix request image file.
2 parents 783ca25 + 150c491 commit 42090ac

File tree

8 files changed

+34
-21
lines changed

8 files changed

+34
-21
lines changed

tls_requests/__version__.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@
33
__url__ = "https://github.com/thewebscraping/tls-requests"
44
__author__ = "Tu Pham"
55
__author_email__ = "[email protected]"
6-
__version__ = "1.0.5"
6+
__version__ = "1.0.6"
77
__license__ = "MIT"

tls_requests/client.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -342,7 +342,7 @@ def _send(
342342
history = history if isinstance(history, list) else []
343343
start = start or time.perf_counter()
344344
config = self.prepare_config(request)
345-
response = Response.from_tls_response(self.session.request(config.to_dict()))
345+
response = Response.from_tls_response(self.session.request(config.to_dict()), is_byte_response=config.isByteResponse)
346346
response.request = request
347347
response.default_encoding = self.encoding
348348
response.elapsed = datetime.timedelta(seconds=time.perf_counter() - start)

tls_requests/exceptions.py

+2-4
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
__all__ = [
99
"CookieConflictError",
1010
"HTTPError",
11-
"HTTPStatusError",
1211
"URLError",
1312
"RemoteProtocolError",
1413
"ProtocolError",
@@ -38,13 +37,12 @@ class TooManyRedirects(HTTPError):
3837
"""Too Many Redirects."""
3938

4039

41-
# Client errors
4240
class TLSError(HTTPError):
4341
"""TLS Error"""
4442

4543

46-
class HTTPStatusError(HTTPError):
47-
"""HTTP Status Error"""
44+
class Base64DecodeError(HTTPError):
45+
"""Base64 Decode Error"""
4846

4947

5048
class URLError(HTTPError):

tls_requests/models/libraries.py

+6-5
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
OS_MACHINE = "amd64"
2222

2323
PATTERN_RE = re.compile(
24-
r"[a-zA-Z0-9.-]+%s-%s\.(so|dll|dylib)" % (OS_PLATFORM, OS_MACHINE), re.I
24+
r"%s-%s\.(so|dll|dylib)" % (OS_PLATFORM, OS_MACHINE), re.I
2525
)
2626

2727

@@ -72,16 +72,17 @@ def fetch_api(cls, version: str = None, retries: int = 3):
7272
releases = [
7373
Release.from_kwargs(**kwargs) for kwargs in response_json
7474
]
75+
76+
if version is not None:
77+
version = "v%s" % version if not str(version).startswith("v") else str(version)
78+
releases = [release for release in releases if version == release.name]
79+
7580
assets = [
7681
asset
7782
for release in releases
7883
for asset in release.assets
7984
if PATTERN_RE.search(asset.browser_download_url)
8085
]
81-
if version is not None:
82-
for asset in assets:
83-
if str(version) == asset.name:
84-
yield asset.browser_download_url
8586

8687
for asset in assets:
8788
yield asset.browser_download_url

tls_requests/models/response.py

+16-4
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1+
import binascii
12
import codecs
23
import datetime
34
from email.message import Message
45
from typing import Any, Callable, Optional, TypeVar, Union
56

6-
from tls_requests.exceptions import HTTPError
7+
from tls_requests.exceptions import Base64DecodeError, HTTPError
78
from tls_requests.models.cookies import Cookies
89
from tls_requests.models.encoders import StreamEncoder
910
from tls_requests.models.headers import Headers
@@ -12,7 +13,7 @@
1213
from tls_requests.models.tls import TLSResponse
1314
from tls_requests.settings import CHUNK_SIZE
1415
from tls_requests.types import CookieTypes, HeaderTypes, ResponseHistory
15-
from tls_requests.utils import chardet, to_json
16+
from tls_requests.utils import b64decode, chardet, to_json
1617

1718
__all__ = ["Response"]
1819

@@ -231,10 +232,21 @@ async def aclose(self) -> None:
231232
return self.close()
232233

233234
@classmethod
234-
def from_tls_response(cls, response: TLSResponse) -> "Response":
235+
def from_tls_response(cls, response: TLSResponse, is_byte_response: bool = False) -> "Response":
236+
def _parse_response_body(value: Optional[str]) -> bytes:
237+
if value:
238+
if is_byte_response:
239+
try:
240+
value = b64decode(value.split(",")[-1])
241+
return value
242+
except (binascii.Error, AssertionError):
243+
raise Base64DecodeError("Couldn't decode the base64 string into bytes.")
244+
return value.encode("utf-8")
245+
return b""
246+
235247
ret = cls(
236248
status_code=response.status,
237-
body=response.body.encode("utf-8") if response.body else b"",
249+
body=_parse_response_body(response.body),
238250
headers=response.headers,
239251
cookies=response.cookies,
240252
)

tls_requests/models/tls.py

+1
Original file line numberDiff line numberDiff line change
@@ -418,6 +418,7 @@ class TLSConfig(_BaseConfig):
418418
headers: dict[str, str] = field(default_factory=dict)
419419
insecureSkipVerify: bool = False
420420
isByteRequest: bool = False
421+
isByteResponse: bool = True
421422
isRotatingProxy: bool = False
422423
proxyUrl: str = ""
423424
requestBody: Union[str, bytes, bytearray, None] = None

tls_requests/settings.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,5 @@
1414
"accept": "*/*",
1515
"connection": "keep-alive",
1616
"user-agent": f"Python-TLS-Requests/{__version__}",
17-
"accept-encoding": "gzip, deflate, br",
17+
"accept-encoding": "gzip, deflate, br, zstd",
1818
}

tls_requests/utils.py

+6-5
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@
33
import base64
44
import importlib
55
import logging
6-
import typing
7-
from typing import Any, Union
6+
from typing import Any, AnyStr, Union
87

98
FORMAT = "%(levelname)s:%(asctime)s:%(_name)s:%(funcName)s:%(lineno)d >>> %(message)s"
109
DATE_FORMAT = "%Y-%m-%dT%H:%M:%SZ"
@@ -74,15 +73,17 @@ def to_str(
7473
return str(value)
7574

7675

77-
def to_base64(value: Union[dict, str, bytes], encoding: str = "utf-8") -> typing.AnyStr:
76+
def to_base64(value: Union[dict, str, bytes], encoding: str = "utf-8") -> AnyStr:
7877
return base64.b64encode(to_bytes(value, encoding)).decode(encoding)
7978

8079

80+
def b64decode(value: AnyStr) -> bytes:
81+
return base64.b64decode(value)
82+
83+
8184
def to_json(value: Union[str, bytes], encoding: str = "utf-8", **kwargs) -> dict:
8285
if isinstance(value, dict):
8386
return value
84-
if isinstance(value, bytes):
85-
value = value.decode(encoding, errors="ignore")
8687
try:
8788
json_data = jsonlib.loads(value, **kwargs)
8889
return json_data

0 commit comments

Comments
 (0)