The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

AnyEvent::HTTP::LWP::UserAgent - LWP::UserAgent interface but works using AnyEvent::HTTP

VERSION

version 0.10

SYNOPSIS

  use AnyEvent::HTTP::LWP::UserAgent;
  use Coro;

  my $ua = AnyEvent::HTTP::LWP::UserAgent->new;
  my @urls = (...);
  my @coro = map {
      my $url = $_;
      async {
          my $r = $ua->get($url);
          print "url $url, content " . $r->content . "\n";
      }
  } @urls;
  $_->join for @coro;

  # Or without Coro
  use AnyEvent::HTTP::LWP::UserAgent;
  use AnyEvent;

  my $ua = AnyEvent::HTTP::LWP::UserAgent->new;
  my @urls = (...);
  my $cv = AE::cv;
  $cv->begin;
  foreach my $url (@urls) {
      $cv->begin;
      $ua->get_async($url)->cb(sub {
          my $r = shift->recv;
          print "url $url, content " . $r->content . "\n";
          $cv->end;
      });
  }
  $cv->end;
  $cv->recv;

DESCRIPTION

When you use Coro you have a choice: you can use Coro::LWP or AnyEvent::HTTP (if you want to make asynchronous HTTP requests). If you use Coro::LWP, some modules may work incorrectly (for example Cache::Memcached) because of global change of IO::Socket behavior. AnyEvent::HTTP uses different programming interface, so you must change more of your old code with LWP::UserAgent (and HTTP::Request and so on), if you want to make asynchronous code.

AnyEvent::HTTP::LWP::UserAgent uses AnyEvent::HTTP inside but have an interface of LWP::UserAgent. You can safely use this module in Coro environment (and possibly in AnyEvent too).

In plain AnyEvent, you may use _async methods. They don't make blocking wait but return condition variable. So, you can avoid recursive blocking wait error.

SOME METHODS

$ua->conn_cache
$ua->conn_cache($cache_obj)

New versions of AnyEvent::HTTP supports HTTP(S)/1.1 persistent connection, so you can control it in AnyEvent::HTTP::LWP::UserAgent using conn_cache method.

If you set conn_cache (as LWP::ConnCache object) then Anyevent::HTTP::LWP::UserAgent makes two things. In first it sets global variable $AnyEvent::HTTP::ACTIVE as you setted total_capacity for conn_cache (be careful: this have a global consequences, not local). And in the second AnyEvent::HTTP::LWP::UserAgent will create persistent connections if your $ua have conn_cache (local propery of $ua).

But you can't use remainder methods of your conn_cache, all connections will contains in AnyEvent::HTTP. $AnyEvent::HTTP::ACTIVE sets only when you set conn_cache for $ua. If you just change total_capacity of old conn_cache it will not change anything.

ASYNC METHODS

The following methods are async version of corresponding methods w/o _async suffix. Parameters are identical as originals. However, return value becomes condition variable. You can use it in a synchronous way by blocking wait

  $ua->simple_request_async(@args)->recv

or in an asynchronous way, also.

  $ua->simple_request_async(@args)->cb(sub { ... });
simple_request_async
request_async
get_async
post_async
head_async
put_async
delete_async

LIMITATIONS AND DETAILS

Some features of LWP::UserAgent can be broken (protocols_forbidden or something else). Precise documentation and realization of these features will come in the future.

You can use some AnyEvent::HTTP global function and variables. But use agent of UA instead of $AnyEvent::HTTP::USERAGENT and max_redirect instead of $AnyEvent::HTTP::MAX_RECURSE.

Content in request can be specified by code reference. This is the same as LWP::UserAgent but there are some limitations. LWP::UserAgent uses chunked encoding if Content-Length is not specified, while this module does NOT use chunked encoding even if Content-Length is not specified.

Content in response can be specified as filename or code reference. This is the same as LWP::UserAgent.

SEE ALSO

http://github.com/tadam/AnyEvent-HTTP-LWP-UserAgent Coro::LWP AnyEvent::HTTP LWP::Protocol::AnyEvent::http LWP::Protocol::Coro::http

ACKNOWLEDGEMENTS

Yasutaka Atarashi

AUTHOR

Yury Zavarin <yury.zavarin@gmail.com>

COPYRIGHT AND LICENSE

This software is copyright (c) 2012 by Yury Zavarin.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.