From 5547928112323096908bb48bd98437633985bbd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20B=C3=BChler?= Date: Sat, 2 Aug 2008 16:24:31 +0000 Subject: [PATCH] Decode url before matching in mod_rewrite (#1720) git-svn-id: svn://svn.lighttpd.net/lighttpd/branches/lighttpd-1.4.x@2278 152afb58-edef-0310-8abb-c4023f1b3aa9 --- NEWS | 1 + src/mod_rewrite.c | 6 +++++- src/response.c | 44 ++++++++++++++++++++++---------------------- tests/mod-rewrite.t | 12 ++++++++++-- 4 files changed, 38 insertions(+), 25 deletions(-) diff --git a/NEWS b/NEWS index ea10e63c..e0408c28 100644 --- a/NEWS +++ b/NEWS @@ -49,6 +49,7 @@ NEWS * allow digits in [s]cgi env vars (#1712) * fixed dropping last character of evhost pattern (#161) * print helpful error message on conditionals in global block (#1550) + * decode url before matching in mod_rewrite (#1720) - 1.4.19 - 2008-03-10 diff --git a/src/mod_rewrite.c b/src/mod_rewrite.c index b98b763e..763d555d 100644 --- a/src/mod_rewrite.c +++ b/src/mod_rewrite.c @@ -350,7 +350,11 @@ URIHANDLER_FUNC(mod_rewrite_uri_handler) { if (!p->conf.rewrite) return HANDLER_GO_ON; - buffer_copy_string_buffer(p->match_buf, con->request.uri); + buffer_copy_string_buffer(p->match_buf, con->uri.path); + if (con->uri.query->used > 0) { + buffer_append_string_len(p->match_buf, CONST_STR_LEN("?")); + buffer_append_string_buffer(p->match_buf, con->uri.query); + } for (i = 0; i < p->conf.rewrite->used; i++) { pcre *match; diff --git a/src/response.c b/src/response.c index 64fd8115..23aee549 100644 --- a/src/response.c +++ b/src/response.c @@ -232,27 +232,6 @@ handler_t http_response_prepare(server *srv, connection *con) { } - /** - * - * call plugins - * - * - based on the raw URL - * - */ - - switch(r = plugins_call_handle_uri_raw(srv, con)) { - case HANDLER_GO_ON: - break; - case HANDLER_FINISHED: - case HANDLER_COMEBACK: - case HANDLER_WAIT_FOR_EVENT: - case HANDLER_ERROR: - return r; - default: - log_error_write(srv, __FILE__, __LINE__, "sd", "handle_uri_raw: unknown return value", r); - break; - } - /* build filename * * - decode url-encodings (e.g. %20 -> ' ') @@ -260,7 +239,6 @@ handler_t http_response_prepare(server *srv, connection *con) { */ - if (con->request.http_method == HTTP_METHOD_OPTIONS && con->uri.path_raw->ptr[0] == '*' && con->uri.path_raw->ptr[1] == '\0') { /* OPTIONS * ... */ @@ -276,6 +254,28 @@ handler_t http_response_prepare(server *srv, connection *con) { log_error_write(srv, __FILE__, __LINE__, "sb", "URI-path : ", con->uri.path); } + + /** + * + * call plugins + * + * - based on the raw URL + * + */ + + switch(r = plugins_call_handle_uri_raw(srv, con)) { + case HANDLER_GO_ON: + break; + case HANDLER_FINISHED: + case HANDLER_COMEBACK: + case HANDLER_WAIT_FOR_EVENT: + case HANDLER_ERROR: + return r; + default: + log_error_write(srv, __FILE__, __LINE__, "sd", "handle_uri_raw: unknown return value", r); + break; + } + /** * * call plugins diff --git a/tests/mod-rewrite.t b/tests/mod-rewrite.t index 5cb3323e..b97d8ed5 100755 --- a/tests/mod-rewrite.t +++ b/tests/mod-rewrite.t @@ -8,7 +8,7 @@ BEGIN { use strict; use IO::Socket; -use Test::More tests => 7; +use Test::More tests => 8; use LightyTest; my $tf = LightyTest->new(); @@ -35,7 +35,7 @@ EOF ); $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 200, 'HTTP-Content' => '' } ]; ok($tf->handle_http($t) == 0, 'valid request'); - + $t->{REQUEST} = ( <{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 200, 'HTTP-Content' => 'bar&a=b' } ]; ok($tf->handle_http($t) == 0, 'valid request'); + $t->{REQUEST} = ( <{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 200, 'HTTP-Content' => 'a=b' } ]; + ok($tf->handle_http($t) == 0, 'valid request with url encoded characters'); + ok($tf->stop_proc == 0, "Stopping lighttpd"); }