summaryrefslogtreecommitdiff
path: root/src/or/routerlist.c
diff options
context:
space:
mode:
authorteor (Tim Wilson-Brown) <teor2345@gmail.com>2016-07-01 10:18:28 +1000
committerteor (Tim Wilson-Brown) <teor2345@gmail.com>2016-07-01 14:00:25 +1000
commitf90bfaae8dabb6acf7656b20f1bc0513a683a0dd (patch)
tree7485daa2b888eae2ce8d5e5116c229b8bf8851ac /src/or/routerlist.c
parentd3ca6fe475ab5e0cc9c80e0ff984bebe4160f689 (diff)
downloadtor-f90bfaae8dabb6acf7656b20f1bc0513a683a0dd.tar.gz
tor-f90bfaae8dabb6acf7656b20f1bc0513a683a0dd.zip
Refactor duplicate code in authority_certs_fetch_missing
Diffstat (limited to 'src/or/routerlist.c')
-rw-r--r--src/or/routerlist.c69
1 files changed, 31 insertions, 38 deletions
diff --git a/src/or/routerlist.c b/src/or/routerlist.c
index cae0241343..c08d1a33f3 100644
--- a/src/or/routerlist.c
+++ b/src/or/routerlist.c
@@ -834,6 +834,33 @@ authority_cert_dl_looks_uncertain(const char *id_digest)
return n_failures >= N_AUTH_CERT_DL_FAILURES_TO_BUG_USER;
}
+/* Fetch the authority certificates specified in resource.
+ * If rs is not NULL, fetch from rs, otherwise, fetch from a random directory
+ * mirror. */
+static void
+authority_certs_fetch_resource_impl(const char *resource,
+ const routerstatus_t *rs)
+{
+ if (rs) {
+ /* If we've just downloaded a consensus from a directory, re-use that
+ * directory */
+ int get_via_tor = purpose_needs_anonymity(
+ DIR_PURPOSE_FETCH_CERTIFICATE, 0);
+ const dir_indirection_t indirection = get_via_tor ? DIRIND_ANONYMOUS
+ : DIRIND_ONEHOP;
+ directory_initiate_command_routerstatus(rs,
+ DIR_PURPOSE_FETCH_CERTIFICATE,
+ 0, indirection, resource, NULL,
+ 0, 0);
+ } else {
+ /* Otherwise, we want certs from a random fallback or directory
+ * mirror, because they will almost always succeed. */
+ directory_get_from_dirserver(DIR_PURPOSE_FETCH_CERTIFICATE, 0,
+ resource, PDS_RETRY_IF_NO_SERVERS,
+ DL_WANT_ANY_DIRSERVER);
+ }
+}
+
/** Try to download any v3 authority certificates that we may be missing. If
* <b>status</b> is provided, try to get all the ones that were used to sign
* <b>status</b>. Additionally, try to have a non-expired certificate for
@@ -1072,25 +1099,8 @@ authority_certs_fetch_missing(networkstatus_t *status, time_t now,
if (smartlist_len(fps) > 1) {
resource = smartlist_join_strings(fps, "", 0, NULL);
-
- /* If we've just downloaded a consensus from a directory, re-use that
- * directory */
- if (rs) {
- int get_via_tor = purpose_needs_anonymity(
- DIR_PURPOSE_FETCH_CERTIFICATE, 0);
- const dir_indirection_t indirection = get_via_tor ? DIRIND_ANONYMOUS
- : DIRIND_ONEHOP;
- directory_initiate_command_routerstatus(rs,
- DIR_PURPOSE_FETCH_CERTIFICATE,
- 0, indirection, resource, NULL,
- 0, 0);
- } else {
- /* Otherwise, we want certs from a random fallback or directory
- * mirror, because they will almost always succeed. */
- directory_get_from_dirserver(DIR_PURPOSE_FETCH_CERTIFICATE, 0,
- resource, PDS_RETRY_IF_NO_SERVERS,
- DL_WANT_ANY_DIRSERVER);
- }
+ /* rs is the directory that just gave us a consensus or certificates */
+ authority_certs_fetch_resource_impl(resource, rs);
tor_free(resource);
}
/* else we didn't add any: they were all pending */
@@ -1133,25 +1143,8 @@ authority_certs_fetch_missing(networkstatus_t *status, time_t now,
if (smartlist_len(fp_pairs) > 1) {
resource = smartlist_join_strings(fp_pairs, "", 0, NULL);
-
- /* If we've just downloaded a consensus from a directory, re-use that
- * directory */
- if (rs) {
- int get_via_tor = purpose_needs_anonymity(
- DIR_PURPOSE_FETCH_CERTIFICATE, 0);
- const dir_indirection_t indirection = get_via_tor ? DIRIND_ANONYMOUS
- : DIRIND_ONEHOP;
- directory_initiate_command_routerstatus(rs,
- DIR_PURPOSE_FETCH_CERTIFICATE,
- 0, indirection, resource, NULL,
- 0, 0);
- } else {
- /* Otherwise, we want certs from a random fallback or directory
- * mirror, because they will almost always succeed. */
- directory_get_from_dirserver(DIR_PURPOSE_FETCH_CERTIFICATE, 0,
- resource, PDS_RETRY_IF_NO_SERVERS,
- DL_WANT_ANY_DIRSERVER);
- }
+ /* rs is the directory that just gave us a consensus or certificates */
+ authority_certs_fetch_resource_impl(resource, rs);
tor_free(resource);
}
/* else they were all pending */