in reply to LWP::UserAgent destroys $response->content >:{

So, Shall I dispense with the UserAgent Request and run it through lower level code? >:-{ (Defeating the purpose of UserAgent) (Not a satisfactory solution)

OR

Use the filename method and use a 'length of file (= length of response)' test before assuming that UserAgent error response is valid (i.e. rebuild the response->content from the collected file copy if response is not 'too short'? (A workable patch - maybe)

OR

Get LinkSys to check their disconnect logic? (Not likely)

Start debugging lower layers? (Well, that's the same as the first idea (Not a satisfactory solution - and no guarantee of success.

Guess I'll put in a response (in file) length test to validate UserAgent error - bleearghr ;)

Unless someone can help me with the lower level stuff.

I have a LinkSys router at home--I think that's the same model. I'll check tonight to see if I get the same error.

Here are some things you could try:

  1. export PERL_LWP_USE_HTTP_10=1 before you run Perl. It probably won't change anything, but you never know.
  2. Try this:
    $ua = LWP::UserAgent->new(use_eval => 0); ... eval { $response = $ua->request($request); }; if ($@) { if ($@ =~ /Connection refused/) { # ignore error } else { # just like, ya know, die or something } } # I think $response will still be intact here.
    Very much untested!!!!
  3. Upgrade Linksys firmware. There is one version on their web site, but the only thing it says it fixes is a UPnP error, so it probably won't help.
  4. Modify the function my_read in Net/HTTP/Methods.pm to ignore ECONNRESET. I think this is the right place.

Replies are listed 'Best First'.
Re: Re: LWP::UserAgent destroys $response->content >:{
by SPotter (Initiate) on May 23, 2003 at 15:04 UTC
    I tried:-
    $ua = LWP::UserAgent->new(use_eval => 0); . . eval { $response = $ua->request($request); }; if ($@) { #print "eval: " . $@ . "\n"; if ($@ =~ /Connection refused/) { print "Response Content...\n"; print $response->content . "\n"; } else { . .
    It still didn't work:-
    (print "eval: " . $@ . "\n";)
    gives:-
    eval: Can't read entity body: Connection reset by peer at /usr/local/l +ib/perl5/site_perl/5.005/LWP/Protocol/http.pm line 337.
    So, (looking at http.pm) there's the problem confirmed.
    1) Linksys BEFSR41 drops the connection before HTTP layer is satisfied that data collection is complete.
    2) HTTP layer destroys the response->content collected thus far. >:{

    So, anyone care to tell me how to fix the HTTP layer so it does NOT destroy response->content on a dropped connection - if it already collected (at least some) data from current session?
    OR
    Do I resort to using filename method, with a "length of response" test, to validate UserAgent error, AND rebuild my $response->content from file? (bleaaurh).

    Steve Potter
    http://www3.sympatico.ca/steven.potter/
      Oops, in my code I had /Connection refused/ it should be /Connection reset/. See if that works.

      When I was at home, I didn't have any problems accessing the LinkSys (which is the same model). My firmware was from May 2002. I can't remember the version number. You might try upgrading the firmware.