#!/usr/bin/perl use strict; use Perlbal::Test; use Perlbal::Test::WebServer; use Perlbal::Test::WebClient; use Test::More tests => 35; my ($back_port) = start_webserver(); # setup a simple perlbal that uses the above server my $webport = new_port(); my $dir = tempdir(); my $deadport = new_port(); my $pb_port = new_port(); my $conf = qq{ CREATE POOL a CREATE SERVICE test SET test.role = reverse_proxy SET test.listen = 127.0.0.1:$pb_port SET test.persist_client = 1 SET test.persist_backend = 1 SET test.pool = a SET test.connect_ahead = 0 SET test.enable_reproxy = true ENABLE test CREATE SERVICE ws SET ws.role = web_server SET ws.listen = 127.0.0.1:$webport SET ws.docroot = $dir SET ws.dirindexing = 0 SET ws.persist_client = 1 ENABLE ws }; my $msock = start_server($conf); ok($msock, 'perlbal started'); ok(manage("POOL a ADD 127.0.0.1:$back_port"), "backend port added"); my $wc = Perlbal::Test::WebClient->new; $wc->server("127.0.0.1:$pb_port"); $wc->keepalive(1); $wc->http_version('1.0'); # see if a single request works my $resp = $wc->request('status'); ok($resp, 'status response ok'); # make a file on disk, verifying we can get it via disk/URL my $phrase = "foo bar yo this is my content.\n"; my $file_content = $phrase x 1000; open(F, ">$dir/foo.txt"); print F $file_content; close(F); ok(filecontent("$dir/foo.txt") eq $file_content, "file good via disk"); my $hc = Perlbal::Test::WebClient->new; $hc->server("127.0.0.1:$webport"); $hc->keepalive(1); $hc->http_version('1.0'); $resp = $hc->request('foo.txt'); ok($resp && $resp->content eq $file_content, 'file good via network'); # now request some ranges on it..... foreach my $meth (qw(http rp_file rp_url)) { my $ua = { 'http' => $hc, 'rp_file' => $wc, 'rp_url' => $wc, }->{$meth} || die; my $path = { 'http' => "foo.txt", 'rp_file' => "reproxy_file:$dir/foo.txt", 'rp_url' => "reproxy_url:http://127.0.0.1:$webport/foo.txt", }->{$meth} || die; my $resp; my $range; my $send = sub { $range = shift; $resp = $ua->request({ headers => "Range: $range\r\n"}, $path); }; my @aios = ("-"); if ($meth eq "rp_file" || $meth eq "http") { @aios = qw(none ioaio); } foreach my $aio (@aios) { my $setaio = $aio eq "-" ? 1 : manage("SERVER aio_mode = $aio"); SKIP: { skip "can't do AIO mode $aio", 6 unless $setaio; $send->("bytes=0-6"); ok($resp && $resp->content eq "foo bar", "$meth/$aio: range $range"); ok($resp->status_line =~ /^206/, "is partial") or diag(dump_res($resp)); $send->("bytes=" . length($phrase) . "-"); ok($resp && $resp->content eq ($phrase x 999), "$meth/$aio: range $range"); ok($resp->status_line =~ /^206/, "is partial") or diag(dump_res($resp)); $send->("bytes=" . length($file_content) . "-"); ok($resp && $resp->status_line =~ /^416/, "$meth/$aio: can't satisify") or diag(dump_res($resp)); $send->("bytes=5-1"); ok($resp && $resp->status_line =~ /^416/, "$meth/$aio: can't satisify") or diag(dump_res($resp)); } } } # try to reproxy to a list of URLs, where the first one is bogus, and last one is good #ok_reproxy_url_list(); sub ok_reproxy_url_list { my $resp = $wc->request("reproxy_url_multi:$deadport:$webport:/foo.txt"); ok($resp->content eq $file_content, "reproxy URL w/ dead one first"); } sub ok_reproxy_file { my $resp = $wc->request("reproxy_file:$dir/foo.txt"); ok($resp && $resp->content eq $file_content, "reproxy file"); } sub ok_reproxy_url { my $resp = $wc->request("reproxy_url:http://127.0.0.1:$webport/foo.txt"); ok($resp->content eq $file_content, "reproxy URL"); } sub ok_status { my $resp = $wc->request('status'); ok($resp && $resp->content =~ /\bpid\b/, 'status ok'); } 1;