[tor-commits] [flashproxy/js] Make a functioning proxy pair.
dcf at torproject.org
dcf at torproject.org
Fri Mar 30 08:13:35 UTC 2012
commit b7ce3b5be07dbe6caba6db01964da7e69c37d61e
Author: David Fifield <david at bamsoftware.com>
Date: Fri Mar 30 00:23:17 2012 -0700
Make a functioning proxy pair.
---
flashproxy.js | 128 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 128 insertions(+), 0 deletions(-)
diff --git a/flashproxy.js b/flashproxy.js
index 90a8869..59bf103 100644
--- a/flashproxy.js
+++ b/flashproxy.js
@@ -130,6 +130,8 @@ function FlashProxy()
when: function() { return 0; }
};
+ this.proxy_pairs = [];
+
this.badge_elem = debug_div;
this.badge_elem.setAttribute("id", "flashproxy-badge");
@@ -227,8 +229,134 @@ function FlashProxy()
};
this.make_proxy_pair = function(client_addr, relay_addr) {
+ var proxy_pair;
+
puts("make_proxy_pair");
+
+ proxy_pair = new ProxyPair(client_addr, relay_addr);
+ this.proxy_pairs.push(proxy_pair);
+ proxy_pair.connect();
};
+
+ /* An instance of a client-relay connection. */
+ function ProxyPair(client_addr, relay_addr)
+ {
+ function log(s)
+ {
+ puts(s)
+ }
+
+ this.client_addr = client_addr;
+ this.relay_addr = relay_addr;
+
+ this.c2r_schedule = [];
+ this.r2c_schedule = [];
+
+ this.flush_timeout_id = null;
+
+ /* Return a function that shows an error message and closes the other
+ half of a communication pair. */
+ this.make_onerror_callback = function(partner)
+ {
+ return function(event) {
+ var ws = event.target;
+
+ log(ws.label + ": error.");
+ partner.close();
+ // dispatchEvent(new Event(Event.COMPLETE));
+ };
+ };
+
+ this.onopen_callback = function(event) {
+ var ws = event.target;
+
+ log(ws.label + ": connected.");
+ }.bind(this);
+
+ this.onclose_callback = function(event) {
+ var ws = event.target;
+
+ log(ws.label + ": closed.");
+ this.flush();
+ }.bind(this);
+
+ this.onmessage_client_to_relay = function(event) {
+ this.c2r_schedule.push(event.data);
+ this.flush();
+ }.bind(this);
+
+ this.onmessage_relay_to_client = function(event) {
+ this.r2c_schedule.push(event.data);
+ this.flush();
+ }.bind(this);
+
+ this.connect = function() {
+ log("Client: connecting.");
+ this.client_s = make_websocket(this.client_addr);
+
+ log("Relay: connecting.");
+ this.relay_s = make_websocket(this.relay_addr);
+
+ this.client_s.label = "Client";
+ this.client_s.onopen = this.onopen_callback;
+ this.client_s.onclose = this.onclose_callback;
+ this.client_s.onerror = this.make_onerror_callback(this.relay_s);
+ this.client_s.onmessage = this.onmessage_client_to_relay;
+
+ this.relay_s.label = "Relay";
+ this.relay_s.onopen = this.onopen_callback;
+ this.relay_s.onclose = this.onclose_callback;
+ this.relay_s.onerror = this.make_onerror_callback(this.client_s);
+ this.relay_s.onmessage = this.onmessage_relay_to_client;
+ };
+
+ function is_open(ws)
+ {
+ return ws.readyState == ws.OPEN;
+ }
+
+ function is_closed(ws)
+ {
+ return ws.readyState == ws.CLOSED;
+ }
+
+ /* Send as much data as the rate limit currently allows. */
+ this.flush = function() {
+ var busy;
+
+ if (this.flush_timeout_id)
+ clearTimeout(this.flush_timeout_id);
+ this.flush_timeout_id = null;
+
+ busy = true;
+ while (busy && !rate_limit.is_limited()) {
+ busy = false;
+ if (is_open(this.client_s) && this.r2c_schedule.length > 0) {
+ this.client_s.send(this.r2c_schedule.shift());
+ busy = true;
+ }
+ if (is_open(this.relay_s) && this.c2r_schedule.length > 0) {
+ this.relay_s.send(this.c2r_schedule.shift());
+ busy = true;
+ }
+ }
+
+ if (is_closed(this.relay_s) && !is_closed(this.client_s) && this.r2c_schedule.length == 0) {
+ log("Client: closing.");
+ this.client_s.close();
+ }
+ if (is_closed(this.client_s) && !is_closed(this.relay_s) && this.c2r_schedule.length == 0) {
+ log("Relay: closing.");
+ this.relay_s.close();
+ }
+
+ if (is_closed(this.client_s) && is_closed(this.relay_s))
+ // dispatchEvent(new Event(Event.COMPLETE));
+ ;
+ else if (this.r2c_schedule.length > 0 || this.c2r_schedule.length > 0)
+ this.flush_timeout_id = setTimeout(this.flush, rate_limit.when() * 1000);
+ };
+ }
}
/* This is the non-functional badge that occupies space when
More information about the tor-commits
mailing list