From e30c08244ac3aadabd22035bc28041f6bebaffbb Mon Sep 17 00:00:00 2001 From: Schamper Date: Wed, 20 Jul 2016 11:15:46 +0200 Subject: [PATCH 01/10] Add host as option for Server --- browsermobproxy/server.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/browsermobproxy/server.py b/browsermobproxy/server.py index b5620d5..eee5a5a 100644 --- a/browsermobproxy/server.py +++ b/browsermobproxy/server.py @@ -80,7 +80,7 @@ def __init__(self, path='browsermob-proxy', options=None): " provided: %s" % path) self.path = path - self.host = 'localhost' + self.host = options.get('host', 'localhost') self.port = options.get('port', 8080) self.process = None From 5ccb4bb26453eeed8652b43668afe6cb708eeb7f Mon Sep 17 00:00:00 2001 From: Schamper Date: Thu, 21 Jul 2016 17:14:49 +0200 Subject: [PATCH 02/10] Ability to add extra options to proxy creation --- browsermobproxy/client.py | 6 ++++-- browsermobproxy/server.py | 5 +++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/browsermobproxy/client.py b/browsermobproxy/client.py index e63d3cd..31ecee4 100644 --- a/browsermobproxy/client.py +++ b/browsermobproxy/client.py @@ -8,16 +8,18 @@ class Client(object): - def __init__(self, url, params=None, options=None): + def __init__(self, url, data=None, params=None, options=None): """ Initialises a new Client object :param url: This is where the BrowserMob Proxy lives + :param data: Data to be POST'ed (for example bindAddress, useEcc and trustAllServers) :param params: URL query (for example httpProxy and httpsProxy vars) :param options: Dictionary that can contain the port of an existing proxy to use (for example 'existing_proxy_port_to_use') """ + data = data if data is not None else {} params = params if params is not None else {} options = options if options is not None else {} self.host = "http://" + url @@ -28,7 +30,7 @@ def __init__(self, url, params=None, options=None): if 'existing_proxy_port_to_use' in options: self.port = options['existing_proxy_port_to_use'] else: - resp = requests.post('%s/proxy' % self.host + urlparams) + resp = requests.post('%s/proxy' % self.host + urlparams, data=data) jcontent = json.loads(resp.content.decode('utf-8')) self.port = jcontent['port'] url_parts = self.host.split(":") diff --git a/browsermobproxy/server.py b/browsermobproxy/server.py index eee5a5a..c5d74fd 100644 --- a/browsermobproxy/server.py +++ b/browsermobproxy/server.py @@ -27,7 +27,7 @@ def url(self): """ return "http://%s:%d" % (self.host, self.port) - def create_proxy(self, params=None): + def create_proxy(self, data=None, params=None): """ Gets a client class that allow to set all the proxy details that you may need to. @@ -35,8 +35,9 @@ def create_proxy(self, params=None): :param dict params: Dictionary where you can specify params like httpProxy and httpsProxy """ + data = data if data is not None else {} params = params if params is not None else {} - client = Client(self.url[7:], params) + client = Client(self.url[7:], data, params) return client def _is_listening(self): From 1a96f2bf200ba98cb0e59879543fb23bbfecdf53 Mon Sep 17 00:00:00 2001 From: Schamper Date: Thu, 21 Jul 2016 17:16:55 +0200 Subject: [PATCH 03/10] Fix content type of interceptor requests --- browsermobproxy/client.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/browsermobproxy/client.py b/browsermobproxy/client.py index 31ecee4..f1b5366 100644 --- a/browsermobproxy/client.py +++ b/browsermobproxy/client.py @@ -201,8 +201,7 @@ def response_interceptor(self, js): :param str js: the javascript to execute """ r = requests.post(url='%s/proxy/%s/filter/response' % (self.host, self.port), - data=js, - headers={'content-type': 'application/json'}) + data=js) return r.status_code def request_interceptor(self, js): @@ -212,8 +211,7 @@ def request_interceptor(self, js): :param str js: the javascript to execute """ r = requests.post(url='%s/proxy/%s/filter/request' % (self.host, self.port), - data=js, - headers={'content-type': 'application/json'}) + data=js) return r.status_code LIMITS = { From 860a859ee8f6bdc8115cd8c12cce175c72b3356a Mon Sep 17 00:00:00 2001 From: Schamper Date: Mon, 25 Jul 2016 13:42:31 +0200 Subject: [PATCH 04/10] Fix start function --- browsermobproxy/server.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/browsermobproxy/server.py b/browsermobproxy/server.py index c5d74fd..8504bb6 100644 --- a/browsermobproxy/server.py +++ b/browsermobproxy/server.py @@ -106,7 +106,7 @@ def start(self, options=None): } log_path = options.get('log_path') log_file = options.get('log_file') - log_path_name = os.path.join(log_path, os.path.sep, log_file) + log_path_name = os.path.join(log_path, log_file) self.log_file = open(log_path_name, 'w') self.process = subprocess.Popen(self.command, From 166c6e1cce6591c05066762d53722e3409c3c48d Mon Sep 17 00:00:00 2001 From: Schamper Date: Mon, 1 Aug 2016 13:04:06 +0200 Subject: [PATCH 05/10] Add proper request/response interceptor methods --- browsermobproxy/client.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/browsermobproxy/client.py b/browsermobproxy/client.py index f1b5366..1055840 100644 --- a/browsermobproxy/client.py +++ b/browsermobproxy/client.py @@ -198,6 +198,16 @@ def response_interceptor(self, js): """ Executes the javascript against each response + :param str js: the javascript to execute + """ + r = requests.post(url='%s/proxy/%s/interceptor/response' % (self.host, self.port), + data=js) + return r.status_code + + def response_filter(self, js): + """ + Executes the javascript against each response + :param str js: the javascript to execute """ r = requests.post(url='%s/proxy/%s/filter/response' % (self.host, self.port), @@ -208,6 +218,16 @@ def request_interceptor(self, js): """ Executes the javascript against each request + :param str js: the javascript to execute + """ + r = requests.post(url='%s/proxy/%s/interceptor/request' % (self.host, self.port), + data=js) + return r.status_code + + def request_filter(self, js): + """ + Executes the javascript against each request + :param str js: the javascript to execute """ r = requests.post(url='%s/proxy/%s/filter/request' % (self.host, self.port), From 548a91d134c5395abca99227a8b1c5e6b4fe518d Mon Sep 17 00:00:00 2001 From: Schamper Date: Wed, 10 Aug 2016 13:27:55 +0200 Subject: [PATCH 06/10] Fix javascript filter tests --- test/test_client.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/test/test_client.py b/test/test_client.py index a260977..aa98ed4 100644 --- a/test/test_client.py +++ b/test/test_client.py @@ -166,34 +166,34 @@ def test_close(self): def test_response_interceptor_with_parsing_js(self): """ - /proxy/:port/interceptor/response + /proxy/:port/filter/response """ js = 'alert("foo")' - status_code = self.client.response_interceptor(js) + status_code = self.client.response_filter(js) assert(status_code == 200) def test_response_interceptor_with_invalid_js(self): """ - /proxy/:port/interceptor/response + /proxy/:port/filter/response """ js = 'alert("foo"' - status_code = self.client.response_interceptor(js) + status_code = self.client.response_filter(js) assert(status_code == 500) def test_request_interceptor_with_parsing_js(self): """ - /proxy/:port/interceptor/request + /proxy/:port/filter/request """ js = 'alert("foo")' - status_code = self.client.request_interceptor(js) + status_code = self.client.request_filter(js) assert(status_code == 200) def test_request_interceptor_with_invalid_js(self): """ - /proxy/:port/interceptor/request + /proxy/:port/filter/request """ js = 'alert("foo"' - status_code = self.client.request_interceptor(js) + status_code = self.client.request_filter(js) assert(status_code == 500) def test_timeouts_invalid_timeouts(self): From f20136782e10b94d5f0df37d9d90391cd207ad72 Mon Sep 17 00:00:00 2001 From: Eric Ye Date: Sun, 25 Sep 2016 21:48:46 +1300 Subject: [PATCH 07/10] Add retry sleep and count in options --- browsermobproxy/server.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/browsermobproxy/server.py b/browsermobproxy/server.py index 8504bb6..b87d0d9 100644 --- a/browsermobproxy/server.py +++ b/browsermobproxy/server.py @@ -103,6 +103,8 @@ def start(self, options=None): options = { 'log_path': os.getcwd(), 'log_file': 'server.log', + 'retry_sleep': 0.5, + 'retry_count': 60, } log_path = options.get('log_path') log_file = options.get('log_file') @@ -121,9 +123,9 @@ def start(self, options=None): "for a helpful error message.".format(self.log_file)) raise Exception(message) - time.sleep(0.5) + time.sleep(options.get('retry_sleep')) count += 1 - if count == 60: + if count == options.get('retry_count'): self.stop() raise Exception("Can't connect to Browsermob-Proxy") From 2958d00674865302dc7ba5b3b504eb8edcbf6964 Mon Sep 17 00:00:00 2001 From: Eric Ye Date: Sun, 25 Sep 2016 22:04:02 +1300 Subject: [PATCH 08/10] Make default option values more robust --- browsermobproxy/server.py | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/browsermobproxy/server.py b/browsermobproxy/server.py index b87d0d9..8a98164 100644 --- a/browsermobproxy/server.py +++ b/browsermobproxy/server.py @@ -100,15 +100,12 @@ def start(self, options=None): of the log file with resp. keys of `log_path` and `log_file` """ if options is None: - options = { - 'log_path': os.getcwd(), - 'log_file': 'server.log', - 'retry_sleep': 0.5, - 'retry_count': 60, - } - log_path = options.get('log_path') - log_file = options.get('log_file') - log_path_name = os.path.join(log_path, log_file) + options = {} + log_path = options.get('log_path', os.getcwd()) + log_file = options.get('log_file', 'server.log') + retry_sleep = options.get('retry_sleep', 0.5) + retry_count = options.get('retry_count', 60) + log_path_name = os.path.join(log_path, os.path.sep, log_file) self.log_file = open(log_path_name, 'w') self.process = subprocess.Popen(self.command, @@ -123,9 +120,9 @@ def start(self, options=None): "for a helpful error message.".format(self.log_file)) raise Exception(message) - time.sleep(options.get('retry_sleep')) + time.sleep(retry_sleep) count += 1 - if count == options.get('retry_count'): + if count == retry_count: self.stop() raise Exception("Can't connect to Browsermob-Proxy") From fbca85a3302119d79c2f101a078421e67067f02d Mon Sep 17 00:00:00 2001 From: Eric Ye Date: Sun, 25 Sep 2016 22:19:33 +1300 Subject: [PATCH 09/10] Fix path join issue: log_path_name would be /server.log --- browsermobproxy/server.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/browsermobproxy/server.py b/browsermobproxy/server.py index 8a98164..2f75398 100644 --- a/browsermobproxy/server.py +++ b/browsermobproxy/server.py @@ -105,7 +105,7 @@ def start(self, options=None): log_file = options.get('log_file', 'server.log') retry_sleep = options.get('retry_sleep', 0.5) retry_count = options.get('retry_count', 60) - log_path_name = os.path.join(log_path, os.path.sep, log_file) + log_path_name = os.path.join(log_path, log_file) self.log_file = open(log_path_name, 'w') self.process = subprocess.Popen(self.command, From c378cbfc4fc7f9db5e2e70640ac3733b3e96a2cd Mon Sep 17 00:00:00 2001 From: Rik Date: Tue, 28 Jun 2016 13:26:04 +0200 Subject: [PATCH 10/10] Fix docstring for limits() Docstring is misleading --- browsermobproxy/client.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/browsermobproxy/client.py b/browsermobproxy/client.py index 1055840..8280408 100644 --- a/browsermobproxy/client.py +++ b/browsermobproxy/client.py @@ -245,8 +245,8 @@ def limits(self, options): Limit the bandwidth through the proxy. :param dict options: A dictionary with all the details you want to set. - downstreamKbps - Sets the downstream kbps - upstreamKbps - Sets the upstream kbps + downstream_kbps - Sets the downstream kbps + upstream_kbps - Sets the upstream kbps latency - Add the given latency to each HTTP request """ params = {}