summaryrefslogtreecommitdiff
path: root/src/or/directory.c
diff options
context:
space:
mode:
authorRoger Dingledine <arma@torproject.org>2017-09-13 23:19:04 -0400
committerRoger Dingledine <arma@torproject.org>2017-09-14 03:02:37 -0400
commiteb429232ef11f15f8a9f2ad60cc106103648a525 (patch)
tree5ce7f7a428b20ad6e486aeb33a045a11b07f5129 /src/or/directory.c
parentdcd0aea85e9315c53a6b70a4a2b62ec65d539896 (diff)
downloadtor-eb429232ef11f15f8a9f2ad60cc106103648a525.tar.gz
tor-eb429232ef11f15f8a9f2ad60cc106103648a525.zip
Make dir servers include a "Date:" http header more often
Directory servers now include a "Date:" http header for response codes other than 200. Clients starting with a skewed clock and a recent consensus were getting "304 Not modified" responses from directory authorities, so without a Date header the client would never hear about a wrong clock. Fixes bug 23499; bugfix on 0.0.8rc1.
Diffstat (limited to 'src/or/directory.c')
-rw-r--r--src/or/directory.c22
1 files changed, 18 insertions, 4 deletions
diff --git a/src/or/directory.c b/src/or/directory.c
index 9551b41556..0c79b4659a 100644
--- a/src/or/directory.c
+++ b/src/or/directory.c
@@ -3479,14 +3479,28 @@ static void
write_http_status_line(dir_connection_t *conn, int status,
const char *reason_phrase)
{
- char buf[256];
- if (!reason_phrase)
+ char buf[256+RFC1123_TIME_LEN+1];
+ char *datestring = NULL;
+
+ if (!reason_phrase) { /* bullet-proofing */
reason_phrase = "unspecified";
- if (tor_snprintf(buf, sizeof(buf), "HTTP/1.0 %d %s\r\n\r\n",
- status, reason_phrase) < 0) {
+ }
+
+ if (server_mode(get_options())) {
+ /* include the Date: header, but only if we're a relay or bridge */
+ char datebuf[RFC1123_TIME_LEN+1];
+ format_rfc1123_time(datebuf, time(NULL));
+ tor_asprintf(&datestring, "Date: %s\r\n", datebuf);
+ }
+
+ if (tor_snprintf(buf, sizeof(buf), "HTTP/1.0 %d %s\r\n%s\r\n",
+ status, reason_phrase, datestring?datestring:"") < 0) {
log_warn(LD_BUG,"status line too long.");
+ tor_free(datestring);
return;
}
+ tor_free(datestring);
+
log_debug(LD_DIRSERV,"Wrote status 'HTTP/1.0 %d %s'", status, reason_phrase);
connection_buf_add(buf, strlen(buf), TO_CONN(conn));
}