]> git.saurik.com Git - apt.git/commitdiff
add simple url rewriting to the webserver
authorDavid Kalnischkies <kalnischkies@gmail.com>
Wed, 11 Jul 2012 09:07:54 +0000 (11:07 +0200)
committerDavid Kalnischkies <kalnischkies@gmail.com>
Wed, 11 Jul 2012 09:07:54 +0000 (11:07 +0200)
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..f1e67c6
--- /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 unstable InRelease
+Hit http://localhost unstable/main Sources
+Hit http://localhost unstable/main amd64 Packages
+Hit http://localhost unstable/main Translation-en
+Reading package lists...' aptget update
+
+msgtest 'Test redirection works in' 'package download'
+aptget install unrelated --download-only -qq && msgpass || msgfail
index 2052fe6d865884df7276587e7fc6b8cb33aba16c..7fa322ea9e5f72dc50777e3c938a11a804c49df3 100644 (file)
@@ -137,7 +137,7 @@ void sendError(int const client, int const httpcode, std::string const &request,
    std::list<std::string> headers;
    std::string response("<html><head><title>");
    response.append(httpcodeToStr(httpcode)).append("</title></head>");
-   response.append("<body><h1>").append(httpcodeToStr(httpcode)).append("</h1");
+   response.append("<body><h1>").append(httpcodeToStr(httpcode)).append("</h1>");
    response.append("This error is a result of the request: <pre>");
    response.append(request).append("</pre></body></html>");
    addDataHeaders(headers, response);
@@ -255,6 +255,8 @@ int main(int const argc, const char * argv[])
       {0, "simulate-paywall", "aptwebserver::Simulate-Paywall",
        CommandLine::Boolean},
       {0, "port", "aptwebserver::port", CommandLine::HasArg},
+      {'c',"config-file",0,CommandLine::ConfigFile},
+      {'o',"option",0,CommandLine::ArbItem},
       {0,0,0,0}
    };
 
@@ -366,7 +368,20 @@ int main(int const argc, const char * argv[])
                  sendRedirect(client, 301, filename.append("/"), *m, sendContent);
            }
            else
-              sendError(client, 404, *m, false);
+           {
+              ::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;
+                 }
+              }
+              sendError(client, 404, *m, sendContent);
+           }
         }
         _error->DumpErrors(std::cerr);
         messages.clear();