Skip to content

Commit

Permalink
added support for 308 redirects to Mojo::UserAgent
Browse files Browse the repository at this point in the history
  • Loading branch information
kraih committed May 6, 2012
1 parent a038cec commit a51b932
Show file tree
Hide file tree
Showing 5 changed files with 57 additions and 9 deletions.
3 changes: 3 additions & 0 deletions Changes
@@ -1,7 +1,10 @@
This file documents the revision history for Perl extension Mojolicious.

2.94 2012-05-06
- Added support for 308 redirects to Mojo::UserAgent.
- Added support for new HTTP status codes.
- Improved documentation.
- Fixed typo in 414 status message.
- Fixed small backlog bug in Mojo::Server::Daemon.

2.93 2012-05-05
Expand Down
6 changes: 5 additions & 1 deletion lib/Mojo/Message/Response.pm
Expand Up @@ -20,13 +20,16 @@ my %MESSAGES = (
205 => 'Reset Content',
206 => 'Partial Content',
207 => 'Multi-Status', # RFC 2518 (WebDAV)
208 => 'Already Reported', # RFC 5842
226 => 'IM Used', # RFC 3229
300 => 'Multiple Choices',
301 => 'Moved Permanently',
302 => 'Found',
303 => 'See Other',
304 => 'Not Modified',
305 => 'Use Proxy',
307 => 'Temporary Redirect',
308 => 'Permanent Redirect', # draft-reschke-http-status-308
400 => 'Bad Request',
401 => 'Unauthorized',
402 => 'Payment Required',
Expand All @@ -41,7 +44,7 @@ my %MESSAGES = (
411 => 'Length Required',
412 => 'Precondition Failed',
413 => 'Request Entity Too Large',
414 => 'Request-URI Too Large',
414 => 'Request-URI Too Long',
415 => 'Unsupported Media Type',
416 => 'Request Range Not Satisfiable',
417 => 'Expectation Failed',
Expand All @@ -63,6 +66,7 @@ my %MESSAGES = (
505 => 'HTTP Version Not Supported',
506 => 'Variant Also Negotiates', # RFC 2295
507 => 'Insufficient Storage', # RFC 2518 (WebDAV)
508 => 'Loop Detected', # RFC 5842
509 => 'Bandwidth Limit Exceeded', # Unofficial
510 => 'Not Extended', # RFC 2774
511 => 'Network Authentication Required', # RFC 6585
Expand Down
8 changes: 4 additions & 4 deletions lib/Mojo/UserAgent/Transactor.pm
Expand Up @@ -129,7 +129,7 @@ sub redirect {
# Commonly used codes
my $res = $old->res;
my $code = $res->code || 0;
return unless $code ~~ [301, 302, 303, 307];
return unless $code ~~ [301, 302, 303, 307, 308];

# Fix broken location without authority and/or scheme
return unless my $location = $res->headers->location;
Expand All @@ -142,7 +142,7 @@ sub redirect {
# Clone request if necessary
my $new = Mojo::Transaction::HTTP->new;
my $method = $req->method;
if ($code ~~ [301, 307]) {
if ($code ~~ [301, 307, 308]) {
return unless $req = $req->clone;
$new->req($req);
$req->headers->remove('Host')->remove('Cookie')->remove('Referer');
Expand Down Expand Up @@ -330,8 +330,8 @@ possible.
my $tx = $t->redirect($old);
Build L<Mojo::Transaction::HTTP> followup request for C<301>, C<302>, C<303>
or C<307> redirect response if possible.
Build L<Mojo::Transaction::HTTP> followup request for C<301>, C<302>, C<303>,
C<307> or C<308> redirect response if possible.
=head2 C<tx>
Expand Down
8 changes: 6 additions & 2 deletions t/mojo/response.t
@@ -1,6 +1,6 @@
use Mojo::Base -strict;

use Test::More tests => 350;
use Test::More tests => 354;

# "Quick Smithers. Bring the mind eraser device!
# You mean the revolver, sir?
Expand All @@ -25,13 +25,16 @@ is $res->code(204)->default_message, 'No Content', 'right message';
is $res->code(205)->default_message, 'Reset Content', 'right message';
is $res->code(206)->default_message, 'Partial Content', 'right message';
is $res->code(207)->default_message, 'Multi-Status', 'right message';
is $res->code(208)->default_message, 'Already Reported', 'right message';
is $res->code(226)->default_message, 'IM Used', 'right message';
is $res->code(300)->default_message, 'Multiple Choices', 'right message';
is $res->code(301)->default_message, 'Moved Permanently', 'right message';
is $res->code(302)->default_message, 'Found', 'right message';
is $res->code(303)->default_message, 'See Other', 'right message';
is $res->code(304)->default_message, 'Not Modified', 'right message';
is $res->code(305)->default_message, 'Use Proxy', 'right message';
is $res->code(307)->default_message, 'Temporary Redirect', 'right message';
is $res->code(308)->default_message, 'Permanent Redirect', 'right message';
is $res->code(400)->default_message, 'Bad Request', 'right message';
is $res->code(401)->default_message, 'Unauthorized', 'right message';
is $res->code(402)->default_message, 'Payment Required', 'right message';
Expand All @@ -48,7 +51,7 @@ is $res->code(411)->default_message, 'Length Required', 'right message';
is $res->code(412)->default_message, 'Precondition Failed', 'right message';
is $res->code(413)->default_message, 'Request Entity Too Large',
'right message';
is $res->code(414)->default_message, 'Request-URI Too Large', 'right message';
is $res->code(414)->default_message, 'Request-URI Too Long', 'right message';
is $res->code(415)->default_message, 'Unsupported Media Type', 'right message';
is $res->code(416)->default_message, 'Request Range Not Satisfiable',
'right message';
Expand All @@ -74,6 +77,7 @@ is $res->code(505)->default_message, 'HTTP Version Not Supported',
is $res->code(506)->default_message, 'Variant Also Negotiates',
'right message';
is $res->code(507)->default_message, 'Insufficient Storage', 'right message';
is $res->code(508)->default_message, 'Loop Detected', 'right message';
is $res->code(509)->default_message, 'Bandwidth Limit Exceeded',
'right message';
is $res->code(510)->default_message, 'Not Extended', 'right message';
Expand Down
41 changes: 39 additions & 2 deletions t/mojo/transactor.t
@@ -1,6 +1,6 @@
use Mojo::Base -strict;

use Test::More tests => 238;
use Test::More tests => 257;

# "Once the government approves something, it's no longer immoral!"
use File::Spec::Functions 'catdir';
Expand Down Expand Up @@ -463,10 +463,47 @@ is $tx->req->body, '', 'no content';
is $tx->res->code, undef, 'no status';
is $tx->res->headers->location, undef, 'no "Location" value';

# 308 redirect (unsupported)
# Simple 308 redirect
$tx = $t->tx(POST => 'http://mojolico.us/foo', {Accept => 'application/json'});
$tx->res->code(308);
$tx->res->headers->location('http://kraih.com/bar');
is $tx->req->headers->accept, 'application/json', 'right "Accept" value';
is $tx->req->body, '', 'no content';
$tx = $t->redirect($tx);
is $tx->req->method, 'POST', 'right method';
is $tx->req->url->to_abs, 'http://kraih.com/bar', 'right URL';
is $tx->req->headers->accept, 'application/json', 'right "Accept" value';
is $tx->req->headers->location, undef, 'no "Location" value';
is $tx->req->body, '', 'no content';
is $tx->res->code, undef, 'no status';
is $tx->res->headers->location, undef, 'no "Location" value';

# 308 redirect with content
$tx = $t->tx(POST => 'http://mojolico.us/foo', {Accept => '*/*'}, 'whatever');
$tx->res->code(308);
$tx->res->headers->location('http://kraih.com/bar');
is $tx->req->headers->accept, '*/*', 'right "Accept" value';
is $tx->req->body, 'whatever', 'right content';
$tx = $t->redirect($tx);
is $tx->req->method, 'POST', 'right method';
is $tx->req->url->to_abs, 'http://kraih.com/bar', 'right URL';
is $tx->req->headers->accept, '*/*', 'right "Accept" value';
is $tx->req->headers->location, undef, 'no "Location" value';
is $tx->req->body, 'whatever', 'right content';
is $tx->res->code, undef, 'no status';
is $tx->res->headers->location, undef, 'no "Location" value';

# 308 redirect (dynamic)
$tx = $t->tx(POST => 'http://mojolico.us/foo');
$tx->res->code(308);
$tx->res->headers->location('http://kraih.com/bar');
$tx->req->write_chunk('whatever', sub { shift->finish });
is $t->redirect($tx), undef, 'unsupported redirect';

# 309 redirect (unsupported)
$tx = $t->tx(POST => 'http://mojolico.us/foo', {Accept => 'application/json'});
$tx->res->code(309);
$tx->res->headers->location('http://kraih.com/bar');
is $tx->req->headers->accept, 'application/json', 'right "Accept" value';
is $tx->req->body, '', 'no content';
is $t->redirect($tx), undef, 'unsupported redirect';

0 comments on commit a51b932

Please sign in to comment.