11import argparse
2- import http .client
32import json
43import sys
5- from contextlib import contextmanager
64from time import monotonic
75from typing import Any , Dict , Callable , Iterable
86from urllib .parse import urlparse , urlunparse
97
10- import requests
8+ import niquests
119# noinspection PyPackageRequirements
1210import urllib3
1311from urllib3 .util import SKIP_HEADER , SKIPPABLE_HEADERS
@@ -44,6 +42,7 @@ def collect_messages(
4442 env : Environment ,
4543 args : argparse .Namespace ,
4644 request_body_read_callback : Callable [[bytes ], None ] = None ,
45+ prepared_request_readiness : Callable [[niquests .PreparedRequest ], None ] = None ,
4746) -> Iterable [RequestsMessage ]:
4847 httpie_session = None
4948 httpie_session_headers = None
@@ -88,7 +87,12 @@ def collect_messages(
8887 # TODO: reflect the split between request and send kwargs.
8988 dump_request (request_kwargs )
9089
91- request = requests .Request (** request_kwargs )
90+ hooks = None
91+
92+ if prepared_request_readiness :
93+ hooks = {"pre_send" : [prepared_request_readiness ]}
94+
95+ request = niquests .Request (** request_kwargs , hooks = hooks )
9296 prepared_request = requests_session .prepare_request (request )
9397 transform_headers (request , prepared_request )
9498 if args .path_as_is :
@@ -110,12 +114,13 @@ def collect_messages(
110114 url = prepared_request .url ,
111115 ** send_kwargs_mergeable_from_env ,
112116 )
113- with max_headers (args .max_headers ):
114- response = requests_session .send (
115- request = prepared_request ,
116- ** send_kwargs_merged ,
117- ** send_kwargs ,
118- )
117+ response = requests_session .send (
118+ request = prepared_request ,
119+ ** send_kwargs_merged ,
120+ ** send_kwargs ,
121+ )
122+ if args .max_headers and len (response .headers ) > args .max_headers :
123+ raise niquests .ConnectionError (f"got more than { args .max_headers } headers" )
119124 response ._httpie_headers_parsed_at = monotonic ()
120125 expired_cookies += get_expired_cookies (
121126 response .headers .get ('Set-Cookie' , '' )
@@ -124,7 +129,7 @@ def collect_messages(
124129 response_count += 1
125130 if response .next :
126131 if args .max_redirects and response_count == args .max_redirects :
127- raise requests .TooManyRedirects
132+ raise niquests .TooManyRedirects
128133 if args .follow :
129134 prepared_request = response .next
130135 if args .all :
@@ -140,25 +145,12 @@ def collect_messages(
140145 httpie_session .save ()
141146
142147
143- # noinspection PyProtectedMember
144- @contextmanager
145- def max_headers (limit ):
146- # <https://github.com/httpie/cli/issues/802>
147- # noinspection PyUnresolvedReferences
148- orig = http .client ._MAXHEADERS
149- http .client ._MAXHEADERS = limit or float ('Inf' )
150- try :
151- yield
152- finally :
153- http .client ._MAXHEADERS = orig
154-
155-
156148def build_requests_session (
157149 verify : bool ,
158150 ssl_version : str = None ,
159151 ciphers : str = None ,
160- ) -> requests .Session :
161- requests_session = requests .Session ()
152+ ) -> niquests .Session :
153+ requests_session = niquests .Session ()
162154
163155 # Install our adapter.
164156 http_adapter = HTTPieHTTPAdapter ()
@@ -186,7 +178,7 @@ def build_requests_session(
186178
187179def dump_request (kwargs : dict ):
188180 sys .stderr .write (
189- f'\n >>> requests .request(**{ repr_dict (kwargs )} )\n \n ' )
181+ f'\n >>> niquests .request(**{ repr_dict (kwargs )} )\n \n ' )
190182
191183
192184def finalize_headers (headers : HTTPHeadersDict ) -> HTTPHeadersDict :
@@ -210,13 +202,13 @@ def finalize_headers(headers: HTTPHeadersDict) -> HTTPHeadersDict:
210202
211203
212204def transform_headers (
213- request : requests .Request ,
214- prepared_request : requests .PreparedRequest
205+ request : niquests .Request ,
206+ prepared_request : niquests .PreparedRequest
215207) -> None :
216208 """Apply various transformations on top of the `prepared_requests`'s
217209 headers to change the request prepreation behavior."""
218210
219- # Remove 'Content-Length' when it is misplaced by requests .
211+ # Remove 'Content-Length' when it is misplaced by niquests .
220212 if (
221213 prepared_request .method in IGNORE_CONTENT_LENGTH_METHODS
222214 and prepared_request .headers .get ('Content-Length' ) == '0'
@@ -232,7 +224,7 @@ def transform_headers(
232224
233225def apply_missing_repeated_headers (
234226 original_headers : HTTPHeadersDict ,
235- prepared_request : requests .PreparedRequest
227+ prepared_request : niquests .PreparedRequest
236228) -> None :
237229 """Update the given `prepared_request`'s headers with the original
238230 ones. This allows the requests to be prepared as usual, and then later
@@ -290,12 +282,6 @@ def make_send_kwargs_mergeable_from_env(args: argparse.Namespace) -> dict:
290282 if args .cert :
291283 cert = args .cert
292284 if args .cert_key :
293- # Having a client certificate key passphrase is not supported
294- # by requests. So we are using our own transportation structure
295- # which is compatible with their format (a tuple of minimum two
296- # items).
297- #
298- # See: https://github.com/psf/requests/issues/2519
299285 cert = HTTPieCertificate (cert , args .cert_key , args .cert_key_pass .value )
300286
301287 return {
@@ -329,7 +315,7 @@ def make_request_kwargs(
329315 request_body_read_callback = lambda chunk : chunk
330316) -> dict :
331317 """
332- Translate our `args` into `requests .Request` keyword arguments.
318+ Translate our `args` into `niquests .Request` keyword arguments.
333319
334320 """
335321 files = args .files
0 commit comments