From a63eb68fe1546b7e1bebfa192b8ef0bdcc4c6980 Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Mon, 7 Jan 2008 17:49:13 +0000 Subject: [PATCH] r17495@catbus: nickm | 2008-01-07 12:48:56 -0500 Consequence of fix for 539: when a client gets a 503 response with a nontrivial body, pretend it got a 200 response. This lets clients use information erroneously sent to them by old buggy servers. svn:r13054 --- ChangeLog | 4 ++++ src/or/directory.c | 8 +++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 1b5bfcaa2..f18e01812 100644 --- a/ChangeLog +++ b/ChangeLog @@ -10,6 +10,10 @@ Changes in version 0.2.0.16-alpha - 2008-01-?? - Configuration files now accept C-style strings as values. This helps encode characters not allowed in the current configuration file format, such as newline or #. Addresses bug 557. + - Although we fixed bug 539 (where servers would send HTTP status 503 + responses _and_ send a body too), there are still servers out there + that haven't upgraded. Therefore, make clients parse such bodies + when they receive them. o Minor performance improvements: - Reference-count and share copies of address policy entries; only diff --git a/src/or/directory.c b/src/or/directory.c index 18c66f52b..c4c491f43 100644 --- a/src/or/directory.c +++ b/src/or/directory.c @@ -1280,7 +1280,7 @@ connection_dir_client_reached_eof(dir_connection_t *conn) } (void) skewed; /* skewed isn't used yet. */ - if (status_code == 503) { + if (status_code == 503 && body_len < 16) { routerstatus_t *rs; trusted_dir_server_t *ds; log_info(LD_DIR,"Received http status code %d (%s) from server " @@ -1294,6 +1294,12 @@ connection_dir_client_reached_eof(dir_connection_t *conn) tor_free(body); tor_free(headers); tor_free(reason); return -1; + } else if (status_code == 503) { + /* XXXX022 Remove this once every server with bug 539 is obsolete. */ + log_info(LD_DIR, "Server at '%s:%d' sent us a 503 response, but included " + "a body anyway. We'll pretend it gave us a 200.", + conn->_base.address, conn->_base.port); + status_code = 200; } plausible = body_is_plausible(body, body_len, conn->_base.purpose);