Debian lenny version packages
[pkg-perl] / deb-src / libwww-perl / libwww-perl-5.813 / t / local / chunked.t
1 #!/usr/bin/perl
2
3 use strict;
4 use warnings;
5
6 use HTTP::Daemon;
7 use Test::More;
8 # use Time::HiRes qw(sleep);
9 our $CRLF;
10 use Socket qw($CRLF);
11
12 our $LOGGING = 0;
13
14 our @TESTS = (
15               {
16                expect => 629,
17                comment => "traditional, unchunked POST request",
18                raw => "POST /cgi-bin/redir-TE.pl HTTP/1.1
19 User-Agent: UNTRUSTED/1.0
20 Content-Type: application/x-www-form-urlencoded
21 Content-Length: 629
22 Host: localhost
23
24 JSR-205=0;font_small=15;png=1;jpg=1;alpha_channel=256;JSR-82=0;JSR-135=1;mot-wt=0;JSR-75-pim=0;pointer_motion_event=0;camera=1;free_memory=455472;heap_size=524284;cldc=CLDC-1.1;canvas_size_y=176;canvas_size_x=176;double_buffered=1;color=65536;JSR-120=1;JSR-184=1;JSR-180=0;JSR-75-file=0;push_socket=0;pointer_event=0;nokia-ui=1;java_platform=xxxxxxxxxxxxxxxxx/xxxxxxx;gif=1;midp=MIDP-1.0 MIDP-2.0;font_large=22;sie-col-game=0;JSR-179=0;push_sms=1;JSR-172=0;font_medium=18;fullscreen_canvas_size_y=220;fullscreen_canvas_size_x=176;java_locale=de;video_encoding=encoding=JPEG&width=176&height=182encoding=JPEG&width=176&height=220;"
25               },
26               {
27                expect => 8,
28                comment => "chunked with illegal Content-Length header; tiny message",
29                raw => "POST /cgi-bin/redir-TE.pl HTTP/1.1
30 Host: localhost
31 Content-Type: application/x-www-form-urlencoded
32 Content-Length: 8
33 Transfer-Encoding: chunked
34
35 8
36 icm.x=u2
37 0
38
39 ",
40               },
41               {
42                expect => 868,
43                comment => "chunked with illegal Content-Length header; medium sized",
44                raw => "POST /cgi-bin/redir-TE.pl HTTP/1.1
45 Host:dev05
46 Connection:close
47 Content-Type:application/x-www-form-urlencoded
48 Content-Length:868
49 transfer-encoding:chunked
50
51 364
52 JSR-205=0;font_small=20;png=1;jpg=1;JSR-82=0;JSR-135=1;mot-wt=0;JSR-75-pim=0;http=1;pointer_motion_event=0;browser_launch=1;free_memory=733456;user_agent=xxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;heap_size=815080;cldc=CLDC-1.0;canvas_size_y=182;canvas_size_x=176;double_buffered=1;NAVIGATION PRESS=20;JSR-184=0;JSR-120=1;color=32768;JSR-180=0;JSR-75-file=0;RIGHT SOFT KEY=22;NAVIGATION RIGHT=5;KEY *=42;push_socket=0;pointer_event=0;KEY #=35;KEY NUM 9=57;nokia-ui=0;KEY NUM 8=56;KEY NUM 7=55;KEY NUM 6=54;KEY NUM 5=53;gif=1;KEY NUM 4=52;NAVIGATION UP=1;KEY NUM 3=51;KEY NUM 2=50;KEY NUM 1=49;midp=MIDP-2.0 VSCL-1.1.0;font_large=20;KEY NUM 0=48;sie-col-game=0;JSR-179=0;push_sms=1;JSR-172=0;NAVIGATION LEFT=2;LEFT SOFT KEY=21;font_medium=20;fullscreen_canvas_size_y=204;fullscreen_canvas_size_x=176;https=1;NAVIGATION DOWN=6;java_locale=en-DE;
53 0
54
55 ",
56               },
57               {
58                expect => 1104,
59                comment => "chunked correctly, size ~1k; base for the big next test",
60                raw => "POST /cgi-bin/redir-TE.pl HTTP/1.1
61 User-Agent: UNTRUSTED/1.0
62 Content-Type: application/x-www-form-urlencoded
63 Host: localhost:80
64 Transfer-Encoding: chunked
65
66 450
67 JSR-205=0;font_small=15;png=1;jpg=1;jsr184_dithering=0;CLEAR/DELETE=-8;JSR-82=0;alpha_channel=32;JSR-135=1;mot-wt=0;JSR-75-pim=0;http=1;pointer_motion_event=0;browser_launch=1;BACK/RETURN=-11;camera=1;free_memory=456248;user_agent=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;heap_size=524284;cldc=CLDC-1.1;canvas_size_y=176;canvas_size_x=176;double_buffered=1;NAVIGATION PRESS=-5;JSR-184=1;JSR-120=1;color=65536;JSR-180=0;JSR-75-file=0;RIGHT SOFT KEY=-7;NAVIGATION RIGHT=-4;KEY *=42;push_socket=0;pointer_event=0;KEY #=35;KEY NUM 9=57;nokia-ui=1;KEY NUM 8=56;KEY NUM 7=55;KEY NUM 6=54;KEY NUM 5=53;java_platform=xxxxxxxxxxxxxxxxx/xxxxxxx;KEY NUM 4=52;gif=1;KEY NUM 3=51;NAVIGATION UP=-1;KEY NUM 2=50;KEY NUM 1=49;midp=MIDP-1.0 MIDP-2.0;font_large=22;KEY NUM 0=48;sie-col-game=0;JSR-179=0;push_sms=1;JSR-172=0;NAVIGATION LEFT=-3;LEFT SOFT KEY=-6;jsr184_antialiasing=0;font_medium=18;fullscreen_canvas_size_y=220;fullscreen_canvas_size_x=176;https=1;NAVIGATION DOWN=-2;java_locale=de;video_encoding=encoding=JPEG&width=176&height=182encoding=JPEG&width=176&height=220;
68 0
69
70 "
71               },
72               {
73                expect => 1104*1024,
74                comment => "chunked with many chunks",
75                raw => ("POST /cgi-bin/redir-TE.pl HTTP/1.1
76 User-Agent: UNTRUSTED/1.0
77 Content-Type: application/x-www-form-urlencoded
78 Host: localhost:80
79 Transfer-Encoding: chunked
80
81 ".("450
82 JSR-205=0;font_small=15;png=1;jpg=1;jsr184_dithering=0;CLEAR/DELETE=-8;JSR-82=0;alpha_channel=32;JSR-135=1;mot-wt=0;JSR-75-pim=0;http=1;pointer_motion_event=0;browser_launch=1;BACK/RETURN=-11;camera=1;free_memory=456248;user_agent=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;heap_size=524284;cldc=CLDC-1.1;canvas_size_y=176;canvas_size_x=176;double_buffered=1;NAVIGATION PRESS=-5;JSR-184=1;JSR-120=1;color=65536;JSR-180=0;JSR-75-file=0;RIGHT SOFT KEY=-7;NAVIGATION RIGHT=-4;KEY *=42;push_socket=0;pointer_event=0;KEY #=35;KEY NUM 9=57;nokia-ui=1;KEY NUM 8=56;KEY NUM 7=55;KEY NUM 6=54;KEY NUM 5=53;java_platform=xxxxxxxxxxxxxxxxx/xxxxxxx;KEY NUM 4=52;gif=1;KEY NUM 3=51;NAVIGATION UP=-1;KEY NUM 2=50;KEY NUM 1=49;midp=MIDP-1.0 MIDP-2.0;font_large=22;KEY NUM 0=48;sie-col-game=0;JSR-179=0;push_sms=1;JSR-172=0;NAVIGATION LEFT=-3;LEFT SOFT KEY=-6;jsr184_antialiasing=0;font_medium=18;fullscreen_canvas_size_y=220;fullscreen_canvas_size_x=176;https=1;NAVIGATION DOWN=-2;java_locale=de;video_encoding=encoding=JPEG&width=176&height=182encoding=JPEG&width=176&height=220;
83 "x1024)."0
84
85 ")
86               },
87              );
88
89
90 my $tests = @TESTS;
91 plan tests => $tests;
92
93 sub mywarn ($) {
94   return unless $LOGGING;
95   my($mess) = @_;
96   open my $fh, ">>", "http-daemon.out"
97     or die $!;
98   my $ts = localtime;
99   print $fh "$ts: $mess\n";
100   close $fh or die $!;
101 }
102
103
104 my $pid;
105 if ($pid = fork) {
106   sleep 4;
107   for my $t (0..$#TESTS) {
108     my $test = $TESTS[$t];
109     my $raw = $test->{raw};
110     $raw =~ s/\r?\n/$CRLF/mg;
111     if (0) {
112       open my $fh, "| socket localhost 8333" or die;
113       print $fh $test;
114     }
115     use IO::Socket::INET;
116     my $sock = IO::Socket::INET->new(
117                                      PeerAddr => "127.0.0.1",
118                                      PeerPort => 8333,
119                                     ) or die;
120     if (0) {
121       for my $pos (0..length($raw)-1) {
122         print $sock substr($raw,$pos,1);
123         sleep 0.001;
124       }
125     } else {
126       print $sock $raw;
127     }
128     local $/;
129     my $resp = <$sock>;
130     close $sock;
131     my($got) = $resp =~ /\r?\n\r?\n(\d+)/s;
132     is($got,
133        $test->{expect},
134        "[$test->{expect}] $test->{comment}",
135       );
136   }
137   wait;
138 } else {
139   die "cannot fork: $!" unless defined $pid;
140   my $d = HTTP::Daemon->new(
141                             LocalAddr => '0.0.0.0',
142                             LocalPort => 8333,
143                             ReuseAddr => 1,
144                            ) or die;
145   mywarn "Starting new daemon as '$$'";
146   my $i;
147   LISTEN: while (my $c = $d->accept) {
148     my $r = $c->get_request;
149     mywarn sprintf "headers[%s] content[%s]", $r->headers->as_string, $r->content;
150     my $res = HTTP::Response->new(200,undef,undef,length($r->content).$CRLF);
151     $c->send_response($res);
152     $c->force_last_request; # we're just not mature enough
153     $c->close;
154     undef($c);
155     last if ++$i >= $tests;
156   }
157 }
158
159
160
161 # Local Variables:
162 # mode: cperl
163 # cperl-indent-level: 2
164 # End: