diff env/lib/python3.7/site-packages/planemo/network_util.py @ 0:26e78fe6e8c4 draft

"planemo upload commit c699937486c35866861690329de38ec1a5d9f783"
author shellac
date Sat, 02 May 2020 07:14:21 -0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/env/lib/python3.7/site-packages/planemo/network_util.py	Sat May 02 07:14:21 2020 -0400
@@ -0,0 +1,86 @@
+import socket
+try:
+    from http.client import BadStatusLine
+except ImportError:
+    from httplib import BadStatusLine
+from time import time as now
+
+from six.moves.urllib.error import URLError
+from six.moves.urllib.request import urlopen
+
+
+def get_free_port():
+    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+    sock.bind(('localhost', 0))
+    port = sock.getsockname()[1]
+    sock.close()
+    return port
+
+
+def wait_http_service(url, timeout=None):
+    if timeout:
+        end = now() + timeout
+
+    while True:
+        try:
+            if timeout:
+                next_timeout = end - now()
+                if next_timeout < 0:
+                    return False
+
+            kwds = {} if timeout is None else dict(timeout=next_timeout)
+            with urlopen(url, **kwds) as r:
+                if r.getcode() != 200:
+                    continue
+            return True
+        except socket.error:
+            pass
+        except BadStatusLine:
+            pass
+        except URLError:
+            pass
+
+
+# code.activestate.com/recipes/576655-wait-for-network-service-to-appear
+def wait_net_service(server, port, timeout=None):
+    """ Wait for network service to appear.
+
+    :param int timeout: in seconds, if None or 0 wait forever
+    :return: A ``bool`` - if ``timeout`` is ``None`` may return only ``True`` or
+             throw an unhandled network exception.
+    """
+    if port is None:
+        raise TypeError("wait_net_service passed NoneType port value.")
+
+    port = int(port)
+
+    if timeout:
+        end = now() + timeout
+
+    while True:
+        s = socket.socket()
+        # Following line prevents this method from interfering with process
+        # it is waiting for on localhost.
+        s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
+        try:
+            if timeout:
+                next_timeout = end - now()
+                if next_timeout < 0:
+                    return False
+                else:
+                    s.settimeout(next_timeout)
+
+            s.connect((server, port))
+
+        except socket.timeout:
+            # this exception occurs only if timeout is set
+            if timeout:
+                return False
+
+        except socket.error:
+            # if getattr(e, "errno") == 61:
+            #    refused_connections += 1
+            s.close()
+        else:
+            s.close()
+            return True