From 6f4501f96f9ea256ff580129ba3835e0d56c398a Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Mon, 30 Jan 2012 16:26:10 +0100 Subject: * methods/http{s,}.cc: - if a file without an extension is requested send an 'Accept: text/*' header to avoid that the server chooses unsupported compressed files in a content-negotation attempt (Closes: #657560) --- debian/changelog | 6 +++++- methods/http.cc | 14 +++++++++++++- methods/https.cc | 13 +++++++++++++ 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/debian/changelog b/debian/changelog index 12abea47d..69036a945 100644 --- a/debian/changelog +++ b/debian/changelog @@ -9,6 +9,10 @@ apt (0.8.16~exp13) UNRELEASED; urgency=low silbings for reinstallation as well (LP: #859188) * apt-pkg/contrib/configuration.cc: - do not stop parent transversal in FindDir if the value is empty + * methods/http{s,}.cc: + - if a file without an extension is requested send an 'Accept: text/*' + header to avoid that the server chooses unsupported compressed files + in a content-negotation attempt (Closes: #657560) [ Steve Langasek ] * cmdline/apt-get.cc: @@ -22,7 +26,7 @@ apt (0.8.16~exp13) UNRELEASED; urgency=low - use a signed int instead of short for score calculation as upgrades become so big now that it can overflow (Closes: #657732, LP: #917173) - -- David Kalnischkies Mon, 30 Jan 2012 13:07:30 +0100 + -- David Kalnischkies Mon, 30 Jan 2012 16:06:11 +0100 apt (0.8.16~exp12) experimental; urgency=low diff --git a/methods/http.cc b/methods/http.cc index b8ed43cd2..2721b1224 100644 --- a/methods/http.cc +++ b/methods/http.cc @@ -716,7 +716,19 @@ void HttpMethod::SendReq(FetchItem *Itm,CircleBuf &Out) } } - + // If we ask for uncompressed files servers might respond with content- + // negotation which lets us end up with compressed files we do not support, + // see 657029, 657560 and co, so if we have no extension on the request + // ask for text only. As a sidenote: If there is nothing to negotate servers + // seem to be nice and ignore it. + if (_config->FindB("Acquire::http::SendAccept", true) == true) + { + size_t const filepos = Itm->Uri.find_last_of('/'); + string const file = Itm->Uri.substr(filepos + 1); + if (flExtension(file) == file) + strcat(Buf,"Accept: text/*\r\n"); + } + string Req = Buf; // Check for a partial file diff --git a/methods/https.cc b/methods/https.cc index 6de18b8e0..4f2d581d2 100644 --- a/methods/https.cc +++ b/methods/https.cc @@ -242,6 +242,19 @@ bool HttpsMethod::Fetch(FetchItem *Itm) // error handling curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, curl_errorstr); + // If we ask for uncompressed files servers might respond with content- + // negotation which lets us end up with compressed files we do not support, + // see 657029, 657560 and co, so if we have no extension on the request + // ask for text only. As a sidenote: If there is nothing to negotate servers + // seem to be nice and ignore it. + if (_config->FindB("Acquire::https::SendAccept", _config->FindB("Acquire::http::SendAccept", true)) == true) + { + size_t const filepos = Itm->Uri.find_last_of('/'); + string const file = Itm->Uri.substr(filepos + 1); + if (flExtension(file) == file) + headers = curl_slist_append(headers, "Accept: text/*"); + } + // if we have the file send an if-range query with a range header if (stat(Itm->DestFile.c_str(),&SBuf) >= 0 && SBuf.st_size > 0) { -- cgit v1.2.3