4
require HTTP::Response;
6
require Time::Local if $^O eq "MacOS";
7
my $offset = ($^O eq "MacOS") ? Time::Local::timegm(0,0,0,1,0,70) : 0;
9
$req = new HTTP::Request 'GET', "http://www.sn.no/";
11
"if-modified-since" => "Thu, 03 Feb 1994 00:00:00 GMT",
12
"mime-version" => "1.0");
14
$str = $req->as_string;
18
$str =~ /^GET/m || print "not ";
21
$req->header("MIME-Version") eq "1.0" || print "not ";
24
$req->content("gisle");
25
$req->add_content(" aas");
26
$req->add_content(\ " old interface is depreciated");
28
${$req->content_ref} =~ s/\s+is\s+depreciated//;
30
print "Content is: ", $req->content, "\n";
32
$req->content eq "gisle aas old interface" || print "not ";
35
$req->if_modified_since == ((760233600 + $offset) | 0) || print "not ";
41
$timestr = gmtime($time);
42
($month) = ($timestr =~ /^\S+\s+(\S+)/); # extract month;
44
print "These should represent the same time:\n\t", $req->header('Date'), "\n\t$timestr\n";
46
$req->header('Date') =~ /\Q$month/ || print "not ";
49
$req->authorization_basic("gisle", "passwd");
50
$auth = $req->header("Authorization");
53
$auth =~ /Z2lzbGU6cGFzc3dk/ || print "not ";
56
($user, $pass) = $req->authorization_basic;
57
($user eq "gisle" && $pass eq "passwd") || print "not ";
61
$res = new HTTP::Response 200, "This message";
63
$html = $res->error_as_HTML;
66
($html =~ /<head>/i && $html =~ /This message/) || print "not ";
69
$res->is_success || print "not ";
72
$res->content_type("text/html;version=3.0");
73
$res->content("<html>...</html>\n");
77
print $res2->as_string;
79
$res2->header("cOntent-TYPE") eq "text/html;version=3.0" || print "not ";
82
$res2->code == 200 || print "not ";
85
$res2->content =~ />\.\.\.</ || print "not ";
88
# Check the base method:
90
$res = new HTTP::Response 200, "This message";
92
$res->content_type("image/gif");
94
$res->base eq "http://www.sn.no/" || print "not ";
97
$res->header('Base', 'http://www.sn.no/xxx/');
99
$res->base eq "http://www.sn.no/xxx/" || print "not ";
102
# Check the AUTLOAD delegate method with regular expressions
103
"This string contains text/html" =~ /(\w+\/\w+)/;
104
$res->content_type($1);
106
$res->content_type eq "text/html" || print "not ";
109
# Check what happens when passed a new URI object
111
$req = HTTP::Request->new(GET => URI->new("http://localhost"));
112
print "not " unless $req->uri eq "http://localhost";
4
use Test qw(plan ok skip);
12
$m = HTTP::Message->new;
14
ok(ref($m), "HTTP::Message");
15
ok(ref($m->headers), "HTTP::Headers");
16
ok($m->as_string, "\n");
17
ok($m->headers->as_string, "");
18
ok($m->headers_as_string, "");
22
ok($m->as_string, "Foo: 1\n\n");
24
$m2 = HTTP::Message->new($m->headers);
25
$m2->header(bar => 2);
26
ok($m->as_string, "Foo: 1\n\n");
27
ok($m2->as_string, "Bar: 2\nFoo: 1\n\n");
29
$m2 = HTTP::Message->new($m->headers, "foo");
30
ok($m2->as_string, "Foo: 1\n\nfoo\n");
31
ok($m2->as_string("<<\n"), "Foo: 1<<\n<<\nfoo");
32
$m2 = HTTP::Message->new($m->headers, "foo\n");
33
ok($m2->as_string, "Foo: 1\n\nfoo\n");
35
$m = HTTP::Message->new([a => 1, b => 2], "abc");
36
ok($m->as_string, "A: 1\nB: 2\n\nabc\n");
38
$m = HTTP::Message->parse("");
39
ok($m->as_string, "\n");
40
$m = HTTP::Message->parse("\n");
41
ok($m->as_string, "\n");
42
$m = HTTP::Message->parse("\n\n");
43
ok($m->as_string, "\n\n");
44
ok($m->content, "\n");
46
$m = HTTP::Message->parse("foo");
47
ok($m->as_string, "\nfoo\n");
48
$m = HTTP::Message->parse("foo: 1");
49
ok($m->as_string, "Foo: 1\n\n");
50
$m = HTTP::Message->parse("foo: 1\n\nfoo");
51
ok($m->as_string, "Foo: 1\n\nfoo\n");
52
$m = HTTP::Message->parse(<<EOT);
63
ok($m->as_string, <<EOT);
75
$m = HTTP::Message->parse(" abc\nfoo: 1\n");
76
ok($m->as_string, "\n abc\nfoo: 1\n");
77
$m = HTTP::Message->parse(" foo : 1\n");
78
ok($m->as_string, "\n foo : 1\n");
80
$m = HTTP::Message->new([a => 1, b => 2], "abc");
81
ok($m->content("foo\n"), "abc");
82
ok($m->content, "foo\n");
84
$m->add_content("bar");
85
ok($m->content, "foo\nbar");
86
$m->add_content(\"\n");
87
ok($m->content, "foo\nbar\n");
89
ok(ref($m->content_ref), "SCALAR");
90
ok(${$m->content_ref}, "foo\nbar\n");
91
${$m->content_ref} =~ s/[ao]/i/g;
92
ok($m->content, "fii\nbir\n");
95
ok($m->headers->header_field_names, 0);
99
$m->parts(HTTP::Message->new,
100
HTTP::Message->new([a => 1], "foo"),
101
HTTP::Message->new(undef, "bar\n"),
103
ok($m->parts->as_string, "\n");
105
my $str = $m->as_string;
108
Content-Type: multipart/mixed; boundary=xYzZY
124
$m2 = HTTP::Message->new;
127
$str = $m2->as_string;
129
ok($str =~ /boundary=(\S+)/);
133
Content-Type: multipart/mixed; boundary=$1
136
Content-Type: multipart/mixed; boundary=xYzZY<CR>
157
@parts = $parts[0]->parts;
159
ok($parts[1]->header("A"), 1);
161
$m2->parts([HTTP::Message->new]);
172
$m = HTTP::Message->new([content_type => "message/http; boundary=aaa",
176
Host: www.example.com:8008
183
ok(ref($m2), "HTTP::Request");
184
ok($m2->method, "GET");
186
ok($m2->protocol, "HTTP/1.1");
187
ok($m2->header("Host"), "www.example.com:8008");
188
ok($m2->content, "");
192
Content-Type: text/plain
198
ok(ref($m2), "HTTP::Response");
199
ok($m2->protocol, "HTTP/1.0");
200
ok($m2->code, "200");
201
ok($m2->message, "OK");
202
ok($m2->content_type, "text/plain");
203
ok($m2->content, "Hello\n");
205
eval { $m->parts(HTTP::Message->new, HTTP::Message->new) };
208
$m->add_part(HTTP::Message->new([a=>[1..3]], "a"));
209
$str = $m->as_string;
212
Content-Type: multipart/mixed; boundary=xYzZY
215
Content-Type: message/http; boundary=aaa<CR>
218
Content-Type: text/plain
231
$m->add_part(HTTP::Message->new([b=>[1..3]], "b"));
233
$str = $m->as_string;
236
Content-Type: multipart/mixed; boundary=xYzZY
239
Content-Type: message/http; boundary=aaa<CR>
242
Content-Type: text/plain
261
$m = HTTP::Message->new;
262
$m->content_ref(\my $foo);
263
ok($m->content_ref, \$foo);
265
ok($m->content, "foo");
266
$m->add_content("bar");
268
ok($m->as_string, "\nfoobar\n");
269
$m->content_type("message/foo");
270
$m->parts(HTTP::Message->new(["h", "v"], "C"));
271
ok($foo, "H: v\r\n\r\nC");
274
ok($m2->content, "c");
276
$m = HTTP::Message->new;
279
ok($m->content, $foo);
280
ok(${$m->content_ref}, $foo);
281
ok(${$m->content_ref([])}, $foo);
282
ok($m->content_ref != $foo);
283
eval {$m->add_content("x")};
284
ok($@ && $@ =~ /^Can't append to ARRAY content/);
286
$foo = sub { "foo" };
288
ok($m->content, $foo);
289
ok(${$m->content_ref}, $foo);
291
$m->content_ref($foo);
292
ok($m->content, $foo);
293
ok($m->content_ref, $foo);
295
eval {$m->content_ref("foo")};
296
ok($@ && $@ =~ /^Setting content_ref to a non-ref/);
298
$m->content_ref(\"foo");
299
eval {$m->content("bar")};
300
ok($@ && $@ =~ /^Modification of a read-only value/);
303
$m->content_ref(\$foo);
304
ok($m->content("bar"), "foo");
306
ok($m->content, "bar");
307
ok($m->content_ref, \$foo);
309
$m = HTTP::Message->new;
310
$m->content("fo=6F");
311
ok($m->decoded_content, "fo=6F");
312
$m->header("Content-Encoding", "quoted-printable");
313
ok($m->decoded_content, "foo");
315
$m = HTTP::Message->new;
316
$m->header("Content-Encoding", "gzip, base64");
317
$m->content_type("text/plain; charset=UTF-8");
318
$m->content("H4sICFWAq0ECA3h4eAB7v3u/R6ZCSUZqUarCoxm7uAAZKHXiEAAAAA==\n");
321
skip($] < 5.008 ? "No Encode module" : "",
322
sub { eval { $m->decoded_content } }, "\x{FEFF}Hi there \x{263A}\n");
324
ok($m->content, "H4sICFWAq0ECA3h4eAB7v3u/R6ZCSUZqUarCoxm7uAAZKHXiEAAAAA==\n");
326
my $tmp = MIME::Base64::decode($m->content);
328
$m->header("Content-Encoding", "gzip");
330
skip($] < 5.008 ? "No Encode module" : "",
331
sub { eval { $m->decoded_content } }, "\x{FEFF}Hi there \x{263A}\n");
333
ok($m->content, $tmp);
335
$m->header("Content-Encoding", "foobar");
336
ok($m->decoded_content, undef);
337
ok($@ =~ /^Don't know how to decode Content-Encoding 'foobar'/);
341
$m->decoded_content(raise_error => 1);
344
ok($@ =~ /Don't know how to decode Content-Encoding 'foobar'/);