aboutsummaryrefslogtreecommitdiff
path: root/src/or/relay.c
diff options
context:
space:
mode:
authorRoger Dingledine <arma@torproject.org>2006-07-18 00:59:46 +0000
committerRoger Dingledine <arma@torproject.org>2006-07-18 00:59:46 +0000
commit388ac4126a1fbd95dec063eec2740bb7ebf1cfa3 (patch)
tree46a5cfee345f134d603c99fd39c23c5d7a1cc92e /src/or/relay.c
parenta8444c6f53b22387ee86c50e899fd04b6f826659 (diff)
downloadtor-388ac4126a1fbd95dec063eec2740bb7ebf1cfa3.tar
tor-388ac4126a1fbd95dec063eec2740bb7ebf1cfa3.tar.gz
If we are using an exit enclave and we can't connect, e.g. because
its webserver is misconfigured to not listen on localhost, then back off and try connecting from somewhere else before we fail. svn:r6783
Diffstat (limited to 'src/or/relay.c')
-rw-r--r--src/or/relay.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/src/or/relay.c b/src/or/relay.c
index 95b999c72..7dc7d3b7b 100644
--- a/src/or/relay.c
+++ b/src/or/relay.c
@@ -696,11 +696,21 @@ connection_edge_process_end_not_open(
/* rewrite it to an IP if we learned one. */
addressmap_rewrite(conn->socks_request->address,
sizeof(conn->socks_request->address));
+ if (conn->chosen_exit_optional) { /* stop wanting a specific exit */
+ conn->chosen_exit_optional = 0;
+ tor_free(conn->chosen_exit_name);
+ }
if (connection_ap_detach_retriable(conn, circ) >= 0)
return 0;
/* else, conn will get closed below */
break;
+ case END_STREAM_REASON_CONNECTREFUSED:
+ if (!conn->chosen_exit_optional)
+ break; /* break means it'll close, below */
+ /* Else fall through: expire this circuit, clear the
+ * chosen_exit_name field, and try again. */
case END_STREAM_REASON_RESOLVEFAILED:
+ case END_STREAM_REASON_TIMEOUT:
case END_STREAM_REASON_MISC:
if (client_dns_incr_failures(conn->socks_request->address)
< MAX_RESOLVE_FAILURES) {
@@ -709,6 +719,10 @@ connection_edge_process_end_not_open(
tor_assert(circ->timestamp_dirty);
circ->timestamp_dirty -= get_options()->MaxCircuitDirtiness;
+ if (conn->chosen_exit_optional) { /* stop wanting a specific exit */
+ conn->chosen_exit_optional = 0;
+ tor_free(conn->chosen_exit_name);
+ }
if (connection_ap_detach_retriable(conn, circ) >= 0)
return 0;
/* else, conn will get closed below */
@@ -729,6 +743,10 @@ connection_edge_process_end_not_open(
exitrouter->exit_policy =
router_parse_addr_policy_from_string("reject *:*", -1);
}
+ if (conn->chosen_exit_optional) { /* stop wanting a specific exit */
+ conn->chosen_exit_optional = 0;
+ tor_free(conn->chosen_exit_name);
+ }
if (connection_ap_detach_retriable(conn, circ) >= 0)
return 0;
/* else, will close below */