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