Commit eb429232 authored by Roger Dingledine's avatar Roger Dingledine
Browse files

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.
parent dcd0aea8
Loading
Loading
Loading
Loading

changes/bug23499

0 → 100644
+6 −0
Original line number Diff line number Diff line
  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.
+18 −4
Original line number Diff line number Diff line
@@ -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));
}