LWP gives 302 Found after update?

J

John Bokma

The following script used to work (Logs in to a PHPbb message board):

use strict;
use warnings;

use LWP::UserAgent;
use LWP::Debug qw(+);

my $ua = LWP::UserAgent->new();

my $response = $ua->post(

"http://toxicice.com/login.php", [

username => 'xxxxxxx',
password => 'xxxx',
autlogin => 'off',
redirect => '',
login => 'Log in',
]
);
$response->is_success or
die "Login failed: ", $response->status_line, "\n";

With an invalid username/password (as above), it gives:

LWP::UserAgent::new: ()
LWP::UserAgent::request: ()
LWP::UserAgent::send_request: POST http://toxici
LWP::UserAgent::_need_proxy: Not proxied
LWP::protocol::http::request: ()
LWP::protocol::collect: read 398 bytes

.... snipped ...

LWP::protocol::collect: read 188 bytes
LWP::UserAgent::request: Simple response: OK

However, with a valid one it gives:

LWP::UserAgent::new: ()
LWP::UserAgent::request: ()
LWP::UserAgent::send_request: POST http://toxicice.com/login.php
LWP::UserAgent::_need_proxy: Not proxied
LWP::protocol::http::request: ()
LWP::UserAgent::request: Simple response: Found
Login failed: 302 Found

$response->content is empty ('').

I updated some time ago to a more recent version of ActiveState Perl,
and probably LWP was upgraded as well. OTOH it might be a server thing.

perl -v
....
This is perl, v5.8.7 built for MSWin32-x86-multi-thread
....

query *
....
libwww-perl [5.803.0.1] Web API for Perl
....

(Complete script is at:
http://johnbokma.com/perl/phpbb-remote-backup.html )

( If you want to test but have no PHP board, mail: phpbb at johnbokma
dot com, and I arrange a test log in, don't create a test login
yourself, thanks )
 
B

Brian Wakem

John said:
Login failed: 302 Found

$response->content is empty ('').


The page is printing a Location: header, which tells the browser to go
somewhere else. LWP::UserAgent does not follow this by default for POSTs.

Add this:-

push @{ $ua->requests_redirectable }, 'POST';
 
J

J. Gleixner

John said:
The following script used to work (Logs in to a PHPbb message board):

use strict;
use warnings;

use LWP::UserAgent;
use LWP::Debug qw(+);

my $ua = LWP::UserAgent->new();

my $response = $ua->post(

"http://toxicice.com/login.php", [

username => 'xxxxxxx',
password => 'xxxx',
autlogin => 'off',
redirect => '',
login => 'Log in',
]
);
$response->is_success or
die "Login failed: ", $response->status_line, "\n";
However, with a valid one it gives:

LWP::UserAgent::new: ()
LWP::UserAgent::request: ()
LWP::UserAgent::send_request: POST http://toxicice.com/login.php
LWP::UserAgent::_need_proxy: Not proxied
LWP::protocol::http::request: ()
LWP::UserAgent::request: Simple response: Found
Login failed: 302 Found

Just a quick guess... Dumping $ua:

$VAR1 = bless( {
'max_redirect' => 7,
'protocols_forbidden' => undef,
'no_proxy' => [],
'protocols_allowed' => undef,
'use_eval' => 1,
'requests_redirectable' => [
'GET',
'HEAD'
],
'from' => undef,
'timeout' => 180,
'agent' => 'libwww-perl/5.803',
'def_headers' => undef,
'parse_head' => 1,
'proxy' => {},
'max_size' => undef
}, 'LWP::UserAgent' );

Since a 302 means a redirect is being requested, and
'requests_redirectable' only contain GET and HEAD requests, possibly the
POST isn't seen as being redirecable. Maybe adding 'POST' to that
attribute, or possibly doing a GET will resolve it.

WWW::Mechanize might provide a better interface, for interacting with
the site.
 
J

John Bokma

Brian Wakem said:
The page is printing a Location: header, which tells the browser to go
somewhere else. LWP::UserAgent does not follow this by default for
POSTs.

Add this:-

push @{ $ua->requests_redirectable }, 'POST';

Aargh, it was even in the manual :-( Many thanks, it fixed my script. I
have no idea however, why it started to fail in the first place. Was POST
removed from the list recently? (I can't remember I updated PHPbb
recently).
 
B

Brian Wakem

John said:
Aargh, it was even in the manual :-( Many thanks, it fixed my script. I
have no idea however, why it started to fail in the first place. Was POST
removed from the list recently? (I can't remember I updated PHPbb
recently).


I don't recall POST ever being in that redirectable array. I've only been
using Perl for 5yrs though.
 
J

J. Gleixner

Brian said:
John Bokma wrote:

More likely is that the Web site changed something.
I don't recall POST ever being in that redirectable array. I've only been
using Perl for 5yrs though.

Much older versions used redirect_ok(), which was:

sub redirect_ok
{
# draft-ietf-http-v10-spec-02.ps from www.ics.uci.edu, specify:
#
# If the 30[12] status code is received in response to a request using
# the POST method, the user agent must not automatically redirect the
# request unless it can be confirmed by the user, since this might
change
# the conditions under which the request was issued.

my($self, $request) = @_;
return 0 if $request->method eq "POST";
1;
}
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
474,034
Messages
2,570,356
Members
47,002
Latest member
RobertoLip

Latest Threads

Top