#!/usr/bin/perl use strict; use Perlbal::Test; use Test::More tests => 20; require HTTP::Request; my $port = new_port(); my $dir = tempdir(); my $conf = qq{ SERVER aio_mode = none CREATE SERVICE test SET test.role = web_server SET test.listen = 127.0.0.1:$port SET test.docroot = $dir SET test.dirindexing = 0 SET test.persist_client = 1 SET test.enable_concatenate_get = 1 ENABLE test }; my $http = "http://127.0.0.1:$port"; my $msock = start_server($conf); ok($msock, "manage sock"); my $ua = ua(); ok($ua, "ua"); sub set_disk { my ($relpath, $contents) = @_; open(F, ">$dir$relpath") or die "Couldn't open $dir$relpath: $!\n"; print F $contents; close F; } our $last_res; sub get { my $url = shift; my $req = HTTP::Request->new(GET => $url); my $res = $last_res = $ua->request($req); return $res->is_success ? $res->content : undef; } # write two files to disk mkdir "$dir/foo"; mkdir "$dir/foo/bar"; my $chunk1 = "a" x 50 . "\n"; my $chunk2 = "b" x 50 . "\n"; set_disk("/foo/a.txt", $chunk1); set_disk("/foo/b.txt", $chunk2); set_disk("/foo/bar/a.txt", $chunk1); set_disk("/foo/bar/b.txt", $chunk2); # test trailing slash is(get("${http}/foo??a.txt,b.txt"), undef, "need trailing slash"); is($last_res->code, 500, "got 500 without trailing slash"); # test bogus directory is(get("${http}/bogus/??a.txt,b.txt"), undef, "bogus directory"); is($last_res->code, 404, "got 404 for bogus directory"); # test bogus file is(get("${http}/foo/??a.txt,bogus.txt"), undef, "bogus file"); is($last_res->code, 404, "got 404 for bogus file"); is(get("${http}/foo/??a.txt,b.txt"), "$chunk1$chunk2", "basic concat works"); is(get("${http}/foo/??a.txt,bar/b.txt"), "$chunk1$chunk2", "concat w/ directory"); is(get("${http}/foo/??a.txt,a.txt"), "$chunk1$chunk1", "dup concat"); # test that if-modified-since 304 works and w/o a content-length { my $req = HTTP::Request->new(GET => "${http}/foo/??a.txt,bar/b.txt"); my $res = $ua->request($req); ok($res, "got response again"); my $lastmod = $res->header("Last-Modified"); like($lastmod, qr/\bGMT$/, "and it has a last modified"); $req = HTTP::Request->new(GET => "${http}/foo/??a.txt,bar/b.txt"); $req->header("If-Modified-Since" => $lastmod); my $ua_keep = LWP::UserAgent->new(keep_alive => 2); $res = $ua_keep->request($req); ok($res, "got response again"); is($res->code, 304, "the response is a 304"); like($res->header("Last-Modified"), qr/\bGMT$/, "and it has a last modified"); ok(! $res->header("Content-Length"), "No content-length"); like($res->header("Connection"), qr/\bkeep-alive\b/, "and it's keep-alive"); } manage("SET test.enable_concatenate_get = 0"); is(get("${http}/foo/??a.txt,a.txt"), undef, "denied"); is($last_res->code, 403, "got 403"); 1;