4 use Test qw(plan ok skip);
9 use Config qw(%Config);
13 $m = HTTP::Message->new;
15 ok(ref($m), "HTTP::Message");
16 ok(ref($m->headers), "HTTP::Headers");
17 ok($m->as_string, "\n");
18 ok($m->headers->as_string, "");
19 ok($m->headers_as_string, "");
23 ok($m->as_string, "Foo: 1\n\n");
25 $m2 = HTTP::Message->new($m->headers);
26 $m2->header(bar => 2);
27 ok($m->as_string, "Foo: 1\n\n");
28 ok($m2->as_string, "Bar: 2\nFoo: 1\n\n");
29 ok($m2->dump, "Bar: 2\nFoo: 1\n\n(no content)\n");
31 $m2 = HTTP::Message->new($m->headers, "foo");
32 ok($m2->as_string, "Foo: 1\n\nfoo\n");
33 ok($m2->as_string("<<\n"), "Foo: 1<<\n<<\nfoo");
34 $m2 = HTTP::Message->new($m->headers, "foo\n");
35 ok($m2->as_string, "Foo: 1\n\nfoo\n");
37 $m = HTTP::Message->new([a => 1, b => 2], "abc");
38 ok($m->as_string, "A: 1\nB: 2\n\nabc\n");
40 $m = HTTP::Message->parse("");
41 ok($m->as_string, "\n");
42 $m = HTTP::Message->parse("\n");
43 ok($m->as_string, "\n");
44 $m = HTTP::Message->parse("\n\n");
45 ok($m->as_string, "\n\n");
46 ok($m->content, "\n");
48 $m = HTTP::Message->parse("foo");
49 ok($m->as_string, "\nfoo\n");
50 $m = HTTP::Message->parse("foo: 1");
51 ok($m->as_string, "Foo: 1\n\n");
52 $m = HTTP::Message->parse("foo_bar: 1");
53 ok($m->as_string, "Foo_bar: 1\n\n");
54 $m = HTTP::Message->parse("foo: 1\n\nfoo");
55 ok($m->as_string, "Foo: 1\n\nfoo\n");
56 $m = HTTP::Message->parse(<<EOT);
67 ok($m->as_string, <<EOT);
79 $m = HTTP::Message->parse(<<EOT);
80 Date: Fri, 18 Feb 2005 18:33:46 GMT
82 Content-Type: text/plain
87 ok($m->content(""), <<EOT);
91 ok($m->as_string, <<EOT);
93 Date: Fri, 18 Feb 2005 18:33:46 GMT
94 Content-Type: text/plain
98 $m = HTTP::Message->parse(" abc\nfoo: 1\n");
99 ok($m->as_string, "\n abc\nfoo: 1\n");
100 $m = HTTP::Message->parse(" foo : 1\n");
101 ok($m->as_string, "\n foo : 1\n");
102 $m = HTTP::Message->parse("\nfoo: bar\n");
103 ok($m->as_string, "\nfoo: bar\n");
105 $m = HTTP::Message->new([a => 1, b => 2], "abc");
106 ok($m->content("foo\n"), "abc");
107 ok($m->content, "foo\n");
109 $m->add_content("bar");
110 ok($m->content, "foo\nbar");
111 $m->add_content(\"\n");
112 ok($m->content, "foo\nbar\n");
114 ok(ref($m->content_ref), "SCALAR");
115 ok(${$m->content_ref}, "foo\nbar\n");
116 ${$m->content_ref} =~ s/[ao]/i/g;
117 ok($m->content, "fii\nbir\n");
120 ok($m->headers->header_field_names, 0);
123 ok($m->parts, undef);
124 $m->parts(HTTP::Message->new,
125 HTTP::Message->new([a => 1], "foo"),
126 HTTP::Message->new(undef, "bar\n"),
128 ok($m->parts->as_string, "\n");
130 my $str = $m->as_string;
133 Content-Type: multipart/mixed; boundary=xYzZY
149 $m2 = HTTP::Message->new;
152 $str = $m2->as_string;
154 ok($str =~ /boundary=(\S+)/);
158 Content-Type: multipart/mixed; boundary=$1
161 Content-Type: multipart/mixed; boundary=xYzZY<CR>
182 @parts = $parts[0]->parts;
184 ok($parts[1]->header("A"), 1);
186 $m2->parts([HTTP::Message->new]);
197 $m = HTTP::Message->new([content_type => "message/http; boundary=aaa",
201 Host: www.example.com:8008
208 ok(ref($m2), "HTTP::Request");
209 ok($m2->method, "GET");
211 ok($m2->protocol, "HTTP/1.1");
212 ok($m2->header("Host"), "www.example.com:8008");
213 ok($m2->content, "");
217 Content-Type: text/plain
223 ok(ref($m2), "HTTP::Response");
224 ok($m2->protocol, "HTTP/1.0");
225 ok($m2->code, "200");
226 ok($m2->message, "OK");
227 ok($m2->content_type, "text/plain");
228 ok($m2->content, "Hello\n");
230 eval { $m->parts(HTTP::Message->new, HTTP::Message->new) };
233 $m->add_part(HTTP::Message->new([a=>[1..3]], "a"));
234 $str = $m->as_string;
237 Content-Type: multipart/mixed; boundary=xYzZY
240 Content-Type: message/http; boundary=aaa<CR>
243 Content-Type: text/plain
256 $m->add_part(HTTP::Message->new([b=>[1..3]], "b"));
258 $str = $m->as_string;
261 Content-Type: multipart/mixed; boundary=xYzZY
264 Content-Type: message/http; boundary=aaa<CR>
267 Content-Type: text/plain
286 $m = HTTP::Message->new;
287 $m->add_part(HTTP::Message->new([a=>[1..3]], "a"));
288 $str = $m->as_string;
291 Content-Type: multipart/mixed; boundary=xYzZY
302 $m = HTTP::Message->new;
303 $m->content_ref(\my $foo);
304 ok($m->content_ref, \$foo);
306 ok($m->content, "foo");
307 $m->add_content("bar");
309 ok($m->as_string, "\nfoobar\n");
310 $m->content_type("message/foo");
311 $m->parts(HTTP::Message->new(["h", "v"], "C"));
312 ok($foo, "H: v\r\n\r\nC");
315 ok($m2->content, "c");
317 $m = HTTP::Message->new;
320 ok($m->content, $foo);
321 ok(${$m->content_ref}, $foo);
322 ok(${$m->content_ref([])}, $foo);
323 ok($m->content_ref != $foo);
324 eval {$m->add_content("x")};
325 ok($@ && $@ =~ /^Can't append to ARRAY content/);
327 $foo = sub { "foo" };
329 ok($m->content, $foo);
330 ok(${$m->content_ref}, $foo);
332 $m->content_ref($foo);
333 ok($m->content, $foo);
334 ok($m->content_ref, $foo);
336 eval {$m->content_ref("foo")};
337 ok($@ && $@ =~ /^Setting content_ref to a non-ref/);
339 $m->content_ref(\"foo");
340 eval {$m->content("bar")};
341 ok($@ && $@ =~ /^Modification of a read-only value/);
344 $m->content_ref(\$foo);
345 ok($m->content("bar"), "foo");
347 ok($m->content, "bar");
348 ok($m->content_ref, \$foo);
350 $m = HTTP::Message->new;
351 $m->content("fo=6F");
352 ok($m->decoded_content, "fo=6F");
353 $m->header("Content-Encoding", "quoted-printable");
354 ok($m->decoded_content, "foo");
356 $m = HTTP::Message->new;
357 $m->header("Content-Encoding", "gzip, base64");
358 $m->content_type("text/plain; charset=UTF-8");
359 $m->content("H4sICFWAq0ECA3h4eAB7v3u/R6ZCSUZqUarCoxm7uAAZKHXiEAAAAA==\n");
361 my $NO_ENCODE = $] < 5.008 || ($Config{'extensions'} !~ /\bEncode\b/)
362 ? "No Encode module" : "";
364 skip($NO_ENCODE, sub { eval { $m->decoded_content } }, "\x{FEFF}Hi there \x{263A}\n");
366 ok($m->content, "H4sICFWAq0ECA3h4eAB7v3u/R6ZCSUZqUarCoxm7uAAZKHXiEAAAAA==\n");
370 ok($m2->header("Content-Encoding"), undef);
371 ok($m2->content, qr/Hi there/);
373 ok(grep { $_ eq "gzip" } $m->decodable);
375 my $tmp = MIME::Base64::decode($m->content);
377 $m->header("Content-Encoding", "gzip");
379 skip($NO_ENCODE, sub { eval { $m->decoded_content } }, "\x{FEFF}Hi there \x{263A}\n");
381 ok($m->content, $tmp);
383 $m->remove_header("Content-Encoding");
384 $m->content("a\xFF");
386 skip($NO_ENCODE, sub { $m->decoded_content }, "a\x{FFFD}");
387 skip($NO_ENCODE, sub { $m->decoded_content(charset_strict => 1) }, undef);
389 $m->header("Content-Encoding", "foobar");
390 ok($m->decoded_content, undef);
391 ok($@ =~ /^Don't know how to decode Content-Encoding 'foobar'/);
395 $m->decoded_content(raise_error => 1);
398 ok($@ =~ /Don't know how to decode Content-Encoding 'foobar'/);
401 if ($] >= 5.008001) {
403 HTTP::Message->new([], "\x{263A}");
406 $m = HTTP::Message->new;
408 $m->add_content("\x{263A}");
412 $m->content("\x{263A}");
417 skip("Missing is_utf8 test", undef) for 1..3;
420 # test the add_content_utf8 method
421 if ($] >= 5.008001) {
422 $m = HTTP::Message->new(["Content-Type", "text/plain; charset=UTF-8"]);
423 $m->add_content_utf8("\x{263A}");
424 $m->add_content_utf8("-\xC5");
425 ok($m->content, "\xE2\x98\xBA-\xC3\x85");
426 ok($m->decoded_content, "\x{263A}-\x{00C5}");
429 skip("Missing is_utf8 test", undef) for 1..2;
432 $m = HTTP::Message->new([
433 "Content-Type", "text/plain"
437 $m->encode("deflate");
438 $m->dump(prefix => "# ");
439 ok($m->dump(prefix => "| "), <<'EOT');
440 | Content-Encoding: deflate
441 | Content-Type: text/plain
443 | x\x9C\xF3H\xCD\xC9\xC9W(\xCF/\xCAIQ\4\0\35\t\4^
445 $m->encode("base64", "identity");
446 ok($m->as_string, <<'EOT');
447 Content-Encoding: deflate, base64, identity
448 Content-Type: text/plain
450 eJzzSM3JyVcozy/KSVEEAB0JBF4=
452 if (eval { require Encode; 1 }) {
453 ok($m->decoded_content, "Hello world!");
455 skip('Needs Encode.pm for this test', undef);
458 if (eval "require Compress::Bzip2") {
459 $m = HTTP::Message->new([
460 "Content-Type" => "text/plain",
464 ok($m->encode("x-bzip2"));
465 ok($m->header("Content-Encoding"), "x-bzip2");
466 ok($m->content =~ /\0/);
467 ok($m->decoded_content, "Hello world!");
469 ok($m->content, "Hello world!");
472 # I prepared the following message by using bzip2 command (v1.0.4)
473 # but for some reason it will not pass
474 $m = HTTP::Message->new([
475 "Content-Type" => "text/plain",
476 "Content-Encoding" => "x-bzip2, base64",
478 "QlpoOTFBWSZTWcvLx0QAAAHVgAAQYAAAQAYEkIAgADEAMCBoYlnQeSEMvxdyRThQkMvLx0Q=\n"
485 skip("Need Compress::Bzip2", undef) for 1..6;