[tor-commits] [flashproxy/master] Update RegSet API.

infinity0 at torproject.org infinity0 at torproject.org
Mon Oct 28 14:47:40 UTC 2013


commit 27b1d726376e67f36e070668a8efce67ca2368b2
Author: George Kadianakis <desnacked at riseup.net>
Date:   Fri Sep 6 17:21:52 2013 +0300

    Update RegSet API.
---
 facilitator/facilitator |   60 ++++++++++++++++++++++++++++++++++-------------
 1 file changed, 44 insertions(+), 16 deletions(-)

diff --git a/facilitator/facilitator b/facilitator/facilitator
index 4049dc6..869f62d 100755
--- a/facilitator/facilitator
+++ b/facilitator/facilitator
@@ -27,6 +27,8 @@ MAX_PROXIES_PER_CLIENT = 5
 
 LOG_DATE_FORMAT = "%Y-%m-%d %H:%M:%S"
 
+class UnknownTransport(Exception): pass
+
 class options(object):
     listen_port = DEFAULT_LISTEN_PORT
     log_filename = DEFAULT_LOG_FILENAME
@@ -284,20 +286,33 @@ class Handler(SocketServer.StreamRequestHandler):
 class Server(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
     allow_reuse_address = True
 
-# Separate pools for IPv4 and IPv6 clients.
-REGS_IPV4 = RegSet()
-REGS_IPV6 = RegSet()
+# Registration sets per-outermost-transport
+# {"websocket" : <RegSet for websocket>, "webrtc" : <RegSet for webrtc>}
+REGSETS_IPV4 = {}
+REGSETS_IPV6 = {}
 
 def num_regs():
     """Return the total number of registrations."""
-    return len(REGS_IPV4) + len(REGS_IPV6)
+    num_regs = 0
+
+    # Iterate the regsets of each regset-dictionary, and count their
+    # registrations.
+    for regset in REGSETS_IPV4.values():
+        num_regs += len(regset)
+    for regset in REGSETS_IPV6.values():
+        num_regs += len(regset)
+
+    return num_regs
+
+def get_regs(af, transport):
+    """Return the correct regs pool for the given address family and transport."""
+    if transport not in REGSETS_IPV4:
+        raise UnknownTransport("unknown transport %s" % transport)
 
-def regs_for_af(af):
-    """Return the correct regs pool for the given address family."""
     if af == socket.AF_INET:
-        return REGS_IPV4
+        return REGSETS_IPV4[transport]
     elif af == socket.AF_INET6:
-        return REGS_IPV6
+        return REGSETS_IPV6[transport]
     else:
         raise ValueError("unknown address family %d" % af)
 
@@ -307,13 +322,26 @@ def addr_af(addr_str):
     addrs = socket.getaddrinfo(addr_str, 0, 0, socket.SOCK_STREAM, socket.IPPROTO_TCP, socket.AI_NUMERICHOST)
     return addrs[0][0]
 
-def get_reg_for_proxy(proxy_addr):
-    """Get a client registration appropriate for the given proxy (one of a
-    matching address family)."""
-    addr_str = proxy_addr[0]
-    af = addr_af(addr_str)
-    REGS = regs_for_af(af)
-    return REGS.fetch()
+def get_reg_for_proxy(proxy_addr, transport_list):
+    """Get a client registration appropriate for the given proxy (one
+    of a matching address family). If 'transports' is set, try to find
+    a client registration that supports the outermost transport of a
+    transport chain."""
+    # XXX How should we prioritize transport matching? We currently
+    # just iterate the transport list that was provided by the flashproxy
+    for transport in transport_list:
+        addr_str = proxy_addr[0]
+        af = addr_af(addr_str)
+
+        try:
+            REGS = get_regs(af, transport)
+        except UnknownTransport as e:
+            log(u"%s" % e)
+            continue # move to the next transport
+
+        return REGS.fetch()
+
+    raise UnknownTransport("Could not find registration for transport list: %s" % str(transport_list))
 
 def get_check_back_in_for_proxy(proxy_addr):
     """Get a CHECK-BACK-IN interval suitable for this proxy."""
@@ -323,7 +351,7 @@ def put_reg(reg):
     """Add a registration."""
     addr_str = reg.host
     af = addr_af(addr_str)
-    REGS = regs_for_af(af)
+    REGS = get_regs(af, get_outermost_transport(reg.transport_chain))
     return REGS.add(reg)
 
 def main():





More information about the tor-commits mailing list