]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
r15656@catbus: nickm | 2007-10-10 16:23:18 -0400
authorNick Mathewson <nickm@torproject.org>
Wed, 10 Oct 2007 20:28:01 +0000 (20:28 +0000)
committerNick Mathewson <nickm@torproject.org>
Wed, 10 Oct 2007 20:28:01 +0000 (20:28 +0000)
 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

ChangeLog
src/or/directory.c

index 395e5360d3fc87f2a1842e078cb1bd2633e360ec..7e44a2fc2854f7c4baf26edf41c63ab878768292 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -31,6 +31,8 @@ Changes in version 0.2.0.8-alpha - 2007-10-12
     - Caches now download v3 network status documents as needed.
     - Send a 503 when low on bandwidth and a vote, consensus, or certificate
       is requested.
+    - If-modified-since is now implemented properly for all kinds of
+      certificate requests.
 
   o Minor features (network statuses):
     - Tweak the implementation of proposal 109 slightly: allow at most
index 9dd218b4b003440b6811dd471ccb7aa5c109387e..f1d534943a6f373c7e6e02ed5eb376f8b0ff395a 100644 (file)
@@ -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);