You've already forked httpie-cli
mirror of
https://github.com/httpie/cli.git
synced 2025-08-10 22:42:05 +02:00
Add compressed requests (#739)
* Add optional compression of the request's content This option allows compression of the files and/or data during uploading, Examples: http --form --compress POST https://localhost/upload csv@./very-big.csv http -x -x POST https://localhost/upload foo=bar cat /var/log/system.log | http -x POST https://localhost/upload Signed-off-by: Aleksandr Vinokurov <aleksandr.vin@gmail.com> * Add tests for compression Signed-off-by: Aleksandr Vinokurov <aleksandr.vin@gmail.com> * Fix code style issues Signed-off-by: Aleksandr Vinokurov <aleksandr.vin@gmail.com> * Fix zlib compression api missuse in Python3 Signed-off-by: Aleksandr Vinokurov <aleksandr.vin@gmail.com> * Remove tracing from compression logic Signed-off-by: Aleksandr Vinokurov <aleksandr.vin@gmail.com>
This commit is contained in:
committed by
Jakub Roztocil
parent
2deaccf2d1
commit
5ec954c03d
@@ -13,6 +13,8 @@ from httpie.input import SSL_VERSION_ARG_MAPPING
|
||||
from httpie.plugins import plugin_manager
|
||||
from httpie.utils import repr_dict_nice
|
||||
|
||||
import zlib
|
||||
|
||||
try:
|
||||
# https://urllib3.readthedocs.io/en/latest/security.html
|
||||
# noinspection PyPackageRequirements
|
||||
@@ -55,12 +57,37 @@ class HTTPieHTTPAdapter(HTTPAdapter):
|
||||
super(HTTPieHTTPAdapter, self).init_poolmanager(*args, **kwargs)
|
||||
|
||||
|
||||
def get_requests_session(ssl_version):
|
||||
class ContentCompressionHttpAdapter(HTTPAdapter):
|
||||
|
||||
def __init__(self, compress, **kwargs):
|
||||
self.compress = compress
|
||||
super(ContentCompressionHttpAdapter, self).__init__(**kwargs)
|
||||
|
||||
def send(self, request, **kwargs):
|
||||
if request.body and self.compress > 0:
|
||||
deflater = zlib.compressobj()
|
||||
if isinstance(request.body, bytes):
|
||||
deflated_data = deflater.compress(request.body)
|
||||
else:
|
||||
deflated_data = deflater.compress(request.body.encode())
|
||||
deflated_data += deflater.flush()
|
||||
if len(deflated_data) < len(request.body) or self.compress > 1:
|
||||
request.body = deflated_data
|
||||
request.headers['Content-Encoding'] = 'deflate'
|
||||
request.headers['Content-Length'] = str(len(deflated_data))
|
||||
return super(ContentCompressionHttpAdapter, self).send(request, **kwargs)
|
||||
|
||||
|
||||
def get_requests_session(ssl_version, compress):
|
||||
requests_session = requests.Session()
|
||||
requests_session.mount(
|
||||
'https://',
|
||||
HTTPieHTTPAdapter(ssl_version=ssl_version)
|
||||
)
|
||||
if compress:
|
||||
adapter = ContentCompressionHttpAdapter(compress)
|
||||
for prefix in ['http://', 'https://']:
|
||||
requests_session.mount(prefix, adapter)
|
||||
for cls in plugin_manager.get_transport_plugins():
|
||||
transport_plugin = cls()
|
||||
requests_session.mount(prefix=transport_plugin.prefix,
|
||||
@@ -75,7 +102,7 @@ def get_response(args, config_dir):
|
||||
if args.ssl_version:
|
||||
ssl_version = SSL_VERSION_ARG_MAPPING[args.ssl_version]
|
||||
|
||||
requests_session = get_requests_session(ssl_version)
|
||||
requests_session = get_requests_session(ssl_version, args.compress)
|
||||
requests_session.max_redirects = args.max_redirects
|
||||
|
||||
with max_headers(args.max_headers):
|
||||
|
Reference in New Issue
Block a user