7 use lib "$FindBin::Bin/lib";
9 use Test::More tests => 88;
10 use Catalyst::Test 'TestApp';
12 use Catalyst::Request;
13 use Catalyst::Request::Upload;
15 use HTTP::Headers::Util 'split_header_words';
16 use HTTP::Request::Common;
23 'http://localhost/dump/request/',
24 'Content-Type' => 'form-data',
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"],
35 ok( my $response = request($request), 'Request' );
36 ok( $response->is_success, 'Response Successful 2xx' );
37 is( $response->content_type, 'text/plain', 'Response Content-Type' );
40 qr/^bless\( .* 'Catalyst::Request' \)$/s,
41 'Content is a serialized Catalyst::Request'
47 eval '$creq = ' . $response->content,
48 'Unserialize Catalyst::Request'
52 isa_ok( $creq, 'Catalyst::Request' );
53 is( $creq->method, 'POST', 'Catalyst::Request method' );
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' );
59 for my $part ( $request->parts ) {
61 my $disposition = $part->header('Content-Disposition');
62 my %parameters = @{ ( split_header_words($disposition) )[0] };
64 my $upload = $creq->{uploads}->{ $parameters{filename} };
66 isa_ok( $upload, 'Catalyst::Request::Upload' );
68 is( $upload->type, $part->content_type, 'Upload Content-Type' );
69 is( $upload->size, length( $part->content ), 'Upload Content-Length' );
71 # make sure upload is accessible via legacy params->{$file}
72 is( $creq->{parameters}->{ $upload->filename },
73 $upload->filename, 'legacy param method ok' );
77 if ( $ENV{CATALYST_SERVER} ) {
78 skip 'Not testing for deleted file on remote server', 1;
80 ok( !-e $upload->tempname, 'Upload temp file was deleted' );
89 'http://localhost/dump/request/',
90 'Content-Type' => 'multipart/form-data',
92 'testfile' => ["$FindBin::Bin/live_engine_request_cookies.t"],
93 'testfile' => ["$FindBin::Bin/live_engine_request_headers.t"],
94 'testfile' => ["$FindBin::Bin/live_engine_request_uploads.t"],
98 ok( my $response = request($request), 'Request' );
99 ok( $response->is_success, 'Response Successful 2xx' );
100 is( $response->content_type, 'text/plain', 'Response Content-Type' );
103 qr/^bless\( .* 'Catalyst::Request' \)$/s,
104 'Content is a serialized Catalyst::Request'
110 eval '$creq = ' . $response->content,
111 'Unserialize Catalyst::Request'
115 isa_ok( $creq, 'Catalyst::Request' );
116 is( $creq->method, 'POST', 'Catalyst::Request method' );
117 is( $creq->content_type, 'multipart/form-data',
118 'Catalyst::Request Content-Type' );
119 is( $creq->content_length, $request->content_length,
120 'Catalyst::Request Content-Length' );
122 my @parts = $request->parts;
124 for ( my $i = 0 ; $i < @parts ; $i++ ) {
126 my $part = $parts[$i];
127 my $disposition = $part->header('Content-Disposition');
128 my %parameters = @{ ( split_header_words($disposition) )[0] };
130 my $upload = $creq->{uploads}->{ $parameters{name} }->[$i];
132 isa_ok( $upload, 'Catalyst::Request::Upload' );
133 is( $upload->type, $part->content_type, 'Upload Content-Type' );
134 is( $upload->filename, $parameters{filename}, 'Upload filename' );
135 is( $upload->size, length( $part->content ), 'Upload Content-Length' );
139 if ( $ENV{CATALYST_SERVER} ) {
140 skip 'Not testing for deleted file on remote server', 1;
142 ok( !-e $upload->tempname, 'Upload temp file was deleted' );
151 'http://localhost/engine/request/uploads/slurp',
152 'Content-Type' => 'multipart/form-data',
154 [ 'slurp' => ["$FindBin::Bin/live_engine_request_uploads.t"], ]
157 ok( my $response = request($request), 'Request' );
158 ok( $response->is_success, 'Response Successful 2xx' );
159 is( $response->content_type, 'text/plain', 'Response Content-Type' );
160 is( $response->content, ( $request->parts )[0]->content, 'Content' );
165 'http://localhost/dump/request',
166 'Content-Type' => 'multipart/form-data',
168 [ 'file' => ["$FindBin::Bin/catalyst_130pix.gif"], ]
171 # LWP will auto-correct Content-Length when using a remote server
174 if ( $ENV{CATALYST_SERVER} ) {
175 skip 'Using remote server', 2;
178 # Sending wrong Content-Length here and see if subequent requests fail
179 $request->header('Content-Length' => $request->header('Content-Length') + 1);
181 ok( my $response = request($request), 'Request' );
182 ok( !$response->is_success, 'Response Error' );
186 'http://localhost/dump/request',
187 'Content-Type' => 'multipart/form-data',
189 [ 'file1' => ["$FindBin::Bin/catalyst_130pix.gif"],
190 'file2' => ["$FindBin::Bin/catalyst_130pix.gif"], ]
193 ok( my $response = request($request), 'Request' );
194 ok( $response->is_success, 'Response Successful 2xx' );
195 is( $response->content_type, 'text/plain', 'Response Content-Type' );
196 like( $response->content, qr/file1 => bless/, 'Upload with name file1');
197 like( $response->content, qr/file2 => bless/, 'Upload with name file2');
204 'http://localhost/dump/request/',
205 'Content-Type' => 'form-data',
207 'testfile' => 'textfield value',
208 'testfile' => ["$FindBin::Bin/catalyst_130pix.gif"],
212 ok( my $response = request($request), 'Request' );
213 ok( $response->is_success, 'Response Successful 2xx' );
214 is( $response->content_type, 'text/plain', 'Response Content-Type' );
217 qr/^bless\( .* 'Catalyst::Request' \)$/s,
218 'Content is a serialized Catalyst::Request'
224 eval '$creq = ' . $response->content,
225 'Unserialize Catalyst::Request'
229 isa_ok( $creq, 'Catalyst::Request' );
230 is( $creq->method, 'POST', 'Catalyst::Request method' );
231 is( $creq->content_type, 'multipart/form-data',
232 'Catalyst::Request Content-Type' );
233 is( $creq->content_length, $request->content_length,
234 'Catalyst::Request Content-Length' );
236 my $param = $creq->{parameters}->{testfile};
238 ok( @$param == 2, '2 values' );
239 is( $param->[0], 'textfield value', 'correct value' );
240 like( $param->[1], qr/\Qcatalyst_130pix.gif/, 'filename' );
242 for my $part ( $request->parts ) {
244 my $disposition = $part->header('Content-Disposition');
245 my %parameters = @{ ( split_header_words($disposition) )[0] };
247 next unless exists $parameters{filename};
249 my $upload = $creq->{uploads}->{ $parameters{name} };
251 isa_ok( $upload, 'Catalyst::Request::Upload' );
253 is( $upload->type, $part->content_type, 'Upload Content-Type' );
254 is( $upload->size, length( $part->content ), 'Upload Content-Length' );
255 is( $upload->filename, 'catalyst_130pix.gif' );
259 # test uploadtmp config var
262 if ( $ENV{CATALYST_SERVER} ) {
263 skip 'Not testing uploadtmp on remote server', 13;
268 my $dir = "$FindBin::Bin/";
269 local TestApp->config->{ uploadtmp } = $dir;
270 $dir = Path::Class::Dir->new( $dir );
273 'http://localhost/dump/request/',
274 'Content-Type' => 'multipart/form-data',
276 'testfile' => ["$FindBin::Bin/live_engine_request_uploads.t"],
280 ok( my $response = request($request), 'Request' );
281 ok( $response->is_success, 'Response Successful 2xx' );
282 is( $response->content_type, 'text/plain', 'Response Content-Type' );
285 qr/^bless\( .* 'Catalyst::Request' \)$/s,
286 'Content is a serialized Catalyst::Request'
292 eval '$creq = ' . $response->content,
293 'Unserialize Catalyst::Request'
297 isa_ok( $creq, 'Catalyst::Request' );
298 is( $creq->method, 'POST', 'Catalyst::Request method' );
299 is( $creq->content_type, 'multipart/form-data',
300 'Catalyst::Request Content-Type' );
301 is( $creq->content_length, $request->content_length,
302 'Catalyst::Request Content-Length' );
304 for my $part ( $request->parts ) {
306 my $disposition = $part->header('Content-Disposition');
307 my %parameters = @{ ( split_header_words($disposition) )[0] };
309 next unless exists $parameters{filename};
311 my $upload = $creq->{uploads}->{ $parameters{name} };
313 isa_ok( $upload, 'Catalyst::Request::Upload' );
315 is( $upload->type, $part->content_type, 'Upload Content-Type' );
316 is( $upload->size, length( $part->content ), 'Upload Content-Length' );
318 like( $upload->tempname, qr{\Q$dir\E}, 'uploadtmp' );