Beefy Boxes and Bandwidth Generously Provided by pair Networks
The stupid question is the question not asked
 
PerlMonks  

Re: Reacting to Mojo::UserAgent Errors

by marto (Cardinal)
on Apr 16, 2018 at 15:45 UTC ( #1213003=note: print w/replies, xml ) Need Help??


in reply to Reacting to Mojo::UserAgent Errors

Maybe Arogs are getting wise to you :P From the FAQ: What does "Inactivity timeout" mean? What does "Premature connection close" mean?, the Mojo::UserAgent has an example or response handling:

use Mojo::UserAgent; # Fine grained response handling (dies on connection errors) my $ua = Mojo::UserAgent->new; my $res = $ua->get('mojolicious.org/perldoc')->result; if ($res->is_success) { say $res->body } elsif ($res->is_error) { say $res->message } elsif ($res->code == 301) { say $res->headers->location } else { say 'Whatever...' }

Replies are listed 'Best First'.
Re^2: Reacting to Mojo::UserAgent Errors
by AlwaysSurprised (Novice) on Apr 16, 2018 at 23:51 UTC

    Perhaps they have wised to me, but at 5 URL/s they don't seem to have taken offence. It would be nice if Mojo::UserAgent allowed the useragent details to be set, but that doesn't appear to be the case.

    I have read from the book of Mojolicious at the temple of CPAN and the code you cite but I can't get it to work (or not work). I haven't found specific details so I interpret the if tree to be "look for 200" (aka is_success is a 200 response code), if not look for a connection problem (aka is_error means the GET timesout for some reason).

    Specifically, if I run

    use Mojo::UserAgent; # Fine grained response handling (dies on connection errors) my $ua = Mojo::UserAgent->new; my $res = $ua->get('mojoliciousness.org/perldoc')->result; if ($res->is_success) { print $res->body } elsif ($res->is_error) { print $res->message } elsif ($res->code == 301) { print $res->headers->location } else { print 'Whatever...' } print "Got to the end\n";

    with the correct URL, it works correctly and spits out the perldoc page and the extra message. Nowif I misspell the URL, like I have above, I'll get a "Can't connect: No such host is known" message but it doesn't show the "Got to the end" message i.e. the script terminates at is_error and I can't recover and move on.

    Am I missing something here?

      "It would be nice if Mojo::UserAgent allowed the useragent details to be set, but that doesn't appear to be the case."

      See transactor:

      # Change name of user agent $ua->transactor->name('MyUA 1.0');

      Here I used eval to catch errors. I'll check the situation you mention above at a sane hour.

      Am I missing something here?

      Due to your misspelling, no IP address could be resolved.

      $ua->get('mojoliciousness.org/perldoc')

      returns an object of type Mojo::Transaction::HTTP which contains an attribute called  original_remote_address.
      Checking if this attribute has a defined value should solve your problem.

      use Mojo::UserAgent; # Fine grained response handling (dies on connection errors) + my $ua = Mojo::UserAgent->new; #my $res = $ua->get('mojoliciousness.org/perldoc')->result; + my $res = $ua->get('mojoliciousness.org/perldoc'); if (defined ($res->original_remote_address)) { if ($res->result->is_success) { print $res->result->body } elsif ($res->result->is_error) { print $res->result->message } elsif ($res->result->code == 301) { print $res->result->headers->l +ocation } else { print 'Whatever...' } print "remote address: ".$res->original_remote_address."\n"; } else { print "failed to resolve url ...\n"; } print "Got to the end\n";

        My bad. I shouldn't have used a misspelt domain to illustrate crashing the script.

        My script, crashes out at the get with errors of "inactivity timeout" or "premature connection close". I can't see an attribute to interogate to capture those and recover. At the moment, the get fails, the script halts and I'm staring at the command prompt (All hail the command prompt); I'm not getting as far as the if statement.

Re^2: Reacting to Mojo::UserAgent Errors
by AlwaysSurprised (Novice) on Apr 21, 2018 at 23:52 UTC

    Forgive me for I have sinned. I have resolved my problem by wrapping my call to the perl script in a DOS batch file.

    Now when the get fails and I'm dropped out of perl, I trap the %errorlevel% and restart the call to perl. I feel dirty, but it works.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1213003]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others musing on the Monastery: (2)
As of 2020-10-25 05:58 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    My favourite web site is:












    Results (249 votes). Check out past polls.

    Notices?