From c34ea12ad509cb34c954ed574a301c3cbede55ec Mon Sep 17 00:00:00 2001
From: David Kalnischkies <kalnischkies@gmail.com>
Date: Tue, 10 May 2011 15:49:25 +0200
Subject: dequote URL taken from Location in redirects as we will otherwise
 quote an already quoted string in the request later (Closes: #602412)

---
 debian/changelog                                  |  4 ++-
 methods/http.cc                                   |  4 +--
 test/integration/skip-bug-602412-dequote-redirect | 36 +++++++++++++++++++++++
 3 files changed, 41 insertions(+), 3 deletions(-)
 create mode 100755 test/integration/skip-bug-602412-dequote-redirect

diff --git a/debian/changelog b/debian/changelog
index fd10e0fcf..125fa7f70 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -50,8 +50,10 @@ apt (0.8.14.2) UNRELEASED; urgency=low
       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
+    - dequote URL taken from Location in redirects as we will otherwise
+      quote an already quoted string in the request later (Closes: #602412)
 
- -- David Kalnischkies <kalnischkies@gmail.com>  Wed, 27 Apr 2011 17:37:58 +0200
+ -- David Kalnischkies <kalnischkies@gmail.com>  Tue, 10 May 2011 15:49:19 +0200
 
 apt (0.8.14.1) unstable; urgency=low
 
diff --git a/methods/http.cc b/methods/http.cc
index d3e00553c..13f9cbe06 100644
--- a/methods/http.cc
+++ b/methods/http.cc
@@ -961,12 +961,12 @@ HttpMethod::DealWithHeaders(FetchResult &Res,ServerState *Srv)
 	 }
 	 else
 	    NextURI.clear();
-	 NextURI.append(Srv->Location);
+	 NextURI.append(DeQuoteString(Srv->Location));
 	 return TRY_AGAIN_OR_REDIRECT;
       }
       else
       {
-         NextURI = Srv->Location;
+         NextURI = DeQuoteString(Srv->Location);
          return TRY_AGAIN_OR_REDIRECT;
       }
       /* else pass through for error message */
diff --git a/test/integration/skip-bug-602412-dequote-redirect b/test/integration/skip-bug-602412-dequote-redirect
new file mode 100755
index 000000000..a63d36246
--- /dev/null
+++ b/test/integration/skip-bug-602412-dequote-redirect
@@ -0,0 +1,36 @@
+#!/bin/sh
+set -e
+
+TESTDIR=$(readlink -f $(dirname $0))
+. $TESTDIR/framework
+setupenvironment
+configarchitecture 'i386'
+
+if ! which lighttpd > /dev/null; then
+	msgdie 'You need lighttpd for this testcase, sorry…'
+	exit 1
+fi
+
+buildsimplenativepackage 'unrelated' 'all' '0.5~squeeze1' 'unstable'
+
+setupaptarchive
+
+echo "server.modules = ( \"mod_redirect\" )
+server.document-root = \"$(readlink -f ./aptarchive)\"
+server.port = 8080
+server.stat-cache-engine = \"disable\"
+url.redirect = ( \"^/pool/(.*)$\" => \"/newpool/\$1\" )" > lighttpd.conf
+
+mv aptarchive/pool aptarchive/newpool
+lighttpd -t -f lighttpd.conf >/dev/null || msgdie 'Can not change to webserver: our lighttpd config is invalid'
+lighttpd -D -f lighttpd.conf 2>/dev/null >/dev/null &
+addtrap "kill $!;"
+
+local APTARCHIVE="file://$(readlink -f ./aptarchive)"
+for LIST in $(find rootdir/etc/apt/sources.list.d/ -name 'apt-test-*.list'); do
+	sed -i $LIST -e "s#$APTARCHIVE#http://localhost:8080/#"
+done
+
+aptget update -qq || msgdie 'apt-get update failed'
+aptget install unrelated --download-only -qq || msgdie 'downloading package failed'
+
-- 
cgit v1.2.3