summaryrefslogtreecommitdiffstats
path: root/testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/browsermobproxy/server.py
diff options
context:
space:
mode:
Diffstat (limited to 'testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/browsermobproxy/server.py')
-rw-r--r--testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/browsermobproxy/server.py106
1 files changed, 106 insertions, 0 deletions
diff --git a/testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/browsermobproxy/server.py b/testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/browsermobproxy/server.py
new file mode 100644
index 000000000..ff6db4efe
--- /dev/null
+++ b/testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/browsermobproxy/server.py
@@ -0,0 +1,106 @@
+import os
+import platform
+import socket
+import subprocess
+import time
+
+from .client import Client
+
+
+class Server(object):
+
+ def __init__(self, path='browsermob-proxy', options={}):
+ """
+ Initialises a Server object
+
+ :param path: Path to the browsermob proxy batch file
+ :param options: Dictionary that can hold the port. \
+ More items will be added in the future. \
+ This defaults to an empty dictionary
+ """
+ path_var_sep = ':'
+ if platform.system() == 'Windows':
+ path_var_sep = ';'
+ if not path.endswith('.bat'):
+ path += '.bat'
+
+ exec_not_on_path = True
+ for directory in os.environ['PATH'].split(path_var_sep):
+ if(os.path.isfile(os.path.join(directory, path))):
+ exec_not_on_path = False
+ break
+
+ if not os.path.isfile(path) and exec_not_on_path:
+ raise IOError("Browsermob-Proxy binary couldn't be found in path"
+ " provided: {}".format(path))
+
+ self.path = path
+ self.port = options.get('port', 8080)
+ self.process = None
+
+ if platform.system() == 'Darwin':
+ self.command = ['sh']
+ else:
+ self.command = []
+ self.command += [path, '--port={}'.format(self.port)]
+
+ def start(self):
+ """
+ This will start the browsermob proxy and then wait until it can
+ interact with it
+ """
+ self.log_file = open(os.path.abspath('server.log'), 'w')
+ self.process = subprocess.Popen(self.command,
+ stdout=self.log_file,
+ stderr=subprocess.STDOUT)
+ count = 0
+ while not self._is_listening():
+ time.sleep(0.5)
+ count += 1
+ if count == 60:
+ self.stop()
+ raise Exception("Can't connect to Browsermob-Proxy")
+
+ def stop(self):
+ """
+ This will stop the process running the proxy
+ """
+ if self.process.poll() is not None:
+ return
+
+ try:
+ self.process.kill()
+ self.process.wait()
+ except AttributeError:
+ # kill may not be available under windows environment
+ pass
+
+ self.log_file.close()
+
+ @property
+ def url(self):
+ """
+ Gets the url that the proxy is running on. This is not the URL clients
+ should connect to.
+ """
+ return "http://localhost:{}".format(self.port)
+
+ def create_proxy(self, params={}):
+ """
+ Gets a client class that allow to set all the proxy details that you
+ may need to.
+ :param params: Dictionary where you can specify params \
+ like httpProxy and httpsProxy
+ """
+ client = Client(self.url[7:], params)
+ return client
+
+ def _is_listening(self):
+ try:
+ socket_ = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ socket_.settimeout(1)
+ socket_.connect(("localhost", self.port))
+ socket_.close()
+ return True
+ except socket.error:
+ return False