1
1
import argparse
2
- import http .client
3
2
import json
4
3
import sys
5
- from contextlib import contextmanager
6
4
from time import monotonic
7
5
from typing import Any , Dict , Callable , Iterable
8
6
from urllib .parse import urlparse , urlunparse
9
7
10
- import requests
8
+ import niquests
11
9
# noinspection PyPackageRequirements
12
10
import urllib3
13
11
from urllib3 .util import SKIP_HEADER , SKIPPABLE_HEADERS
@@ -44,6 +42,7 @@ def collect_messages(
44
42
env : Environment ,
45
43
args : argparse .Namespace ,
46
44
request_body_read_callback : Callable [[bytes ], None ] = None ,
45
+ prepared_request_readiness : Callable [[niquests .PreparedRequest ], None ] = None ,
47
46
) -> Iterable [RequestsMessage ]:
48
47
httpie_session = None
49
48
httpie_session_headers = None
@@ -88,7 +87,12 @@ def collect_messages(
88
87
# TODO: reflect the split between request and send kwargs.
89
88
dump_request (request_kwargs )
90
89
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 )
92
96
prepared_request = requests_session .prepare_request (request )
93
97
transform_headers (request , prepared_request )
94
98
if args .path_as_is :
@@ -110,12 +114,13 @@ def collect_messages(
110
114
url = prepared_request .url ,
111
115
** send_kwargs_mergeable_from_env ,
112
116
)
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" )
119
124
response ._httpie_headers_parsed_at = monotonic ()
120
125
expired_cookies += get_expired_cookies (
121
126
response .headers .get ('Set-Cookie' , '' )
@@ -124,7 +129,7 @@ def collect_messages(
124
129
response_count += 1
125
130
if response .next :
126
131
if args .max_redirects and response_count == args .max_redirects :
127
- raise requests .TooManyRedirects
132
+ raise niquests .TooManyRedirects
128
133
if args .follow :
129
134
prepared_request = response .next
130
135
if args .all :
@@ -140,25 +145,12 @@ def collect_messages(
140
145
httpie_session .save ()
141
146
142
147
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
-
156
148
def build_requests_session (
157
149
verify : bool ,
158
150
ssl_version : str = None ,
159
151
ciphers : str = None ,
160
- ) -> requests .Session :
161
- requests_session = requests .Session ()
152
+ ) -> niquests .Session :
153
+ requests_session = niquests .Session ()
162
154
163
155
# Install our adapter.
164
156
http_adapter = HTTPieHTTPAdapter ()
@@ -186,7 +178,7 @@ def build_requests_session(
186
178
187
179
def dump_request (kwargs : dict ):
188
180
sys .stderr .write (
189
- f'\n >>> requests .request(**{ repr_dict (kwargs )} )\n \n ' )
181
+ f'\n >>> niquests .request(**{ repr_dict (kwargs )} )\n \n ' )
190
182
191
183
192
184
def finalize_headers (headers : HTTPHeadersDict ) -> HTTPHeadersDict :
@@ -210,13 +202,13 @@ def finalize_headers(headers: HTTPHeadersDict) -> HTTPHeadersDict:
210
202
211
203
212
204
def transform_headers (
213
- request : requests .Request ,
214
- prepared_request : requests .PreparedRequest
205
+ request : niquests .Request ,
206
+ prepared_request : niquests .PreparedRequest
215
207
) -> None :
216
208
"""Apply various transformations on top of the `prepared_requests`'s
217
209
headers to change the request prepreation behavior."""
218
210
219
- # Remove 'Content-Length' when it is misplaced by requests .
211
+ # Remove 'Content-Length' when it is misplaced by niquests .
220
212
if (
221
213
prepared_request .method in IGNORE_CONTENT_LENGTH_METHODS
222
214
and prepared_request .headers .get ('Content-Length' ) == '0'
@@ -232,7 +224,7 @@ def transform_headers(
232
224
233
225
def apply_missing_repeated_headers (
234
226
original_headers : HTTPHeadersDict ,
235
- prepared_request : requests .PreparedRequest
227
+ prepared_request : niquests .PreparedRequest
236
228
) -> None :
237
229
"""Update the given `prepared_request`'s headers with the original
238
230
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:
290
282
if args .cert :
291
283
cert = args .cert
292
284
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
299
285
cert = HTTPieCertificate (cert , args .cert_key , args .cert_key_pass .value )
300
286
301
287
return {
@@ -329,7 +315,7 @@ def make_request_kwargs(
329
315
request_body_read_callback = lambda chunk : chunk
330
316
) -> dict :
331
317
"""
332
- Translate our `args` into `requests .Request` keyword arguments.
318
+ Translate our `args` into `niquests .Request` keyword arguments.
333
319
334
320
"""
335
321
files = args .files
0 commit comments