summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Adam <obnox@samba.org>2009-09-14 13:28:27 +0200
committerMichael Adam <obnox@samba.org>2009-09-14 13:30:57 +0200
commit78502e4565e90a835ce81a0e6eb996f1a0b76615 (patch)
tree697e53eb5d786138ef2e011aa3658b0d59e040ba
parente06aaa5c79788c5d7fed43f18ab197e452d2f1c3 (diff)
downloadtinyproxy-78502e4565e90a835ce81a0e6eb996f1a0b76615.tar.gz
tinyproxy-78502e4565e90a835ce81a0e6eb996f1a0b76615.zip
tests:webserver: add parsing of request
Michael
Diffstat (limited to '')
-rwxr-xr-xtests/scripts/webserver.pl93
1 files changed, 88 insertions, 5 deletions
diff --git a/tests/scripts/webserver.pl b/tests/scripts/webserver.pl
index a006830..8358c4c 100755
--- a/tests/scripts/webserver.pl
+++ b/tests/scripts/webserver.pl
@@ -77,16 +77,85 @@ sub REAPER {
sub parse_request($) {
my $client = shift;
+ my $request = {};
+
+
+ # parse the request line
+
+ my $request_line = <$client>;
+ if (!$request_line) {
+ $request->{error} = "emtpy request";
+ return $request;
+ }
+
+ chomp ($request_line);
+
+ my ($method, $object, $version) = split(" ", $request_line);
+ unless (defined($version) and $version) {
+ $request->{version} = "0.9";
+ } else {
+ if ($version !~ /HTTP\/(\d\.\d)/gi) {
+ $request->{error} = "illegal version ($version)";
+ return $request;
+ }
+ $request->{version} = $1;
+ }
+ $request->{method} = uc($method);
+ $request->{object} = $object;
+
+ # parse the request headers
+
+ my $current_header_line;
+ $request->{headers} = [];
+ while ($request_line = <$client>) {
+ if ($request_line =~ /^[ \t]/) {
+ # continued header line
+ chomp $request_line;
+ $current_header_line .= $request_line;
+ next;
+ }
+
+ if ($current_header_line) {
+ # finish current header line
+ my ($name, $value) = split(": ", $current_header_line);
+ push(@{$request->{headers}},
+ { name => lc($name), value => $value });
+ }
- my $request = "";
- while (my $request_line = <$client>) {
- $request .= $request_line;
last if ($request_line eq $EOL);
+
+ chomp $request_line;
+ $current_header_line = $request_line;
}
+
+ # parse entity (body)
+
+ $request->{entity} = "";
+
+ # skip for now, don't block...
+ # if ($request_line) {
+ # while ($request_line = <$client>) {
+ # logmsg "got line '$request_line'";
+ # $request->{entity} .= $request_line;
+ # }
+ # }
+
+ my @print_headers = ();
+ foreach my $header (@{$request->{headers}}) {
+ push @print_headers, $header->{name} . ": " . $header->{value};
+ }
logmsg "request:\n" .
"------------------------------\n" .
- "$request" .
+ "Method: " . $request->{method} . "\n" .
+ "Object: " . $request->{object} . "\n" .
+ "Version: " . $request->{version} . "\n" .
+ "\n" .
+ "Headers:\n" .
+ join("\n", @print_headers) . "\n" .
+ #"\n" .
+ #"Body:\n" .
+ #"'" . $request->{entity} . "'\n" .
"------------------------------";
return $request;
@@ -121,8 +190,22 @@ sub child_action($) {
} else {
print $client "Sorry, no $fortune_bin not found.$EOL";
}
+
+ my @print_headers = ();
+ foreach my $header (@{$request->{headers}}) {
+ push @print_headers, $header->{name} . ": " . $header->{value};
+ }
print $client "<h2>Your request:</h2>$EOL";
- print $client "<pre>$request<pre>$EOL";
+ print $client "<pre>$EOL";
+ print $client "Method: " . $request->{method} . "\n" .
+ "Object: " . $request->{object} . "\n" .
+ "Version: " . $request->{version} . "\n" .
+ "\n" .
+ join("\n", @print_headers) .
+ "\n" .
+ "entity (body):\n" .
+ $request->{entity} . "\n";
+ print $client "</pre>$EOL";
print $client "</html>$EOL";
close $client;