-
Notifications
You must be signed in to change notification settings - Fork 3.7k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Support requests.response.raw being a file-like object
Previously httpie relied on requests.models.Response.raw being urllib3.HTTPResponse. The Requests documentation specifies that (requests.models.Response.raw)[https://docs.python-requests.org/en/master/api/#requests.Response.raw] is a File-like object but allows for other types for internal use. This change introduces graceful handling for scenarios when requests.models.Response.raw is not urllib3.HTTPResponse. In such a scenario httpie now falls back to extracting metadata from requests.models.Response directly instead of direct access from protected protected members such as response.raw._original_response. A side effect in this fallback procedure is that we can no longer determine HTTP protocol version and report it as `??`. This change is necessary to make it possible to implement TransportPlugins without having to also needing to emulate internal behavior of urlib3 and http.client.
- Loading branch information
1 parent
7ceb313
commit 1428841
Showing
4 changed files
with
83 additions
and
12 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
from io import BytesIO | ||
|
||
from requests.adapters import BaseAdapter | ||
from requests.models import Response | ||
from requests.utils import get_encoding_from_headers | ||
|
||
from httpie.plugins import TransportPlugin | ||
from httpie.plugins.registry import plugin_manager | ||
|
||
from .utils import HTTP_OK, http | ||
|
||
SCHEME = "http+fake" | ||
|
||
|
||
class FakeAdapter(BaseAdapter): | ||
def send(self, request, **kwargs): | ||
response = Response() | ||
response.status_code = 200 | ||
response.reason = "OK" | ||
response.headers = { | ||
"Content-Type": "text/html; charset=UTF-8", | ||
} | ||
response.encoding = get_encoding_from_headers(response.headers) | ||
response.raw = BytesIO(b"<!doctype html><html>Hello</html>") | ||
return response | ||
|
||
|
||
class FakeTransportPlugin(TransportPlugin): | ||
name = "Fake Transport" | ||
|
||
prefix = SCHEME | ||
|
||
def get_adapter(self): | ||
return FakeAdapter() | ||
|
||
|
||
def test_transport_from_requests_response(httpbin): | ||
plugin_manager.register(FakeTransportPlugin) | ||
try: | ||
r = http(f"{SCHEME}://example.com") | ||
assert HTTP_OK in r | ||
assert "Hello" in r | ||
assert "Content-Type: text/html; charset=UTF-8" in r | ||
finally: | ||
plugin_manager.unregister(FakeTransportPlugin) |