]> git.saurik.com Git - apt.git/commitdiff
simple URI rewrite rules config for webserver
authorDavid Kalnischkies <kalnischkies@gmail.com>
Sat, 15 Jun 2013 21:58:12 +0000 (23:58 +0200)
committerDavid Kalnischkies <kalnischkies@gmail.com>
Thu, 20 Jun 2013 08:53:58 +0000 (10:53 +0200)
we have a test which required traditionally lighttpd to be executed
as it requires a webserver supporting some kind of URI rewriting.
Now with some lines of code our own webserver can do this and the
testcase can be enabled by default. This test hinted at the bug fixed
in the previous commit, so having more tests which can easily be run
is a good thing.

Git-Dch: Ignore

test/integration/skip-bug-602412-dequote-redirect [deleted file]
test/integration/test-bug-602412-dequote-redirect [new file with mode: 0755]
test/interactive-helper/aptwebserver.cc

diff --git a/test/integration/skip-bug-602412-dequote-redirect b/test/integration/skip-bug-602412-dequote-redirect
deleted file mode 100755 (executable)
index 689b671..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-#!/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\",
- \"^/dists/(.*)$\" => \"/newdists/\$1\" )" > lighttpd.conf
-
-mv aptarchive/pool aptarchive/newpool
-mv aptarchive/dists aptarchive/newdists
-
-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 $!;"
-
-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 || msgdie 'apt-get update failed'
-aptget install unrelated --download-only || msgdie 'downloading package failed'
diff --git a/test/integration/test-bug-602412-dequote-redirect b/test/integration/test-bug-602412-dequote-redirect
new file mode 100755 (executable)
index 0000000..c204435
--- /dev/null
@@ -0,0 +1,29 @@
+#!/bin/sh
+set -e
+
+TESTDIR=$(readlink -f $(dirname $0))
+. $TESTDIR/framework
+setupenvironment
+configarchitecture 'amd64'
+
+buildsimplenativepackage 'unrelated' 'all' '0.5~squeeze1' 'unstable'
+
+setupaptarchive
+changetowebserver -o aptwebserver::redirect::replace::/pool/=/newpool/ \
+                 -o aptwebserver::redirect::replace::/dists/=/newdists/
+
+mv aptarchive/pool aptarchive/newpool
+mv aptarchive/dists aptarchive/newdists
+
+msgtest 'Test redirection works in' 'apt-get update'
+aptget update -qq && msgpass || msgfail
+
+# check that I-M-S header is kept in redirections
+testequal 'Hit http://localhost:8080 unstable InRelease
+Hit http://localhost:8080 unstable/main Sources
+Hit http://localhost:8080 unstable/main amd64 Packages
+Hit http://localhost:8080 unstable/main Translation-en
+Reading package lists...' aptget update #-o debug::pkgacquire=1 -o debug::pkgacquire::worker=1
+
+msgtest 'Test redirection works in' 'package download'
+aptget install unrelated --download-only -qq && msgpass || msgfail
index d25f506247ef2f3b367d45160fb4c7548e23022a..de235fa0591ecb3063d22a5cbe790707b184e338 100644 (file)
@@ -420,6 +420,22 @@ int main(int const argc, const char * argv[])
               continue;
            }
 
+           // string replacements in the requested filename
+           ::Configuration::Item const *Replaces = _config->Tree("aptwebserver::redirect::replace");
+           if (Replaces != NULL)
+           {
+              std::string redirect = "/" + filename;
+              for (::Configuration::Item *I = Replaces->Child; I != NULL; I = I->Next)
+                 redirect = SubstVar(redirect, I->Tag, I->Value);
+              redirect.erase(0,1);
+              if (redirect != filename)
+              {
+                 sendRedirect(client, 301, redirect, *m, sendContent);
+                 continue;
+              }
+           }
+
+           // deal with the request
            if (RealFileExists(filename) == true)
            {
               FileFd data(filename, FileFd::ReadOnly);