From 8e84465ff95f717bb3df4e19da1246dce6145465 Mon Sep 17 00:00:00 2001 From: Adam Miller Date: Thu, 5 May 2016 22:31:07 +0000 Subject: [PATCH 1/2] browser.py - Check for open ports before starting Chrome. Open next available on conflict --- brozzler/browser.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/brozzler/browser.py b/brozzler/browser.py index aaff56e..585e8e9 100644 --- a/brozzler/browser.py +++ b/brozzler/browser.py @@ -34,6 +34,7 @@ from requests.structures import CaseInsensitiveDict import select import re import base64 +import psutil __all__ = ["BrowserPool", "Browser"] @@ -127,6 +128,7 @@ class Browser: def start(self, proxy=None): if not self._chrome_instance: # these can raise exceptions + self.chrome_port = self._find_available_port() self._work_dir = tempfile.TemporaryDirectory() self._chrome_instance = Chrome(port=self.chrome_port, executable=self.chrome_exe, @@ -151,6 +153,19 @@ class Browser: except: self.logger.error("problem stopping", exc_info=True) + def _find_available_port(self): + port_available = False + port = self.chrome_port + while not port_available: + for connection in psutil.net_connections(kind='tcp'): + if connection.laddr[1] == port: + self.logger.warn("Port already open %s", port) + port_available = False + port += 1 + break + port_available = True + return port + def is_running(self): return bool(self._websocket_url) From 1f7f55a14a925d0ba0e1a37f3ccbc65e6775bceb Mon Sep 17 00:00:00 2001 From: Adam Miller Date: Thu, 5 May 2016 22:55:45 +0000 Subject: [PATCH 2/2] browser.py - Fix port search logic --- brozzler/browser.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/brozzler/browser.py b/brozzler/browser.py index 585e8e9..f34887b 100644 --- a/brozzler/browser.py +++ b/brozzler/browser.py @@ -156,14 +156,13 @@ class Browser: def _find_available_port(self): port_available = False port = self.chrome_port - while not port_available: - for connection in psutil.net_connections(kind='tcp'): - if connection.laddr[1] == port: - self.logger.warn("Port already open %s", port) - port_available = False - port += 1 - break - port_available = True + + for p in range(port,65535): + if any(connection.laddr[1] == p for connection in psutil.net_connections(kind='tcp')): + self.logger.warn("Port already open %s, will try %s", p, p + 1) + else: + port = p + break return port def is_running(self):