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 | |
a12e6f17 |
9 | use Test::More tests => 105; |
dd4e6fd2 |
10 | use Catalyst::Test 'TestApp'; |
513ac93d |
11 | use Scalar::Util qw/ blessed /; |
dd4e6fd2 |
12 | use Catalyst::Request; |
5c0ff128 |
13 | use Catalyst::Request::Upload; |
ad51fa70 |
14 | use HTTP::Body::OctetStream; |
dd4e6fd2 |
15 | use HTTP::Headers; |
16 | use HTTP::Headers::Util 'split_header_words'; |
17 | use HTTP::Request::Common; |
2f381252 |
18 | use Path::Class::Dir; |
dd4e6fd2 |
19 | |
20 | { |
21 | my $creq; |
22 | |
fbcc39ad |
23 | my $request = POST( |
24 | 'http://localhost/dump/request/', |
25 | 'Content-Type' => 'form-data', |
dd4e6fd2 |
26 | 'Content' => [ |
a2e038a1 |
27 | 'live_engine_request_cookies.t' => |
28 | ["$FindBin::Bin/live_engine_request_cookies.t"], |
29 | 'live_engine_request_headers.t' => |
30 | ["$FindBin::Bin/live_engine_request_headers.t"], |
31 | 'live_engine_request_uploads.t' => |
32 | ["$FindBin::Bin/live_engine_request_uploads.t"], |
fbcc39ad |
33 | ] |
dd4e6fd2 |
34 | ); |
35 | |
36 | ok( my $response = request($request), 'Request' ); |
37 | ok( $response->is_success, 'Response Successful 2xx' ); |
fbcc39ad |
38 | is( $response->content_type, 'text/plain', 'Response Content-Type' ); |
39 | like( |
40 | $response->content, |
41 | qr/^bless\( .* 'Catalyst::Request' \)$/s, |
42 | 'Content is a serialized Catalyst::Request' |
43 | ); |
44 | |
dd4e6fd2 |
45 | { |
46 | no strict 'refs'; |
fbcc39ad |
47 | ok( |
48 | eval '$creq = ' . $response->content, |
49 | 'Unserialize Catalyst::Request' |
50 | ); |
dd4e6fd2 |
51 | } |
52 | |
53 | isa_ok( $creq, 'Catalyst::Request' ); |
54 | is( $creq->method, 'POST', 'Catalyst::Request method' ); |
fbcc39ad |
55 | is( $creq->content_type, 'multipart/form-data', |
56 | 'Catalyst::Request Content-Type' ); |
57 | is( $creq->content_length, $request->content_length, |
58 | 'Catalyst::Request Content-Length' ); |
dd4e6fd2 |
59 | |
60 | for my $part ( $request->parts ) { |
61 | |
62 | my $disposition = $part->header('Content-Disposition'); |
63 | my %parameters = @{ ( split_header_words($disposition) )[0] }; |
64 | |
8e061fef |
65 | my $upload = $creq->uploads->{ $parameters{filename} }; |
fbcc39ad |
66 | |
5c0ff128 |
67 | isa_ok( $upload, 'Catalyst::Request::Upload' ); |
dd4e6fd2 |
68 | |
d3fced79 |
69 | is( $upload->type, $part->content_type, 'Upload Content-Type' ); |
70 | is( $upload->size, length( $part->content ), 'Upload Content-Length' ); |
a2e038a1 |
71 | |
c4bed79a |
72 | # make sure upload is accessible via legacy params->{$file} |
8e061fef |
73 | is( $creq->parameters->{ $upload->filename }, |
a2e038a1 |
74 | $upload->filename, 'legacy param method ok' ); |
75 | |
ad51fa70 |
76 | SKIP: |
77 | { |
78 | if ( $ENV{CATALYST_SERVER} ) { |
79 | skip 'Not testing for deleted file on remote server', 1; |
80 | } |
81 | ok( !-e $upload->tempname, 'Upload temp file was deleted' ); |
82 | } |
dd4e6fd2 |
83 | } |
dd4e6fd2 |
84 | } |
1408d0a4 |
85 | |
86 | { |
87 | my $creq; |
88 | |
fbcc39ad |
89 | my $request = POST( |
90 | 'http://localhost/dump/request/', |
1408d0a4 |
91 | 'Content-Type' => 'multipart/form-data', |
92 | 'Content' => [ |
a2e038a1 |
93 | 'testfile' => ["$FindBin::Bin/live_engine_request_cookies.t"], |
94 | 'testfile' => ["$FindBin::Bin/live_engine_request_headers.t"], |
95 | 'testfile' => ["$FindBin::Bin/live_engine_request_uploads.t"], |
fbcc39ad |
96 | ] |
1408d0a4 |
97 | ); |
98 | |
99 | ok( my $response = request($request), 'Request' ); |
100 | ok( $response->is_success, 'Response Successful 2xx' ); |
fbcc39ad |
101 | is( $response->content_type, 'text/plain', 'Response Content-Type' ); |
102 | like( |
103 | $response->content, |
104 | qr/^bless\( .* 'Catalyst::Request' \)$/s, |
105 | 'Content is a serialized Catalyst::Request' |
106 | ); |
107 | |
1408d0a4 |
108 | { |
109 | no strict 'refs'; |
fbcc39ad |
110 | ok( |
111 | eval '$creq = ' . $response->content, |
112 | 'Unserialize Catalyst::Request' |
113 | ); |
1408d0a4 |
114 | } |
115 | |
116 | isa_ok( $creq, 'Catalyst::Request' ); |
117 | is( $creq->method, 'POST', 'Catalyst::Request method' ); |
fbcc39ad |
118 | is( $creq->content_type, 'multipart/form-data', |
119 | 'Catalyst::Request Content-Type' ); |
120 | is( $creq->content_length, $request->content_length, |
121 | 'Catalyst::Request Content-Length' ); |
122 | |
1408d0a4 |
123 | my @parts = $request->parts; |
124 | |
fbcc39ad |
125 | for ( my $i = 0 ; $i < @parts ; $i++ ) { |
126 | |
1408d0a4 |
127 | my $part = $parts[$i]; |
128 | my $disposition = $part->header('Content-Disposition'); |
129 | my %parameters = @{ ( split_header_words($disposition) )[0] }; |
fbcc39ad |
130 | |
8e061fef |
131 | my $upload = $creq->uploads->{ $parameters{name} }->[$i]; |
fbcc39ad |
132 | |
1408d0a4 |
133 | isa_ok( $upload, 'Catalyst::Request::Upload' ); |
134 | is( $upload->type, $part->content_type, 'Upload Content-Type' ); |
135 | is( $upload->filename, $parameters{filename}, 'Upload filename' ); |
136 | is( $upload->size, length( $part->content ), 'Upload Content-Length' ); |
a12e6f17 |
137 | is( $upload->basename, $parameters{filename}, 'Upload basename' ); |
a2e038a1 |
138 | |
ad51fa70 |
139 | SKIP: |
140 | { |
141 | if ( $ENV{CATALYST_SERVER} ) { |
142 | skip 'Not testing for deleted file on remote server', 1; |
143 | } |
144 | ok( !-e $upload->tempname, 'Upload temp file was deleted' ); |
145 | } |
1408d0a4 |
146 | } |
147 | } |
32d4bba8 |
148 | |
149 | { |
150 | my $creq; |
151 | |
fbcc39ad |
152 | my $request = POST( |
153 | 'http://localhost/engine/request/uploads/slurp', |
32d4bba8 |
154 | 'Content-Type' => 'multipart/form-data', |
a2e038a1 |
155 | 'Content' => |
156 | [ 'slurp' => ["$FindBin::Bin/live_engine_request_uploads.t"], ] |
32d4bba8 |
157 | ); |
158 | |
159 | ok( my $response = request($request), 'Request' ); |
160 | ok( $response->is_success, 'Response Successful 2xx' ); |
161 | is( $response->content_type, 'text/plain', 'Response Content-Type' ); |
fbcc39ad |
162 | is( $response->content, ( $request->parts )[0]->content, 'Content' ); |
ed4ac838 |
163 | |
164 | # XXX: no way to test that temporary file for this test was deleted |
32d4bba8 |
165 | } |
fdb3773e |
166 | |
167 | { |
168 | my $request = POST( |
169 | 'http://localhost/dump/request', |
170 | 'Content-Type' => 'multipart/form-data', |
171 | 'Content' => |
42da66a9 |
172 | [ 'file' => ["$FindBin::Bin/../catalyst_130pix.gif"], ] |
fdb3773e |
173 | ); |
174 | |
c4c4dd19 |
175 | # LWP will auto-correct Content-Length when using a remote server |
176 | SKIP: |
177 | { |
178 | if ( $ENV{CATALYST_SERVER} ) { |
179 | skip 'Using remote server', 2; |
180 | } |
fdb3773e |
181 | |
c4c4dd19 |
182 | # Sending wrong Content-Length here and see if subequent requests fail |
183 | $request->header('Content-Length' => $request->header('Content-Length') + 1); |
184 | |
185 | ok( my $response = request($request), 'Request' ); |
186 | ok( !$response->is_success, 'Response Error' ); |
187 | } |
fdb3773e |
188 | |
189 | $request = POST( |
190 | 'http://localhost/dump/request', |
191 | 'Content-Type' => 'multipart/form-data', |
192 | 'Content' => |
42da66a9 |
193 | [ 'file1' => ["$FindBin::Bin/../catalyst_130pix.gif"], |
194 | 'file2' => ["$FindBin::Bin/../catalyst_130pix.gif"], ] |
fdb3773e |
195 | ); |
196 | |
c4c4dd19 |
197 | ok( my $response = request($request), 'Request' ); |
fdb3773e |
198 | ok( $response->is_success, 'Response Successful 2xx' ); |
199 | is( $response->content_type, 'text/plain', 'Response Content-Type' ); |
513ac93d |
200 | { |
201 | local $@; |
202 | my $request = eval $response->content; |
203 | if ($@) { |
204 | fail("Could not inflate response: $@ " . $response->content); |
205 | } |
206 | else { |
207 | ok blessed($request->uploads->{file1}), 'Upload with name file1'; |
208 | ok blessed($request->uploads->{file2}),'Upload with name file2'; |
209 | } |
210 | } |
ed4ac838 |
211 | my $creq; |
212 | { |
213 | no strict 'refs'; |
214 | ok( |
215 | eval '$creq = ' . $response->content, |
216 | 'Unserialize Catalyst::Request' |
217 | ); |
218 | } |
219 | |
220 | for my $file ( $creq->upload ) { |
221 | my $upload = $creq->upload($file); |
ad51fa70 |
222 | SKIP: |
223 | { |
224 | if ( $ENV{CATALYST_SERVER} ) { |
225 | skip 'Not testing for deleted file on remote server', 1; |
226 | } |
227 | ok( !-e $upload->tempname, 'Upload temp file was deleted' ); |
228 | } |
ed4ac838 |
229 | } |
fdb3773e |
230 | } |
a7e05d9d |
231 | |
232 | { |
233 | my $creq; |
234 | |
235 | my $request = POST( |
236 | 'http://localhost/dump/request/', |
237 | 'Content-Type' => 'form-data', |
238 | 'Content' => [ |
239 | 'testfile' => 'textfield value', |
42da66a9 |
240 | 'testfile' => ["$FindBin::Bin/../catalyst_130pix.gif"], |
a7e05d9d |
241 | ] |
242 | ); |
243 | |
244 | ok( my $response = request($request), 'Request' ); |
245 | ok( $response->is_success, 'Response Successful 2xx' ); |
246 | is( $response->content_type, 'text/plain', 'Response Content-Type' ); |
247 | like( |
248 | $response->content, |
249 | qr/^bless\( .* 'Catalyst::Request' \)$/s, |
250 | 'Content is a serialized Catalyst::Request' |
251 | ); |
252 | |
253 | { |
254 | no strict 'refs'; |
255 | ok( |
256 | eval '$creq = ' . $response->content, |
257 | 'Unserialize Catalyst::Request' |
258 | ); |
259 | } |
260 | |
261 | isa_ok( $creq, 'Catalyst::Request' ); |
262 | is( $creq->method, 'POST', 'Catalyst::Request method' ); |
263 | is( $creq->content_type, 'multipart/form-data', |
264 | 'Catalyst::Request Content-Type' ); |
265 | is( $creq->content_length, $request->content_length, |
266 | 'Catalyst::Request Content-Length' ); |
267 | |
8e061fef |
268 | my $param = $creq->parameters->{testfile}; |
a7e05d9d |
269 | |
270 | ok( @$param == 2, '2 values' ); |
271 | is( $param->[0], 'textfield value', 'correct value' ); |
272 | like( $param->[1], qr/\Qcatalyst_130pix.gif/, 'filename' ); |
273 | |
274 | for my $part ( $request->parts ) { |
275 | |
276 | my $disposition = $part->header('Content-Disposition'); |
277 | my %parameters = @{ ( split_header_words($disposition) )[0] }; |
278 | |
279 | next unless exists $parameters{filename}; |
280 | |
8e061fef |
281 | my $upload = $creq->uploads->{ $parameters{name} }; |
a7e05d9d |
282 | |
283 | isa_ok( $upload, 'Catalyst::Request::Upload' ); |
284 | |
285 | is( $upload->type, $part->content_type, 'Upload Content-Type' ); |
286 | is( $upload->size, length( $part->content ), 'Upload Content-Length' ); |
ed4ac838 |
287 | is( $upload->filename, 'catalyst_130pix.gif', 'Upload Filename' ); |
a12e6f17 |
288 | is( $upload->basename, 'catalyst_130pix.gif', 'Upload basename' ); |
ad51fa70 |
289 | |
290 | SKIP: |
291 | { |
292 | if ( $ENV{CATALYST_SERVER} ) { |
293 | skip 'Not testing for deleted file on remote server', 1; |
294 | } |
295 | ok( !-e $upload->tempname, 'Upload temp file was deleted' ); |
296 | } |
a7e05d9d |
297 | } |
298 | } |
2f381252 |
299 | |
c4b09639 |
300 | # Test PUT request with application/octet-stream file gets deleted |
301 | |
302 | { |
303 | my $body; |
304 | |
305 | my $request = PUT( |
306 | 'http://localhost/dump/body/', |
307 | 'Content-Type' => 'application/octet-stream', |
308 | 'Content' => 'foobarbaz', |
cd2bff2a |
309 | 'Content-Length' => 9, |
c4b09639 |
310 | ); |
311 | |
312 | ok( my $response = request($request), 'Request' ); |
313 | ok( $response->is_success, 'Response Successful 2xx' ); |
314 | is( $response->content_type, 'text/plain', 'Response Content-Type' ); |
315 | like( |
316 | $response->content, |
317 | qr/bless\( .* 'HTTP::Body::OctetStream' \)/s, |
318 | 'Content is a serialized HTTP::Body::OctetStream' |
319 | ); |
320 | |
321 | { |
322 | no strict 'refs'; |
323 | ok( |
324 | eval '$body = ' . substr( $response->content, 8 ), # FIXME - substr not needed in other test cases? |
325 | 'Unserialize HTTP::Body::OctetStream' |
326 | ) or warn $@; |
327 | } |
328 | |
329 | isa_ok( $body, 'HTTP::Body::OctetStream' ); |
330 | isa_ok($body->body, 'File::Temp'); |
331 | |
ad51fa70 |
332 | SKIP: |
333 | { |
334 | if ( $ENV{CATALYST_SERVER} ) { |
335 | skip 'Not testing for deleted file on remote server', 1; |
336 | } |
337 | ok( !-e $body->body->filename, 'Upload temp file was deleted' ); |
338 | } |
c4b09639 |
339 | } |
340 | |
2f381252 |
341 | # test uploadtmp config var |
ad51fa70 |
342 | SKIP: |
2f381252 |
343 | { |
ad51fa70 |
344 | if ( $ENV{CATALYST_SERVER} ) { |
345 | skip 'Not testing uploadtmp on remote server', 14; |
346 | } |
347 | |
2f381252 |
348 | my $creq; |
349 | |
350 | my $dir = "$FindBin::Bin/"; |
351 | local TestApp->config->{ uploadtmp } = $dir; |
352 | $dir = Path::Class::Dir->new( $dir ); |
353 | |
354 | my $request = POST( |
355 | 'http://localhost/dump/request/', |
356 | 'Content-Type' => 'multipart/form-data', |
357 | 'Content' => [ |
358 | 'testfile' => ["$FindBin::Bin/live_engine_request_uploads.t"], |
359 | ] |
360 | ); |
361 | |
362 | ok( my $response = request($request), 'Request' ); |
363 | ok( $response->is_success, 'Response Successful 2xx' ); |
364 | is( $response->content_type, 'text/plain', 'Response Content-Type' ); |
365 | like( |
366 | $response->content, |
367 | qr/^bless\( .* 'Catalyst::Request' \)$/s, |
368 | 'Content is a serialized Catalyst::Request' |
369 | ); |
370 | |
371 | { |
372 | no strict 'refs'; |
373 | ok( |
374 | eval '$creq = ' . $response->content, |
375 | 'Unserialize Catalyst::Request' |
376 | ); |
377 | } |
378 | |
379 | isa_ok( $creq, 'Catalyst::Request' ); |
380 | is( $creq->method, 'POST', 'Catalyst::Request method' ); |
381 | is( $creq->content_type, 'multipart/form-data', |
382 | 'Catalyst::Request Content-Type' ); |
383 | is( $creq->content_length, $request->content_length, |
384 | 'Catalyst::Request Content-Length' ); |
385 | |
386 | for my $part ( $request->parts ) { |
387 | |
388 | my $disposition = $part->header('Content-Disposition'); |
389 | my %parameters = @{ ( split_header_words($disposition) )[0] }; |
390 | |
391 | next unless exists $parameters{filename}; |
392 | |
393 | my $upload = $creq->{uploads}->{ $parameters{name} }; |
394 | |
395 | isa_ok( $upload, 'Catalyst::Request::Upload' ); |
396 | |
397 | is( $upload->type, $part->content_type, 'Upload Content-Type' ); |
398 | is( $upload->size, length( $part->content ), 'Upload Content-Length' ); |
399 | |
400 | like( $upload->tempname, qr{\Q$dir\E}, 'uploadtmp' ); |
ed4ac838 |
401 | |
402 | ok( !-e $upload->tempname, 'Upload temp file was deleted' ); |
2f381252 |
403 | } |
404 | } |
405 | |