bugfix: you mean we're supposed to reuse fresh descriptors and

refetch stale ones, not reuse stale ones and refetch fresh ones?


svn:r1667
This commit is contained in:
Roger Dingledine 2004-04-18 09:04:37 +00:00
parent bce1fc43a2
commit e9ebefc8bf

View File

@ -746,20 +746,35 @@ static int connection_ap_handshake_process_socks(connection_t *conn) {
} else { } else {
/* it's a hidden-service request */ /* it's a hidden-service request */
rend_cache_entry_t *entry; rend_cache_entry_t *entry;
int r;
strcpy(conn->rend_query, socks->address); /* this strcpy is safe -RD */ strcpy(conn->rend_query, socks->address); /* this strcpy is safe -RD */
log_fn(LOG_INFO,"Got a hidden service request for ID '%s'", conn->rend_query); log_fn(LOG_INFO,"Got a hidden service request for ID '%s'", conn->rend_query);
/* see if we already have it cached */ /* see if we already have it cached */
if (rend_cache_lookup_entry(conn->rend_query, &entry) == 1 && r = rend_cache_lookup_entry(conn->rend_query, &entry);
#define NUM_SECONDS_BEFORE_REFETCH (60*15) if(r<0) {
entry->received + NUM_SECONDS_BEFORE_REFETCH < time(NULL)) { log_fn(LOG_WARN,"Invalid service descriptor %s", conn->rend_query);
conn->state = AP_CONN_STATE_CIRCUIT_WAIT; return -1;
return connection_ap_handshake_attach_circuit(conn); }
} else { if(r==0) {
conn->state = AP_CONN_STATE_RENDDESC_WAIT; conn->state = AP_CONN_STATE_RENDDESC_WAIT;
log_fn(LOG_INFO, "Unknown descriptor %s. Fetching.", conn->rend_query);
rend_client_refetch_renddesc(conn->rend_query); rend_client_refetch_renddesc(conn->rend_query);
return 0; return 0;
} }
if(r>0) {
#define NUM_SECONDS_BEFORE_REFETCH (60*15)
if(time(NULL) - entry->received < NUM_SECONDS_BEFORE_REFETCH) {
conn->state = AP_CONN_STATE_CIRCUIT_WAIT;
log_fn(LOG_INFO, "Descriptor is here and fresh enough. Great.");
return connection_ap_handshake_attach_circuit(conn);
} else {
conn->state = AP_CONN_STATE_RENDDESC_WAIT;
log_fn(LOG_INFO, "Stale descriptor %s. Refetching.", conn->rend_query);
rend_client_refetch_renddesc(conn->rend_query);
return 0;
}
}
} }
return 0; return 0;
} }