1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
|
#!perl
use strict;
use warnings;
use lib 't/lib', 'lib';
use myconfig;
use Test::More tests => 64;
use Test::HexString;
use Test::Exception;
BEGIN {
use_ok('Net::FastCGI::Constant', qw[:all]);
use_ok('Net::FastCGI::Protocol', qw[:all]);
}
my @KNOWN_TYPES = (
FCGI_BEGIN_REQUEST,
FCGI_ABORT_REQUEST,
FCGI_END_REQUEST,
FCGI_PARAMS,
FCGI_STDIN,
FCGI_STDOUT,
FCGI_STDERR,
FCGI_DATA,
FCGI_GET_VALUES,
FCGI_GET_VALUES_RESULT,
FCGI_UNKNOWN_TYPE,
);
foreach my $type (@KNOWN_TYPES) {
like dump_record_body($type, 0), qr/\A\{ $FCGI_TYPE_NAME[$type]\, \s+ 0/x;
}
foreach my $type (FCGI_PARAMS, FCGI_GET_VALUES, FCGI_GET_VALUES_RESULT) {
my $name = $FCGI_TYPE_NAME[$type];
{
my $dump = dump_record_body($type, 1, '');
like $dump, qr/\A \{ $name\, \s+ 1\, \s ""/x;
}
{
my $dump = dump_record_body($type, 1, build_params({ '' => '' }));
like $dump, qr/\A \{ $name\, \s+ 1\, \s "\\000\\000"/x;
}
{
my $dump = dump_record_body($type, 1, build_params({ 'Foo' => '' }));
like $dump, qr/\A \{ $name\, \s+ 1\, \s "\\003\\000Foo"/x;
}
{
my $dump = dump_record_body($type, 1, build_params({ "Foo\r\n" => "\x01\x02" }));
like $dump, qr/\A \{ $name\, \s+ 1\, \s "\\005\\002Foo\\r\\n\\x01\\x02/x;
}
{
my $dump = dump_record_body($type, 1, build_params({ 'x' => 'y' x 128 }));
like $dump, qr/\A \{ $name\, \s+ 1\, \s "\\001\\200\\000\\000\\200 x y+/x;
}
{
my $dump = dump_record_body($type, 1, "\001\001");
like $dump, qr/\A \{ $name\, \s+ 1\, \s Malformed \s FCGI_NameValuePair/x;
}
}
# Streams
{
my @tests = (
[ FCGI_STDIN, 1, "Foo\r\n\t",
qr/\A \{ FCGI_STDIN\, \s+ 1\, \s \"Foo\\r\\n\\t/x ],
[ FCGI_STDOUT, 1, "\x00\x01\x02\x03\x04\x05\x06\x07",
qr/\A \{ FCGI_STDOUT\, \s+ 1\, \s \"\\x00\\x01\\x02\\x03\\x04\\x05\\x06\\x07/x ],
[ FCGI_STDERR, 1, "Foo \x01\x02 Bar\n",
qr/\A \{ FCGI_STDERR\, \s+ 1\, \s \"Foo\x20\\x01\\x02\x20Bar\\n/x ],
[ FCGI_DATA, 1, 'x' x 80,
qr/\A \{ FCGI_DATA\, \s+ 1\, \s \" x+ \s \.\.\./x ],
);
foreach my $test (@tests) {
my ($type, $request_id, $content, $expected) = @$test;
my $dump = dump_record_body($type, $request_id, $content);
like $dump, $expected;
}
}
# FCGI_BEGIN_REQUEST
{
my @tests = (
[ build_begin_request_body(FCGI_RESPONDER, FCGI_KEEP_CONN),
qr/\A \{ FCGI_BEGIN_REQUEST\, \s+ 1\, \s \{ FCGI_RESPONDER\, \s+ FCGI_KEEP_CONN\}/x ],
[ build_begin_request_body(FCGI_FILTER, FCGI_KEEP_CONN | 0x10),
qr/\A \{ FCGI_BEGIN_REQUEST\, \s+ 1\, \s \{ FCGI_FILTER\, \s+ FCGI_KEEP_CONN|0x10\}/x ],
[ build_begin_request_body(FCGI_AUTHORIZER, 0),
qr/\A \{ FCGI_BEGIN_REQUEST\, \s+ 1\, \s \{ FCGI_AUTHORIZER\, \s+ 0\}/x ],
[ build_begin_request_body(0, 0x80),
qr/\A \{ FCGI_BEGIN_REQUEST\, \s+ 1\, \s \{ 0x0000\, \s+ 0x80\}/x ],
map([ $_,
qr/\A \{ FCGI_BEGIN_REQUEST\, \s+ 1\, \s \{ Malformed \s FCGI_BeginRequestBody/x ],
('', "\x00" x 10)),
);
foreach my $test (@tests) {
my ($content, $expected) = @$test;
my $dump = dump_record_body(FCGI_BEGIN_REQUEST, 1, $content);
like $dump, $expected;
}
}
# FCGI_END_REQUEST
{
my @tests = (
[ build_end_request_body(10, 0x80),
qr/\A \{ FCGI_END_REQUEST\, \s+ 1\, \s \{ 10\, \s+ 0x80\}/x ],
map([ $_,
qr/\A \{ FCGI_END_REQUEST\, \s+ 1\, \s \{ Malformed \s FCGI_EndRequestBody/x ],
('', "\x00" x 10)),
map([ build_end_request_body(0, $_),
qr/\A \{ FCGI_END_REQUEST\, \s+ 1\, \s \{ 0\, \s+ $FCGI_PROTOCOL_STATUS_NAME[$_]\}/x ],
(0..3)),
);
foreach my $test (@tests) {
my ($content, $expected) = @$test;
my $dump = dump_record_body(FCGI_END_REQUEST, 1, $content);
like $dump, $expected;
}
}
# FCGI_UNKNOWN_TYPE
{
my @tests = (
[ build_unknown_type_body(0),
qr/\A \{ FCGI_UNKNOWN_TYPE\, \s+ 0\, \s \{ 0/x ],
map([ build_unknown_type_body($_),
qr/\A \{ FCGI_UNKNOWN_TYPE\, \s+ 0\, \s \{ $FCGI_TYPE_NAME[$_]/x ],
@KNOWN_TYPES),
map([ $_,
qr/\A \{ FCGI_UNKNOWN_TYPE\, \s+ 0\, \s \{ Malformed \s FCGI_UnknownTypeBody/x ],
('', "\x00" x 10)),
);
foreach my $test (@tests) {
my ($content, $expected) = @$test;
my $dump = dump_record_body(FCGI_UNKNOWN_TYPE, 0, $content);
like $dump, $expected;
}
}
throws_ok { dump_record_body() } qr/^Usage: /;
throws_ok { dump_record_body(0, 0, undef, 0) } qr/^Usage: /;
|