1#!/usr/bin/env perl
2use strict;
3use warnings;
4use Test::More;
5use Hijk;
6
7my $CRLF = "\x0d\x0a";
8
9for my $protocol ("HTTP/1.0", "HTTP/1.1") {
10    is Hijk::_build_http_message({ protocol => $protocol, host => "www.example.com" }),
11        "GET / $protocol${CRLF}".
12        "Host: www.example.com${CRLF}".
13        "${CRLF}";
14
15    is Hijk::_build_http_message({ protocol => $protocol, host => "example.com" }),
16        "GET / $protocol${CRLF}".
17        "Host: example.com${CRLF}".
18        "${CRLF}";
19
20    is Hijk::_build_http_message({ method => "HEAD", protocol => $protocol, host => "example.com" }),
21        "HEAD / $protocol${CRLF}".
22        "Host: example.com${CRLF}".
23        "${CRLF}";
24
25    is Hijk::_build_http_message({ protocol => $protocol, host => "www.example.com", port => "8080" }),
26        "GET / $protocol${CRLF}".
27        "Host: www.example.com${CRLF}".
28        "${CRLF}";
29
30    is Hijk::_build_http_message({ protocol => $protocol, host => "www.example.com", query_string => "a=b" }),
31        "GET /?a=b $protocol${CRLF}".
32        "Host: www.example.com${CRLF}".
33        "${CRLF}";
34
35    is Hijk::_build_http_message({ protocol => $protocol, host => "www.example.com", path => "/flower" }),
36        "GET /flower $protocol${CRLF}".
37        "Host: www.example.com${CRLF}".
38        "${CRLF}";
39
40    is Hijk::_build_http_message({ protocol => $protocol, host => "www.example.com", path => "/flower", query_string => "a=b" }),
41        "GET /flower?a=b $protocol${CRLF}".
42        "Host: www.example.com${CRLF}".
43        "${CRLF}";
44
45    is Hijk::_build_http_message({ protocol => $protocol, host => "www.example.com", body => "morning" }),
46        "GET / $protocol${CRLF}".
47        "Host: www.example.com${CRLF}".
48        "Content-Length: 7${CRLF}".
49        "${CRLF}".
50        "morning";
51
52    is Hijk::_build_http_message({ protocol => $protocol, host => "www.example.com", body => "0" }),
53        "GET / $protocol${CRLF}".
54        "Host: www.example.com${CRLF}".
55        "Content-Length: 1${CRLF}".
56        "${CRLF}".
57        "0";
58
59    is Hijk::_build_http_message({ protocol => $protocol, host => "www.example.com", body => undef }),
60        "GET / $protocol${CRLF}".
61        "Host: www.example.com${CRLF}".
62        "${CRLF}";
63
64    is Hijk::_build_http_message({ protocol => $protocol, host => "www.example.com", body => "" }),
65        "GET / $protocol${CRLF}".
66        "Host: www.example.com${CRLF}".
67        "Content-Length: 0${CRLF}".
68        "${CRLF}";
69
70    is Hijk::_build_http_message({ protocol => $protocol, host => "www.example.com", head => ["X-Head" => "extra stuff"] }),
71        "GET / $protocol${CRLF}".
72        "Host: www.example.com${CRLF}".
73        "X-Head: extra stuff${CRLF}".
74        "${CRLF}";
75
76    is Hijk::_build_http_message({ protocol => $protocol, host => "www.example.com", head => ["X-Head" => "extra stuff", "X-Hat" => "ditto"] }),
77        "GET / $protocol${CRLF}".
78        "Host: www.example.com${CRLF}".
79        "X-Head: extra stuff${CRLF}".
80        "X-Hat: ditto${CRLF}${CRLF}";
81
82    is Hijk::_build_http_message({ protocol => $protocol, host => "www.example.com", head => ["X-Head" => "extra stuff"], body => "OHAI" }),
83        "GET / $protocol${CRLF}".
84        "Host: www.example.com${CRLF}".
85        "Content-Length: 4${CRLF}".
86        "X-Head: extra stuff${CRLF}".
87        "${CRLF}".
88        "OHAI";
89
90    # Allow overriding Host header in head arrayref
91    is Hijk::_build_http_message({ protocol => $protocol, host => "localhost", head => [ "Host" => "www.example.com" ], no_default_host_header => 1 }),
92        "GET / $protocol${CRLF}".
93        "Host: www.example.com${CRLF}${CRLF}";
94
95    # Also allow sending no Host header at all
96    is Hijk::_build_http_message({ protocol => $protocol, host => "localhost", no_default_host_header => 1 }),
97        "GET / $protocol${CRLF}${CRLF}";
98    is Hijk::_build_http_message({ protocol => $protocol, host => "localhost", head => [], no_default_host_header => 1 }),
99        "GET / $protocol${CRLF}${CRLF}";
100
101    # Or even crazy multiple Host headers, whatever that means!
102    is Hijk::_build_http_message({ protocol => $protocol, host => "localhost", head => [ Host => "foo", Host => "bar" ], no_default_host_header => 1 }),
103        "GET / $protocol${CRLF}".
104        "Host: foo${CRLF}".
105        "Host: bar${CRLF}${CRLF}";
106}
107
108done_testing;
109