From 9efda4d138a02ec5bafef8894102f3d522cb5fe6 Mon Sep 17 00:00:00 2001 From: Shadab Zafar Date: Fri, 5 Feb 2016 23:25:25 +0530 Subject: Refactor copy_as_python_code Make it easier to support other HTTP request types --- libmproxy/console/common.py | 38 +++++++++++++++++++++++++------------- 1 file changed, 25 insertions(+), 13 deletions(-) (limited to 'libmproxy/console/common.py') diff --git a/libmproxy/console/common.py b/libmproxy/console/common.py index 276e45c2..93c4df72 100644 --- a/libmproxy/console/common.py +++ b/libmproxy/console/common.py @@ -309,20 +309,32 @@ def copy_as_python_code(flow): signals.status_message.send(message="Currently, only GET methods are supported") return - data = ("import requests\n" - "headers = {%s}\n" - "url = '%s'\n" - "resp = requests.get(url, headers=headers)") - - headers = "\n" - for k, v in flow.request.headers.fields: - headers += " '%s': '%s',\n" % (k, v) - - full_url = flow.request.scheme + "://" + flow.request.host + flow.request.path - - data = data % (headers, full_url) + code = """import requests + +url = '{url}' +{headers} +response = requests.request( + method='{method}', + url=url,{args} +) + +print(response.text)""" + + args = "" + headers = "" + if flow.request.headers: + lines = [" '%s': '%s',\n" % (k, v) for k, v in flow.request.headers.fields] + headers += "\nheaders = {\n%s}\n" % "".join(lines) + args += "\n headers=headers," + + code = code.format( + url=flow.request.pretty_url, + headers=headers, + method=flow.request.method, + args=args, + ) - copy_to_clipboard_or_prompt(data) + copy_to_clipboard_or_prompt(code) def copy_as_raw_request(flow): -- cgit v1.2.3 From 545014dcb6c2abd1e3b3113fb90aea17272ca116 Mon Sep 17 00:00:00 2001 From: Shadab Zafar Date: Sat, 6 Feb 2016 00:41:57 +0530 Subject: Export any flow as Python code, not just GET The generic code idea was taken from Postman's code export: https://www.getpostman.com/ --- libmproxy/console/common.py | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) (limited to 'libmproxy/console/common.py') diff --git a/libmproxy/console/common.py b/libmproxy/console/common.py index 93c4df72..f96d7dd6 100644 --- a/libmproxy/console/common.py +++ b/libmproxy/console/common.py @@ -3,6 +3,7 @@ from __future__ import absolute_import import urwid import urwid.util import os +import urllib from netlib.http import CONTENT_MISSING import netlib.utils @@ -305,14 +306,11 @@ def copy_as_curl_command(flow): def copy_as_python_code(flow): - if flow.request.method != "GET": - signals.status_message.send(message="Currently, only GET methods are supported") - return code = """import requests url = '{url}' -{headers} +{headers}{params}{data} response = requests.request( method='{method}', url=url,{args} @@ -320,6 +318,9 @@ response = requests.request( print(response.text)""" + components = map(lambda x: urllib.quote(x, safe=""), flow.request.path_components) + url = flow.request.scheme + "://" + flow.request.host + "/" + "/".join(components) + args = "" headers = "" if flow.request.headers: @@ -327,9 +328,22 @@ print(response.text)""" headers += "\nheaders = {\n%s}\n" % "".join(lines) args += "\n headers=headers," + params = "" + if flow.request.query: + lines = [" '%s': '%s',\n" % (k, v) for k, v in flow.request.query] + params="\nparams = {\n%s}\n" % "".join(lines) + args += "\n params=params," + + data = "" + if flow.request.body: + data="\ndata = '''%s'''\n" % flow.request.body + args += "\n data=data," + code = code.format( - url=flow.request.pretty_url, + url=url, headers=headers, + params=params, + data=data, method=flow.request.method, args=args, ) -- cgit v1.2.3 From 3374be9f4b1dbeba3e9abbea7a447c957dfeda51 Mon Sep 17 00:00:00 2001 From: Shadab Zafar Date: Mon, 8 Feb 2016 20:07:38 +0530 Subject: Move exporters to a separate file --- libmproxy/console/common.py | 84 +++++---------------------------------------- 1 file changed, 8 insertions(+), 76 deletions(-) (limited to 'libmproxy/console/common.py') diff --git a/libmproxy/console/common.py b/libmproxy/console/common.py index f96d7dd6..0ada3e34 100644 --- a/libmproxy/console/common.py +++ b/libmproxy/console/common.py @@ -3,12 +3,12 @@ from __future__ import absolute_import import urwid import urwid.util import os -import urllib from netlib.http import CONTENT_MISSING import netlib.utils from .. import utils +from .. import flow_export from ..models import decoded from . import signals @@ -279,81 +279,13 @@ def copy_flow_format_data(part, scope, flow): def export_prompt(k, flow): - if k == "c": - copy_as_curl_command(flow) - elif k == "p": - copy_as_python_code(flow) - elif k == "r": - copy_as_raw_request(flow) - - -def copy_as_curl_command(flow): - data = "curl " - - for k, v in flow.request.headers.fields: - data += "-H '%s:%s' " % (k, v) - - if flow.request.method != "GET": - data += "-X %s " % flow.request.method - - full_url = flow.request.scheme + "://" + flow.request.host + flow.request.path - data += "'%s'" % full_url - - if flow.request.content: - data += " --data-binary '%s'" % flow.request.content - - copy_to_clipboard_or_prompt(data) - - -def copy_as_python_code(flow): - - code = """import requests - -url = '{url}' -{headers}{params}{data} -response = requests.request( - method='{method}', - url=url,{args} -) - -print(response.text)""" - - components = map(lambda x: urllib.quote(x, safe=""), flow.request.path_components) - url = flow.request.scheme + "://" + flow.request.host + "/" + "/".join(components) - - args = "" - headers = "" - if flow.request.headers: - lines = [" '%s': '%s',\n" % (k, v) for k, v in flow.request.headers.fields] - headers += "\nheaders = {\n%s}\n" % "".join(lines) - args += "\n headers=headers," - - params = "" - if flow.request.query: - lines = [" '%s': '%s',\n" % (k, v) for k, v in flow.request.query] - params="\nparams = {\n%s}\n" % "".join(lines) - args += "\n params=params," - - data = "" - if flow.request.body: - data="\ndata = '''%s'''\n" % flow.request.body - args += "\n data=data," - - code = code.format( - url=url, - headers=headers, - params=params, - data=data, - method=flow.request.method, - args=args, - ) - - copy_to_clipboard_or_prompt(code) - - -def copy_as_raw_request(flow): - data = netlib.http.http1.assemble_request(flow.request) - copy_to_clipboard_or_prompt(data) + exporters = { + "c": flow_export.curl_command, + "p": flow_export.python_code, + "r": flow_export.raw_request, + } + if k in exporters: + copy_to_clipboard_or_prompt(exporters[k](flow)) def copy_to_clipboard_or_prompt(data): -- cgit v1.2.3