diff options
author | David Kalnischkies <kalnischkies@gmail.com> | 2011-04-29 01:20:44 +0200 |
---|---|---|
committer | David Kalnischkies <kalnischkies@gmail.com> | 2011-04-29 01:20:44 +0200 |
commit | 4992469e453490e4c104a1b6021e48c725c499b8 (patch) | |
tree | 0a1c96a927c24591806a53a4e0caca05d61f73fd | |
parent | c5bcc6074c1e0f9881529709a8489cccb674a3d4 (diff) |
Location header in redirects should be absolute URI, but some
servers just send an absolute path so still deal with it properly
-rw-r--r-- | debian/changelog | 4 | ||||
-rw-r--r-- | methods/http.cc | 18 |
2 files changed, 20 insertions, 2 deletions
diff --git a/debian/changelog b/debian/changelog index 143661b87..fd10e0fcf 100644 --- a/debian/changelog +++ b/debian/changelog @@ -48,8 +48,10 @@ apt (0.8.14.2) UNRELEASED; urgency=low * methods/http.cc: - add config option to ignore a closed stdin to be able to easily use the method as a simple standalone downloader + - Location header in redirects should be absolute URI, but some + servers just send an absolute path so still deal with it properly - -- David Kalnischkies <kalnischkies@gmail.com> Wed, 27 Apr 2011 10:30:47 +0200 + -- David Kalnischkies <kalnischkies@gmail.com> Wed, 27 Apr 2011 17:37:58 +0200 apt (0.8.14.1) unstable; urgency=low diff --git a/methods/http.cc b/methods/http.cc index 26abc14d9..d3e00553c 100644 --- a/methods/http.cc +++ b/methods/http.cc @@ -948,7 +948,23 @@ HttpMethod::DealWithHeaders(FetchResult &Res,ServerState *Srv) && Srv->Result != 304 // Not Modified && Srv->Result != 306)) // (Not part of HTTP/1.1, reserved) { - if (!Srv->Location.empty()) + if (Srv->Location.empty() == true); + else if (Srv->Location[0] == '/' && Queue->Uri.empty() == false) + { + URI Uri = Queue->Uri; + if (Uri.Host.empty() == false) + { + if (Uri.Port != 0) + strprintf(NextURI, "http://%s:%u", Uri.Host.c_str(), Uri.Port); + else + NextURI = "http://" + Uri.Host; + } + else + NextURI.clear(); + NextURI.append(Srv->Location); + return TRY_AGAIN_OR_REDIRECT; + } + else { NextURI = Srv->Location; return TRY_AGAIN_OR_REDIRECT; |