Beefy Boxes and Bandwidth Generously Provided by pair Networks
Pathologically Eclectic Rubbish Lister
 
PerlMonks  

•Re: LWP::UserAgent subclass to make it follow redirects after POST (like Netscape)

by merlyn (Sage)
on Feb 26, 2002 at 16:15 UTC ( #147611=note: print w/replies, xml ) Need Help??


in reply to LWP::UserAgent subclass to make it follow redirects after POST (like Netscape)

This is much simpler:
use LWP::UserAgent; sub LWP::UserAgent::redirect_ok { my ($self, $request) = @_; $request->method("GET"),$request->content("") if $request->method eq + "POST"; 1; } ...
You can subclass it if you wish, but just "patching" it fixes program-wide behavior.

-- Randal L. Schwartz, Perl hacker


updated code based on feedback.
  • Comment on •Re: LWP::UserAgent subclass to make it follow redirects after POST (like Netscape)
  • Download Code

Replies are listed 'Best First'.
Re: •Re: LWP::UserAgent subclass to make it follow redirects after POST (like Netscape)
by gregorovius (Friar) on Feb 26, 2002 at 16:29 UTC
    Doing that is not enough. The POST request must be converted into a GET request by the agent and its content removed. That's Netscape's exact behavior, as far as I remember (I wrote this code about a year ago). This snippet in my code does it:
    if($request->method eq 'POST') { $referral->method('GET'); $referral->content(''); }
    Last time I checked UserAgent was not doing this as a result of overriding redirect_ok().

    Update: This is a reply to Merlyn's original post, in which redirect_ok simply returned a 1.

¶Re: •Re: LWP::UserAgent subclass to make it follow redirects after POST (like Netscape)
by Anonymous Monk on Feb 27, 2002 at 00:51 UTC
    The latest LWP::UserAgent allows the behavior of redirect_ok to be overridden using the requests_redirectable method.
    $ua->requests_redirectable( ); # to read $ua->requests_redirectable( \@requests ); # to set This reads or sets the object's list of request names that $ua->redirect_ok(...) will allow redirection for. By default, this is ['GET', 'HEAD'], as per RFC 2068. To change to include 'POST', consider: push @{ $ua->requests_redirectable }, 'POST'; $ua->redirect_ok($prospective_request) This method is called by request() before it tries to follow a redirection to the request in $prospective_request. This should return a true value if this redirection is permissible. The default implementation will return FALSE unless the method is in the object's requests_redirectable list, FALSE if the proposed redirection is to a "file://..." URL, and TRUE otherwise. Subclasses might want to override this. (This method's behavior in previous versions was simply to return TRUE for anything except POST requests).

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://147611]
help
Chatterbox?
[Discipulus]: get them all printed on screen
Discipulus ;=)
[shmem]: silly question, silly answer:
[Discipulus]: i know, i know..
[shmem]: man perlfunc |perl -nle '$ok++ if /Alphabetical Listing of Perl Functions/;if($ok ){$s{$1}++if /^ (\w+)/}}{for(keys %s){$f="prototype \\\&CORE::$_"; eval"$f"||delete $CORE::{$_}}print for sort keys%CORE::'
[shmem]: well, there are some builtins which don't have a prototype...
[Discipulus]: eh eh.. i was looking in toke.c but dunno if is already used
[shmem]: oh the whitespace in the regex got condensed, meh

How do I use this? | Other CB clients
Other Users?
Others scrutinizing the Monastery: (9)
As of 2017-05-23 10:04 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?