Commit | Line | Data |
dd4e6fd2 |
1 | #!perl |
2 | |
3 | use strict; |
4 | use warnings; |
5 | |
6 | use FindBin; |
42da66a9 |
7 | use lib "$FindBin::Bin/../lib"; |
dd4e6fd2 |
8 | |
2f381252 |
9 | use Test::More tests => 88; |
dd4e6fd2 |
10 | use Catalyst::Test 'TestApp'; |
11 | |
12 | use Catalyst::Request; |
5c0ff128 |
13 | use Catalyst::Request::Upload; |
dd4e6fd2 |
14 | use HTTP::Headers; |
15 | use HTTP::Headers::Util 'split_header_words'; |
16 | use HTTP::Request::Common; |
2f381252 |
17 | use Path::Class::Dir; |
dd4e6fd2 |
18 | |
19 | { |
20 | my $creq; |
21 | |
fbcc39ad |
22 | my $request = POST( |
23 | 'http://localhost/dump/request/', |
24 | 'Content-Type' => 'form-data', |
dd4e6fd2 |
25 | 'Content' => [ |
a2e038a1 |
26 | 'live_engine_request_cookies.t' => |
27 | ["$FindBin::Bin/live_engine_request_cookies.t"], |
28 | 'live_engine_request_headers.t' => |
29 | ["$FindBin::Bin/live_engine_request_headers.t"], |
30 | 'live_engine_request_uploads.t' => |
31 | ["$FindBin::Bin/live_engine_request_uploads.t"], |
fbcc39ad |
32 | ] |
dd4e6fd2 |
33 | ); |
34 | |
35 | ok( my $response = request($request), 'Request' ); |
36 | ok( $response->is_success, 'Response Successful 2xx' ); |
fbcc39ad |
37 | is( $response->content_type, 'text/plain', 'Response Content-Type' ); |
38 | like( |
39 | $response->content, |
40 | qr/^bless\( .* 'Catalyst::Request' \)$/s, |
41 | 'Content is a serialized Catalyst::Request' |
42 | ); |
43 | |
dd4e6fd2 |
44 | { |
45 | no strict 'refs'; |
fbcc39ad |
46 | ok( |
47 | eval '$creq = ' . $response->content, |
48 | 'Unserialize Catalyst::Request' |
49 | ); |
dd4e6fd2 |
50 | } |
51 | |
52 | isa_ok( $creq, 'Catalyst::Request' ); |
53 | is( $creq->method, 'POST', 'Catalyst::Request method' ); |
fbcc39ad |
54 | is( $creq->content_type, 'multipart/form-data', |
55 | 'Catalyst::Request Content-Type' ); |
56 | is( $creq->content_length, $request->content_length, |
57 | 'Catalyst::Request Content-Length' ); |
dd4e6fd2 |
58 | |
59 | for my $part ( $request->parts ) { |
60 | |
61 | my $disposition = $part->header('Content-Disposition'); |
62 | my %parameters = @{ ( split_header_words($disposition) )[0] }; |
63 | |
8e061fef |
64 | my $upload = $creq->uploads->{ $parameters{filename} }; |
fbcc39ad |
65 | |
5c0ff128 |
66 | isa_ok( $upload, 'Catalyst::Request::Upload' ); |
dd4e6fd2 |
67 | |
d3fced79 |
68 | is( $upload->type, $part->content_type, 'Upload Content-Type' ); |
69 | is( $upload->size, length( $part->content ), 'Upload Content-Length' ); |
a2e038a1 |
70 | |
c4bed79a |
71 | # make sure upload is accessible via legacy params->{$file} |
8e061fef |
72 | is( $creq->parameters->{ $upload->filename }, |
a2e038a1 |
73 | $upload->filename, 'legacy param method ok' ); |
74 | |
75 | ok( !-e $upload->tempname, 'Upload temp file was deleted' ); |
dd4e6fd2 |
76 | } |
dd4e6fd2 |
77 | } |
1408d0a4 |
78 | |
79 | { |
80 | my $creq; |
81 | |
fbcc39ad |
82 | my $request = POST( |
83 | 'http://localhost/dump/request/', |
1408d0a4 |
84 | 'Content-Type' => 'multipart/form-data', |
85 | 'Content' => [ |
a2e038a1 |
86 | 'testfile' => ["$FindBin::Bin/live_engine_request_cookies.t"], |
87 | 'testfile' => ["$FindBin::Bin/live_engine_request_headers.t"], |
88 | 'testfile' => ["$FindBin::Bin/live_engine_request_uploads.t"], |
fbcc39ad |
89 | ] |
1408d0a4 |
90 | ); |
91 | |
92 | ok( my $response = request($request), 'Request' ); |
93 | ok( $response->is_success, 'Response Successful 2xx' ); |
fbcc39ad |
94 | is( $response->content_type, 'text/plain', 'Response Content-Type' ); |
95 | like( |
96 | $response->content, |
97 | qr/^bless\( .* 'Catalyst::Request' \)$/s, |
98 | 'Content is a serialized Catalyst::Request' |
99 | ); |
100 | |
1408d0a4 |
101 | { |
102 | no strict 'refs'; |
fbcc39ad |
103 | ok( |
104 | eval '$creq = ' . $response->content, |
105 | 'Unserialize Catalyst::Request' |
106 | ); |
1408d0a4 |
107 | } |
108 | |
109 | isa_ok( $creq, 'Catalyst::Request' ); |
110 | is( $creq->method, 'POST', 'Catalyst::Request method' ); |
fbcc39ad |
111 | is( $creq->content_type, 'multipart/form-data', |
112 | 'Catalyst::Request Content-Type' ); |
113 | is( $creq->content_length, $request->content_length, |
114 | 'Catalyst::Request Content-Length' ); |
115 | |
1408d0a4 |
116 | my @parts = $request->parts; |
117 | |
fbcc39ad |
118 | for ( my $i = 0 ; $i < @parts ; $i++ ) { |
119 | |
1408d0a4 |
120 | my $part = $parts[$i]; |
121 | my $disposition = $part->header('Content-Disposition'); |
122 | my %parameters = @{ ( split_header_words($disposition) )[0] }; |
fbcc39ad |
123 | |
8e061fef |
124 | my $upload = $creq->uploads->{ $parameters{name} }->[$i]; |
fbcc39ad |
125 | |
1408d0a4 |
126 | isa_ok( $upload, 'Catalyst::Request::Upload' ); |
127 | is( $upload->type, $part->content_type, 'Upload Content-Type' ); |
128 | is( $upload->filename, $parameters{filename}, 'Upload filename' ); |
129 | is( $upload->size, length( $part->content ), 'Upload Content-Length' ); |
a2e038a1 |
130 | |
131 | ok( !-e $upload->tempname, 'Upload temp file was deleted' ); |
1408d0a4 |
132 | } |
133 | } |
32d4bba8 |
134 | |
135 | { |
136 | my $creq; |
137 | |
fbcc39ad |
138 | my $request = POST( |
139 | 'http://localhost/engine/request/uploads/slurp', |
32d4bba8 |
140 | 'Content-Type' => 'multipart/form-data', |
a2e038a1 |
141 | 'Content' => |
142 | [ 'slurp' => ["$FindBin::Bin/live_engine_request_uploads.t"], ] |
32d4bba8 |
143 | ); |
144 | |
145 | ok( my $response = request($request), 'Request' ); |
146 | ok( $response->is_success, 'Response Successful 2xx' ); |
147 | is( $response->content_type, 'text/plain', 'Response Content-Type' ); |
fbcc39ad |
148 | is( $response->content, ( $request->parts )[0]->content, 'Content' ); |
32d4bba8 |
149 | } |
fdb3773e |
150 | |
151 | { |
152 | my $request = POST( |
153 | 'http://localhost/dump/request', |
154 | 'Content-Type' => 'multipart/form-data', |
155 | 'Content' => |
42da66a9 |
156 | [ 'file' => ["$FindBin::Bin/../catalyst_130pix.gif"], ] |
fdb3773e |
157 | ); |
158 | |
c4c4dd19 |
159 | # LWP will auto-correct Content-Length when using a remote server |
160 | SKIP: |
161 | { |
162 | if ( $ENV{CATALYST_SERVER} ) { |
163 | skip 'Using remote server', 2; |
164 | } |
fdb3773e |
165 | |
c4c4dd19 |
166 | # Sending wrong Content-Length here and see if subequent requests fail |
167 | $request->header('Content-Length' => $request->header('Content-Length') + 1); |
168 | |
169 | ok( my $response = request($request), 'Request' ); |
170 | ok( !$response->is_success, 'Response Error' ); |
171 | } |
fdb3773e |
172 | |
173 | $request = POST( |
174 | 'http://localhost/dump/request', |
175 | 'Content-Type' => 'multipart/form-data', |
176 | 'Content' => |
42da66a9 |
177 | [ 'file1' => ["$FindBin::Bin/../catalyst_130pix.gif"], |
178 | 'file2' => ["$FindBin::Bin/../catalyst_130pix.gif"], ] |
fdb3773e |
179 | ); |
180 | |
c4c4dd19 |
181 | ok( my $response = request($request), 'Request' ); |
fdb3773e |
182 | ok( $response->is_success, 'Response Successful 2xx' ); |
183 | is( $response->content_type, 'text/plain', 'Response Content-Type' ); |
184 | like( $response->content, qr/file1 => bless/, 'Upload with name file1'); |
185 | like( $response->content, qr/file2 => bless/, 'Upload with name file2'); |
186 | } |
a7e05d9d |
187 | |
188 | { |
189 | my $creq; |
190 | |
191 | my $request = POST( |
192 | 'http://localhost/dump/request/', |
193 | 'Content-Type' => 'form-data', |
194 | 'Content' => [ |
195 | 'testfile' => 'textfield value', |
42da66a9 |
196 | 'testfile' => ["$FindBin::Bin/../catalyst_130pix.gif"], |
a7e05d9d |
197 | ] |
198 | ); |
199 | |
200 | ok( my $response = request($request), 'Request' ); |
201 | ok( $response->is_success, 'Response Successful 2xx' ); |
202 | is( $response->content_type, 'text/plain', 'Response Content-Type' ); |
203 | like( |
204 | $response->content, |
205 | qr/^bless\( .* 'Catalyst::Request' \)$/s, |
206 | 'Content is a serialized Catalyst::Request' |
207 | ); |
208 | |
209 | { |
210 | no strict 'refs'; |
211 | ok( |
212 | eval '$creq = ' . $response->content, |
213 | 'Unserialize Catalyst::Request' |
214 | ); |
215 | } |
216 | |
217 | isa_ok( $creq, 'Catalyst::Request' ); |
218 | is( $creq->method, 'POST', 'Catalyst::Request method' ); |
219 | is( $creq->content_type, 'multipart/form-data', |
220 | 'Catalyst::Request Content-Type' ); |
221 | is( $creq->content_length, $request->content_length, |
222 | 'Catalyst::Request Content-Length' ); |
223 | |
8e061fef |
224 | my $param = $creq->parameters->{testfile}; |
a7e05d9d |
225 | |
226 | ok( @$param == 2, '2 values' ); |
227 | is( $param->[0], 'textfield value', 'correct value' ); |
228 | like( $param->[1], qr/\Qcatalyst_130pix.gif/, 'filename' ); |
229 | |
230 | for my $part ( $request->parts ) { |
231 | |
232 | my $disposition = $part->header('Content-Disposition'); |
233 | my %parameters = @{ ( split_header_words($disposition) )[0] }; |
234 | |
235 | next unless exists $parameters{filename}; |
236 | |
8e061fef |
237 | my $upload = $creq->uploads->{ $parameters{name} }; |
a7e05d9d |
238 | |
239 | isa_ok( $upload, 'Catalyst::Request::Upload' ); |
240 | |
241 | is( $upload->type, $part->content_type, 'Upload Content-Type' ); |
242 | is( $upload->size, length( $part->content ), 'Upload Content-Length' ); |
243 | is( $upload->filename, 'catalyst_130pix.gif' ); |
244 | } |
245 | } |
2f381252 |
246 | |
247 | # test uploadtmp config var |
248 | |
249 | { |
250 | my $creq; |
251 | |
252 | my $dir = "$FindBin::Bin/"; |
253 | local TestApp->config->{ uploadtmp } = $dir; |
254 | $dir = Path::Class::Dir->new( $dir ); |
255 | |
256 | my $request = POST( |
257 | 'http://localhost/dump/request/', |
258 | 'Content-Type' => 'multipart/form-data', |
259 | 'Content' => [ |
260 | 'testfile' => ["$FindBin::Bin/live_engine_request_uploads.t"], |
261 | ] |
262 | ); |
263 | |
264 | ok( my $response = request($request), 'Request' ); |
265 | ok( $response->is_success, 'Response Successful 2xx' ); |
266 | is( $response->content_type, 'text/plain', 'Response Content-Type' ); |
267 | like( |
268 | $response->content, |
269 | qr/^bless\( .* 'Catalyst::Request' \)$/s, |
270 | 'Content is a serialized Catalyst::Request' |
271 | ); |
272 | |
273 | { |
274 | no strict 'refs'; |
275 | ok( |
276 | eval '$creq = ' . $response->content, |
277 | 'Unserialize Catalyst::Request' |
278 | ); |
279 | } |
280 | |
281 | isa_ok( $creq, 'Catalyst::Request' ); |
282 | is( $creq->method, 'POST', 'Catalyst::Request method' ); |
283 | is( $creq->content_type, 'multipart/form-data', |
284 | 'Catalyst::Request Content-Type' ); |
285 | is( $creq->content_length, $request->content_length, |
286 | 'Catalyst::Request Content-Length' ); |
287 | |
288 | for my $part ( $request->parts ) { |
289 | |
290 | my $disposition = $part->header('Content-Disposition'); |
291 | my %parameters = @{ ( split_header_words($disposition) )[0] }; |
292 | |
293 | next unless exists $parameters{filename}; |
294 | |
295 | my $upload = $creq->{uploads}->{ $parameters{name} }; |
296 | |
297 | isa_ok( $upload, 'Catalyst::Request::Upload' ); |
298 | |
299 | is( $upload->type, $part->content_type, 'Upload Content-Type' ); |
300 | is( $upload->size, length( $part->content ), 'Upload Content-Length' ); |
301 | |
302 | like( $upload->tempname, qr{\Q$dir\E}, 'uploadtmp' ); |
303 | } |
304 | } |
305 | |