aboutsummaryrefslogtreecommitdiff
path: root/src/or/directory.c
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2007-10-10 20:28:01 +0000
committerNick Mathewson <nickm@torproject.org>2007-10-10 20:28:01 +0000
commitdace37aee84501f26842a021e63f1b2e5a304643 (patch)
treed2f4c7c14757daf21227c6edb9fcf787cc2d49d4 /src/or/directory.c
parentd9a99b9ba6582d40a929838e5af771204b9c964b (diff)
downloadtor-dace37aee84501f26842a021e63f1b2e5a304643.tar
tor-dace37aee84501f26842a021e63f1b2e5a304643.tar.gz
r15656@catbus: nickm | 2007-10-10 16:23:18 -0400
Fix the implementation of if-modified-since for certificates so that it applies to all types of certificate requests. Note that the kind of consensus that matters already has a working if-modified-since. svn:r11852
Diffstat (limited to 'src/or/directory.c')
-rw-r--r--src/or/directory.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/src/or/directory.c b/src/or/directory.c
index 9dd218b4b..f1d534943 100644
--- a/src/or/directory.c
+++ b/src/or/directory.c
@@ -2161,7 +2161,9 @@ directory_handle_command_get(dir_connection_t *conn, const char *headers,
if (!strcmpstart(url,"/tor/status-vote/current/") ||
!strcmpstart(url,"/tor/status-vote/next/")) {
- /*XXXX020 implement if-modified-since */
+ /* XXXX If-modified-since is only the implemented for the current
+ * consensus: that's probably fine, since it's the only vote document
+ * people fetch much.*/
int current = 1;
ssize_t body_len = 0;
ssize_t estimated_len = 0;
@@ -2321,7 +2323,6 @@ directory_handle_command_get(dir_connection_t *conn, const char *headers,
}
if (!strcmpstart(url,"/tor/keys/")) {
- /*XXXX020 implement if-modified-since */
smartlist_t *certs = smartlist_create();
ssize_t len = -1;
if (!strcmp(url, "/tor/keys/all")) {
@@ -2331,8 +2332,7 @@ directory_handle_command_get(dir_connection_t *conn, const char *headers,
if (!ds->v3_certs)
continue;
SMARTLIST_FOREACH(ds->v3_certs, authority_cert_t *, cert,
- if (cert->cache_info.published_on >= if_modified_since)
- smartlist_add(certs, cert));
+ smartlist_add(certs, cert));
});
} else if (!strcmp(url, "/tor/keys/authority")) {
authority_cert_t *cert = get_my_v3_authority_cert();
@@ -2368,6 +2368,13 @@ directory_handle_command_get(dir_connection_t *conn, const char *headers,
smartlist_free(certs);
goto keys_done;
}
+ SMARTLIST_FOREACH(certs, authority_cert_t *, c,
+ if (cert->cache_info.published_on < if_modified_since)
+ SMARTLIST_DEL_CURRENT(certs, c));
+ if (!smartlist_len(certs)) {
+ write_status_line(conn, 304, "Not modified");
+ goto keys_done;
+ }
len = 0;
SMARTLIST_FOREACH(certs, authority_cert_t *, c,
len += c->cache_info.signed_descriptor_len);