summaryrefslogtreecommitdiff
path: root/tests/cachable.t
diff options
context:
space:
mode:
authorStefan Bühler <stbuehler@web.de>2015-07-05 16:59:01 +0000
committerStefan Bühler <stbuehler@web.de>2015-07-05 16:59:01 +0000
commit9f05b61ab4fe96d5e8ca376e0debd1543bfb419c (patch)
tree0d6bcde7739870581877f634dd5425ee91a749d1 /tests/cachable.t
parent71b5c53a0a77e6f9d1b5730a3b025b9c00016a67 (diff)
downloadlighttpd1.4-9f05b61ab4fe96d5e8ca376e0debd1543bfb419c.tar.gz
lighttpd1.4-9f05b61ab4fe96d5e8ca376e0debd1543bfb419c.zip
parse If-None-Match for ETag validation (fixes #2578)
From: Stefan Bühler <stbuehler@web.de> git-svn-id: svn://svn.lighttpd.net/lighttpd/branches/lighttpd-1.4.x@2994 152afb58-edef-0310-8abb-c4023f1b3aa9
Diffstat (limited to 'tests/cachable.t')
-rwxr-xr-xtests/cachable.t102
1 files changed, 101 insertions, 1 deletions
diff --git a/tests/cachable.t b/tests/cachable.t
index 381f44e0..cd47eb2d 100755
--- a/tests/cachable.t
+++ b/tests/cachable.t
@@ -8,7 +8,7 @@ BEGIN {
use strict;
use IO::Socket;
-use Test::More tests => 13;
+use Test::More tests => 25;
use LightyTest;
my $tf = LightyTest->new();
@@ -117,5 +117,105 @@ EOF
$t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 200 } ];
ok($tf->handle_http($t) == 0, 'Conditional GET - ETag + disabled etags on server side');
+###############
+
+ok($etag =~ /^\"(.*)\"$/, "The server must quote ETags");
+
+$t->{REQUEST} = ( <<EOF
+GET / HTTP/1.0
+If-None-Match: $1
+EOF
+ );
+$t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 200 } ];
+ok($tf->handle_http($t) == 0, 'The client must send a quoted ETag');
+
+$etag =~ /^(\".*)\"$/;
+$t->{REQUEST} = ( <<EOF
+GET / HTTP/1.0
+If-None-Match: $1
+EOF
+ );
+$t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 200 } ];
+ok($tf->handle_http($t) == 0, 'The ETag must be surrounded by quotes');
+
+$t->{REQUEST} = ( <<EOF
+GET / HTTP/1.0
+If-None-Match: *
+EOF
+ );
+$t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 304 } ];
+ok($tf->handle_http($t) == 0, 'An unquoted star matches any ETag');
+
+$t->{REQUEST} = ( <<EOF
+GET / HTTP/1.0
+If-None-Match: "*"
+EOF
+ );
+$t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 200 } ];
+ok($tf->handle_http($t) == 0, 'A quoted star is just a regular ETag');
+
+TODO: {
+ local $TODO = "weak etags not allowed yet";
+ $t->{REQUEST} = ( <<EOF
+GET / HTTP/1.0
+If-None-Match: W/$etag
+EOF
+ );
+ $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 304 } ];
+ ok($tf->handle_http($t) == 0, 'A weak etag matches like a regular ETag for HEAD and GET');
+}
+
+$t->{REQUEST} = ( <<EOF
+GET / HTTP/1.0
+If-None-Match: W/$etag
+Range: bytes=0-0
+EOF
+);
+$t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 206, 'HTTP-Content' => '<' } ];
+ok($tf->handle_http($t) == 0, 'A weak etag does not match for ranged requests');
+
+$t->{REQUEST} = ( <<EOF
+GET / HTTP/1.0
+If-None-Match: W/"12345"
+EOF
+ );
+$t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 200 } ];
+ok($tf->handle_http($t) == 0, 'However, a weak ETag is not *');
+
+$t->{REQUEST} = ( <<EOF
+GET / HTTP/1.0
+If-None-Match: "12345", $etag
+EOF
+ );
+$t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 304 } ];
+ok($tf->handle_http($t) == 0, 'Client sent a list of ETags, the second matches');
+
+TODO: {
+ local $TODO = "weak etags not allowed yet";
+ $t->{REQUEST} = ( <<EOF
+GET / HTTP/1.0
+If-None-Match: "12345", W/$etag
+EOF
+ );
+ $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 304 } ];
+ ok($tf->handle_http($t) == 0, 'The second provided ETag matches weakly');
+}
+
+$t->{REQUEST} = ( <<EOF
+GET / HTTP/1.0
+If-None-Match: "12345",, ,, , $etag
+EOF
+ );
+$t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 304 } ];
+ok($tf->handle_http($t) == 0, 'Broken client did get around to sending good data');
+
+$t->{REQUEST} = ( <<EOF
+GET / HTTP/1.0
+If-None-Match: "1234", $etag, "brokentrailing
+EOF
+ );
+$t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 304 } ];
+ok($tf->handle_http($t) == 0, 'Bad syntax *after* a matching ETag doesn\'t matter');
+
ok($tf->stop_proc == 0, "Stopping lighttpd");