commit e9bdc091ca2c35f013f338552ea01cf966806eb9 Author: Ximin Luo infinity0@gmx.com Date: Tue Oct 8 16:50:46 2013 +0100
Move util classes to fac.py since they'll be needed later, and rename "Reg" to more general "Endpoint" --- facilitator/fac.py | 31 +++++++++++++++++++++++++++++++ facilitator/facilitator | 35 +++-------------------------------- facilitator/facilitator-test | 15 ++++++++------- 3 files changed, 42 insertions(+), 39 deletions(-)
diff --git a/facilitator/fac.py b/facilitator/fac.py index 9cbfa79..cedadd8 100644 --- a/facilitator/fac.py +++ b/facilitator/fac.py @@ -5,6 +5,7 @@ import socket import stat import subprocess import pwd +from collections import namedtuple
# Return true iff the given fd is readable, writable, and executable only by its # owner. @@ -146,6 +147,36 @@ def format_addr(addr): raise ValueError("host and port may not both be None") return u"%s%s" % (host_str, port_str)
+ +class Transport(namedtuple("Transport", "prefix suffix")): + @classmethod + def parse(cls, transport): + if isinstance(transport, cls): + return transport + elif type(transport) == str: + if "|" in transport: + prefix, suffix = transport.rsplit("|", 1) + else: + prefix, suffix = "", transport + return cls(prefix, suffix) + else: + raise ValueError("could not parse transport: %s" % transport) + + def __init__(self, prefix, suffix): + if not suffix: + raise ValueError("suffix (proxy) part of transport must be non-empty: %s" % str(self)) + + def __str__(self): + return "%s|%s" % (self.prefix, self.suffix) if self.prefix else self.suffix + + +class Endpoint(namedtuple("Endpoint", "addr transport")): + @classmethod + def parse(cls, spec, transport, defhost = None, defport = None): + host, port = parse_addr_spec(spec, defhost, defport) + return cls((host, port), Transport.parse(transport)) + + def skip_space(pos, line): """Skip a (possibly empty) sequence of space characters (the ASCII character '\x20' exactly). Returns a pair (pos, num_skipped).""" diff --git a/facilitator/facilitator b/facilitator/facilitator index 9c8de92..f3ae79b 100755 --- a/facilitator/facilitator +++ b/facilitator/facilitator @@ -8,9 +8,9 @@ import sys import threading import time import traceback -from collections import namedtuple
import fac +from fac import Transport, Endpoint
LISTEN_ADDRESS = "127.0.0.1" DEFAULT_LISTEN_PORT = 9002 @@ -80,35 +80,6 @@ def log(msg): options.log_file.flush()
-class Transport(namedtuple("Transport", "prefix suffix")): - @classmethod - def parse(cls, transport): - if isinstance(transport, cls): - return transport - elif type(transport) == str: - if "|" in transport: - prefix, suffix = transport.rsplit("|", 1) - else: - prefix, suffix = "", transport - return cls(prefix, suffix) - else: - raise ValueError("could not parse transport: %s" % transport) - - def __init__(self, prefix, suffix): - if not suffix: - raise ValueError("suffix (proxy) part of transport must be non-empty: %s" % str(self)) - - def __str__(self): - return "%s|%s" % (self.prefix, self.suffix) if self.prefix else self.suffix - - -class Reg(namedtuple("Reg", "addr transport")): - @classmethod - def parse(cls, spec, transport, defhost = None, defport = None): - host, port = fac.parse_addr_spec(spec, defhost, defport) - return cls((host, port), Transport.parse(transport)) - - class Endpoints(object): """ Tracks endpoints (either client/server) and the transports they support. @@ -261,7 +232,7 @@ class Endpoints(object): # assume servers never run out client_transport = ptsClient._endpoints[client_addr] server_transport = ptsServer._endpoints[server_addr] - return Reg(client_addr, client_transport), Reg(server_addr, server_transport) + return Endpoint(client_addr, client_transport), Endpoint(server_addr, server_transport)
class Handler(SocketServer.StreamRequestHandler): @@ -398,7 +369,7 @@ class Handler(SocketServer.StreamRequestHandler): return self.error(u"PUT missing CLIENT param")
try: - reg = Reg.parse(client_spec, transport) + reg = Endpoint.parse(client_spec, transport) except (UnknownTransport, ValueError) as e: # XXX should we throw a better error message to the client? Is it possible? return self.error(u"syntax error in %s: %%(cause)s" % safe_str(repr(client_spec)), e) diff --git a/facilitator/facilitator-test b/facilitator/facilitator-test index b81b84e..6709221 100755 --- a/facilitator/facilitator-test +++ b/facilitator/facilitator-test @@ -7,8 +7,9 @@ import tempfile import time import unittest
-from facilitator import Transport, Reg, Endpoints, parse_relay_file +from facilitator import Endpoints, parse_relay_file import fac +from fac import Transport, Endpoint
FACILITATOR_HOST = "127.0.0.1" FACILITATOR_PORT = 39002 # diff port to not conflict with production service @@ -114,7 +115,7 @@ class EndpointsTest(unittest.TestCase): self.pts2.addEndpoint("B", "a|p") self.pts2.addEndpoint("C", "b|p") self.pts2.addEndpoint("D", "a|q") - expected = (Reg("A", Transport("a","p")), Reg("B", Transport("a","p"))) + expected = (Endpoint("A", Transport("a","p")), Endpoint("B", Transport("a","p"))) empty = Endpoints.EMPTY_MATCH self.assertEquals(expected, Endpoints.match(self.pts, self.pts2, ["p"])) self.assertEquals(empty, Endpoints.match(self.pts, self.pts2, ["x"])) @@ -123,7 +124,7 @@ class EndpointsTest(unittest.TestCase): self.pts.addEndpoint("A", "a|p") self.pts2 = Endpoints(af=socket.AF_INET) self.pts2.addEndpoint("B", "a|q") - expected = (Reg("A", Transport("a","p")), Reg("B", Transport("a","q"))) + expected = (Endpoint("A", Transport("a","p")), Endpoint("B", Transport("a","q"))) empty = Endpoints.EMPTY_MATCH self.assertEquals(expected, Endpoints.match(self.pts, self.pts2, ["p", "q"])) self.assertEquals(empty, Endpoints.match(self.pts, self.pts2, ["p"])) @@ -134,7 +135,7 @@ class EndpointsTest(unittest.TestCase): self.pts.addEndpoint("A", "p") self.pts2 = Endpoints(af=socket.AF_INET) self.pts2.addEndpoint("B", "p") - expected = (Reg("A", Transport("","p")), Reg("B", Transport("","p"))) + expected = (Endpoint("A", Transport("","p")), Endpoint("B", Transport("","p"))) empty = Endpoints.EMPTY_MATCH self.assertEquals(expected, Endpoints.match(self.pts, self.pts2, ["p"])) self.assertEquals(empty, Endpoints.match(self.pts, self.pts2, ["x"])) @@ -149,9 +150,9 @@ class EndpointsTest(unittest.TestCase): self.pts2.addEndpoint("F", "p") # this test ensures we have a sane policy for selecting between prefix pools expected = set() - expected.add((Reg("A", Transport("a","p")), Reg("D", Transport("a","p")))) - expected.add((Reg("B", Transport("b","p")), Reg("E", Transport("b","p")))) - expected.add((Reg("C", Transport("","p")), Reg("F", Transport("","p")))) + expected.add((Endpoint("A", Transport("a","p")), Endpoint("D", Transport("a","p")))) + expected.add((Endpoint("B", Transport("b","p")), Endpoint("E", Transport("b","p")))) + expected.add((Endpoint("C", Transport("","p")), Endpoint("F", Transport("","p")))) result = set() result.add(Endpoints.match(self.pts, self.pts2, ["p"])) result.add(Endpoints.match(self.pts, self.pts2, ["p"]))
tor-commits@lists.torproject.org