From eb429232ef11f15f8a9f2ad60cc106103648a525 Mon Sep 17 00:00:00 2001 From: Roger Dingledine Date: Wed, 13 Sep 2017 23:19:04 -0400 Subject: 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. --- changes/bug23499 | 6 ++++++ src/or/directory.c | 22 ++++++++++++++++++---- 2 files changed, 24 insertions(+), 4 deletions(-) create mode 100644 changes/bug23499 diff --git a/changes/bug23499 b/changes/bug23499 new file mode 100644 index 0000000000..e53b03c34e --- /dev/null +++ b/changes/bug23499 @@ -0,0 +1,6 @@ + o Minor bugfixes: + - 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. 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)); } -- cgit v1.2.3-54-g00ecf