diff --git a/changes/feature13211 b/changes/feature13211 new file mode 100644 index 0000000000..dcb01966c8 --- /dev/null +++ b/changes/feature13211 @@ -0,0 +1,6 @@ + o Major features (performance): + - Allow clients to use optimistic data when connecting to a hidden + service, which should cut out the initial round-trip for client-side + programs including Tor Browser. (Now that Tor 0.2.2.x is obsolete, + all hidden services should support server-side optimistic + data.) See proposal 181 for details. Implements ticket 13211. diff --git a/src/or/circuituse.c b/src/or/circuituse.c index c1a81520e7..9ea0023568 100644 --- a/src/or/circuituse.c +++ b/src/or/circuituse.c @@ -2110,14 +2110,17 @@ link_apconn_to_circ(entry_connection_t *apconn, origin_circuit_t *circ, /* See if we can use optimistic data on this circuit */ if (optimistic_data_enabled() && - circ->base_.purpose == CIRCUIT_PURPOSE_C_GENERAL) + (circ->base_.purpose == CIRCUIT_PURPOSE_C_GENERAL || + circ->base_.purpose == CIRCUIT_PURPOSE_C_REND_JOINED)) apconn->may_use_optimistic_data = 1; else apconn->may_use_optimistic_data = 0; log_info(LD_APP, "Looks like completed circuit to %s %s allow " "optimistic data for connection to %s", - /* node_describe() does the right thing if exitnode is NULL */ - safe_str_client(node_describe(exitnode)), + circ->base_.purpose == CIRCUIT_PURPOSE_C_GENERAL ? + /* node_describe() does the right thing if exitnode is NULL */ + safe_str_client(node_describe(exitnode)) : + "hidden service", apconn->may_use_optimistic_data ? "does" : "doesn't", safe_str_client(apconn->socks_request->address)); } diff --git a/src/or/connection_edge.c b/src/or/connection_edge.c index af1b5b6e29..522807d7ba 100644 --- a/src/or/connection_edge.c +++ b/src/or/connection_edge.c @@ -1767,7 +1767,8 @@ connection_ap_supports_optimistic_data(const entry_connection_t *conn) general circuit. */ if (edge_conn->on_circuit == NULL || edge_conn->on_circuit->state != CIRCUIT_STATE_OPEN || - edge_conn->on_circuit->purpose != CIRCUIT_PURPOSE_C_GENERAL) + (edge_conn->on_circuit->purpose != CIRCUIT_PURPOSE_C_GENERAL && + edge_conn->on_circuit->purpose != CIRCUIT_PURPOSE_C_REND_JOINED)) return 0; return conn->may_use_optimistic_data;