diff options
author | Yoann L <yoann.lamouroux@data-impact.fr> | 2019-10-29 12:24:07 +0100 |
---|---|---|
committer | Yoann L <yoann.lamouroux@data-impact.fr> | 2019-10-29 12:24:07 +0100 |
commit | 4383122b7b6930612ba865c6d027eb375ecce058 (patch) | |
tree | d73fbd5b772a7f1c523f6b2203cd31677e9403ab | |
parent | 33707403614642ae63d7ed24f36c80a3f58ce7ac (diff) | |
download | mitmproxy-4383122b7b6930612ba865c6d027eb375ecce058.tar.gz mitmproxy-4383122b7b6930612ba865c6d027eb375ecce058.tar.bz2 mitmproxy-4383122b7b6930612ba865c6d027eb375ecce058.zip |
several fixes on command exports has several problems: #3676
* authority can usually rely on actual URL. as `:authority` headers will
break curl command. (advise if it's better to change them to Host, or if
it should be reported on curl side)
* `content-length`: 0 is added for each request. if it's found in the
curl argument list, it'll try to fetch an empty body (and crash).
also trying to guess on accept-encoding header to add the
`--compress` option when fetching potentially compressed content.
* ditto for httpie
* factorize it into raise_if_missing_request (and rename it)
-rw-r--r-- | mitmproxy/addons/export.py | 33 |
1 files changed, 11 insertions, 22 deletions
diff --git a/mitmproxy/addons/export.py b/mitmproxy/addons/export.py index 0c10f352..744db0fc 100644 --- a/mitmproxy/addons/export.py +++ b/mitmproxy/addons/export.py @@ -11,7 +11,12 @@ import mitmproxy.types import pyperclip -def cleanup_for_commands(request): +def cleanup_request(f: flow.Flow): + if not hasattr(f, "request"): + raise exceptions.CommandError("Can't export flow with no request.") + request = f.request.copy() + request.decode(strict=False) + # a bit of clean-up if ('content-length' in request.headers.keys() and request.headers['content-length'] == '0' and request.method == 'GET'): @@ -20,25 +25,14 @@ def cleanup_for_commands(request): return request -def raise_if_missing_request(f: flow.Flow) -> None: - if not hasattr(f, "request"): - raise exceptions.CommandError("Can't export flow with no request.") - - def curl_command(f: flow.Flow) -> str: - raise_if_missing_request(f) data = "curl " - request = f.request.copy() # type: ignore - request.decode(strict=False) - request = cleanup_for_commands(request) + request = cleanup_request(f) for k, v in request.headers.items(multi=True): + data += "--compressed " if k == 'accept-encoding' else "" data += "-H '%s:%s' " % (k, v) if request.method != "GET": data += "-X %s " % request.method - for header in request.headers.keys(): - if ('accept-encoding' == header.lower() and - any(comp in request.headers[header] for comp in ['gzip', 'deflate'])): - data += "--compressed " data += "'%s'" % request.url if request.content: data += " --data-binary '%s'" % strutils.bytes_to_escaped_str( @@ -49,12 +43,8 @@ def curl_command(f: flow.Flow) -> str: def httpie_command(f: flow.Flow) -> str: - raise_if_missing_request(f) - request = f.request.copy() # type: ignore - data = "http %s " % request.method - request.decode(strict=False) - request = cleanup_for_commands(request) - data += "%s" % request.url + request = cleanup_request(f) + data = "http %s %s" % (request.method, request.url) for k, v in request.headers.items(multi=True): data += " '%s:%s'" % (k, v) if request.content: @@ -66,8 +56,7 @@ def httpie_command(f: flow.Flow) -> str: def raw(f: flow.Flow) -> bytes: - raise_if_missing_request(f) - return assemble.assemble_request(f.request) # type: ignore + return assemble.assemble_request(cleanup_request(f)) # type: ignore formats = dict( |