commit 9c570dd3a0d8c9c86c92b9bab7a0543dfa92e4c9 Author: David Fifield david@bamsoftware.com Date: Wed Sep 19 15:21:29 2012 -0700
Move get_reg and put_reg into fac.py. --- facilitator/fac.py | 53 +++++++++++++++++++++++++++++++++++++++ facilitator/facilitator.cgi | 58 +----------------------------------------- 2 files changed, 55 insertions(+), 56 deletions(-)
diff --git a/facilitator/fac.py b/facilitator/fac.py index 494b378..cb77ccc 100644 --- a/facilitator/fac.py +++ b/facilitator/fac.py @@ -181,3 +181,56 @@ def render_transaction(command, *params): for key, value in params: parts.append("%s=%s" % (key, quote_string(value))) return " ".join(parts) + +def fac_socket(facilitator_addr): + return socket.create_connection(facilitator_addr, 1.0).makefile() + +def transact(f, command, *params): + transaction = render_transaction(command, *params) + print >> f, transaction + f.flush() + line = f.readline() + if not (len(line) > 0 and line[-1] == '\n'): + raise ValueError("No newline at end of string returned by facilitator") + return parse_transaction(line[:-1]) + +def put_reg(facilitator_addr, client_addr, registrant_addr): + """Send a registration to the facilitator using a one-time socket. Returns + true iff the command was successful.""" + f = fac_socket(facilitator_addr) + try: + command, params = transact(f, "PUT", ("CLIENT", format_addr(client_addr)), ("FROM", format_addr(registrant_addr))) + finally: + f.close() + return command == "OK" + +def get_reg(facilitator_addr, proxy_addr): + """Get a registration from the facilitator using a one-time socket. Returns + a dict with keys "client" and "relay" if successful, or a dict with the key + "client" mapped to the value "" if there are no registrations available for + proxy_addr. Raises an exception otherwise.""" + f = fac_socket(facilitator_addr) + try: + command, params = transact(f, "GET", ("FROM", format_addr(proxy_addr))) + finally: + f.close() + if command == "NONE": + return { + "client": "" + } + elif command == "OK": + client_spec = param_first("CLIENT", params) + relay_spec = param_first("RELAY", params) + if not client_spec: + raise ValueError("Facilitator did not return CLIENT") + if not relay_spec: + raise ValueError("Facilitator did not return RELAY") + # Check the syntax returned by the facilitator. + client = parse_addr_spec(client_spec) + relay = parse_addr_spec(relay_spec) + return { + "client": format_addr(client), + "relay": format_addr(relay), + } + else: + raise ValueError("Facilitator response was not "OK"") diff --git a/facilitator/facilitator.cgi b/facilitator/facilitator.cgi index 6ccb479..2ef4cfa 100755 --- a/facilitator/facilitator.cgi +++ b/facilitator/facilitator.cgi @@ -17,57 +17,6 @@ Status: %d\r \r""" % status sys.exit()
-def fac_socket(): - return socket.create_connection(FACILITATOR_ADDR, 1.0).makefile() - -def transact(f, command, *params): - transaction = fac.render_transaction(command, *params) - print >> f, transaction - f.flush() - line = f.readline() - if not (len(line) > 0 and line[-1] == '\n'): - raise ValueError("No newline at end of string returned by facilitator") - return fac.parse_transaction(line[:-1]) - -def put_reg(client_addr, registrant_addr): - f = fac_socket() - try: - command, params = transact(f, "PUT", ("CLIENT", fac.format_addr(client_addr)), ("FROM", fac.format_addr(registrant_addr))) - finally: - f.close() - if command == "OK": - pass - else: - exit_error(500) - -def get_reg(proxy_addr): - f = fac_socket() - try: - command, params = transact(f, "GET", ("FROM", fac.format_addr(proxy_addr))) - finally: - f.close() - if command == "NONE": - return { - "client": "" - } - elif command == "OK": - client_spec = fac.param_first("CLIENT", params) - relay_spec = fac.param_first("RELAY", params) - if not client_spec or not relay_spec: - exit_error(500) - try: - # Check the syntax returned by the backend. - client = fac.parse_addr_spec(client_spec) - relay = fac.parse_addr_spec(relay_spec) - except ValueError: - exit_error(500) - return { - "client": fac.format_addr(client), - "relay": fac.format_addr(relay), - } - else: - exit_error(500) - method = os.environ.get("REQUEST_METHOD") path_info = os.environ.get("PATH_INFO") proxy_addr = (os.environ.get("REMOTE_ADDR"), None) @@ -83,7 +32,7 @@ def do_get(): if path != "/": exit_error(400) try: - reg = get_reg(proxy_addr) or "" + reg = fac.get_reg(FACILITATOR_ADDR, proxy_addr) or "" except: exit_error(500) # Allow XMLHttpRequest from any domain. http://www.w3.org/TR/cors/. @@ -106,10 +55,7 @@ def do_post(): client_addr = fac.parse_addr_spec(client_spec, defhost=proxy_addr[0]) except ValueError: exit_error(400) - try: - put_reg(client_addr, proxy_addr) - except: - raise + if not fac.put_reg(FACILITATOR_ADDR, client_addr, proxy_addr): exit_error(500) print """\ Status: 200\r
tor-commits@lists.torproject.org