Просмотр исходного кода

add simple url rewriting to the webserver

David Kalnischkies лет назад: 14
Родитель
Сommit
d37911acee

+ 0 - 38
test/integration/skip-bug-602412-dequote-redirect

@@ -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'

+ 29 - 0
test/integration/test-bug-602412-dequote-redirect

@@ -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

+ 17 - 2
test/interactive-helper/aptwebserver.cc

@@ -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();