summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Kalnischkies <kalnischkies@gmail.com>2011-04-29 01:20:44 +0200
committerDavid Kalnischkies <kalnischkies@gmail.com>2011-04-29 01:20:44 +0200
commit4992469e453490e4c104a1b6021e48c725c499b8 (patch)
tree0a1c96a927c24591806a53a4e0caca05d61f73fd
parentc5bcc6074c1e0f9881529709a8489cccb674a3d4 (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/changelog4
-rw-r--r--methods/http.cc18
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;