Provided by: libfurl-perl_3.13-1_all bug

NAME

       Furl::HTTP - Low level interface to Furl

SYNOPSIS

           use Furl;

           my $furl = Furl::HTTP->new(
               agent   => 'MyGreatUA/2.0',
               timeout => 10,
           );

           my ($minor_version, $code, $msg, $headers, $body) = $furl->request(
               method     => 'GET',
               host       => 'example.com',
               port       => 80,
               path_query => '/'
           );
           # or

           # Accept-Encoding is supported but optional
           $furl = Furl->new(
               headers => [ 'Accept-Encoding' => 'gzip' ],
           );
           my $body = $furl->get('http://example.com/some/compressed');

DESCRIPTION

       Furl is yet another HTTP client library. LWP is the de facto standard HTTP client for Perl 5, but it is
       too slow for some critical jobs, and too complex for weekend hacking. Furl resolves these issues. Enjoy
       it!

INTERFACE

   Class Methods
       "Furl::HTTP->new(%args | \%args) :Furl"

       Creates and returns a new Furl client with %args. Dies on errors.

       %args might be:

       agent :Str = "Furl/$VERSION"
       timeout :Int = 10
           Seconds until the call to $furl->request returns a timeout error (as an internally generated 500
           error). The timeout might not be accurate since some underlying modules / built-ins function may
           block longer than the specified timeout. See the "FAQ" for how to support timeout during name
           resolution.

       inactivity_timeout :Int = 600
           An inactivity timer for TCP read/write (in seconds). $furl->request returns a timeout error if no
           additional data arrives (or is sent) within the specified threshold.

       max_redirects :Int = 7
       proxy :Str
       no_proxy :Str
       headers :ArrayRef
       header_format :Int = HEADERS_AS_ARRAYREF
           This option choose return value format of "$furl->request".

           This option allows HEADERS_NONE or HEADERS_AS_ARRAYREF.

           HEADERS_AS_ARRAYREF is a default value. This makes $headers as ArrayRef.

           HEADERS_NONE makes $headers as undef. Furl does not return parsing result of headers. You should take
           needed headers from special_headers.

       connection_pool :Object
           This is the connection pool object for keep-alive requests. By default, it is a instance of
           Furl::ConnectionCache.

           You may not customize this variable otherwise to use Coro. This attribute requires a duck type
           object. It has two methods, "$obj->steal($host, $port" and "$obj->push($host, $port, $sock)".

       stop_if :CodeRef
           A callback function that is called by Furl after when a blocking function call returns EINTR. Furl
           will abort the HTTP request and return immediately if the callback returns true. Otherwise the
           operation is continued (the default behaviour).

       get_address :CodeRef
           A callback function to override the default address resolution logic. Takes three arguments:
           ($hostname, $port, $timeout_in_seconds) and returns: ($sockaddr, $errReason).  If the returned
           $sockaddr is undef, then the resolution is considered as a failure and $errReason is propagated to
           the caller.

       inet_aton :CodeRef
           Deprecated.  New applications should use get_address instead.

           A callback function to customize name resolution. Takes two arguments: ($hostname,
           $timeout_in_seconds). If omitted, Furl calls Socket::inet_aton.

       ssl_opts :HashRef
           SSL configuration used on https requests, passed directly to "IO::Socket::SSL->new()",

           for example:

               use IO::Socket::SSL;

               my $ua = Furl::HTTP->new(
                   ssl_opts => {
                       SSL_verify_mode => SSL_VERIFY_PEER(),
                   },
               });

           See IO::Socket::SSL for details.

   Instance Methods
       "$furl->request(%args) :($protocol_minor_version, $code, $msg, \@headers, $body)"

       Sends an HTTP request to a specified URL and returns a protocol minor version, status code, status
       message, response headers, response body respectively.

       %args might be:

       scheme :Str = "http"
           Protocol scheme. May be "http" or "https".

       host :Str
           Server host to connect.

           You must specify at least "host" or "url".

       port :Int = 80
           Server port to connect. The default is 80 on "scheme => 'http'", or 443 on "scheme => 'https'".

       path_query :Str = "/"
           Path and query to request.

       url :Str
           URL to request.

           You can use "url" instead of "scheme", "host", "port" and "path_query".

       headers :ArrayRef
           HTTP request headers. e.g. "headers => [ 'Accept-Encoding' => 'gzip' ]".

       content : Str | ArrayRef[Str] | HashRef[Str] | FileHandle
           Content to request.

       write_file : FileHandle
           If this parameter is set, the response content will be saved here instead of in the response object.

           It's like a ":content_file" in LWP::UserAgent.

       write_code : CodeRef
           If a callback is provided with the "write_code" option then this function will be called for each
           chunk of the response content as it is received from the server.

           It's like a ":content_cb" in LWP::UserAgent.

       The "request()" method assumes the first argument to be an instance of "HTTP::Request" if the arguments
       are an odd number:

           my $req = HTTP::Request->new(...);
           my @res = $furl->request($req); # allowed

       You must encode all the queries or this method will die, saying "Wide character in ...".

       "$furl->get($url :Str, $headers :ArrayRef[Str] )"

       This is an easy-to-use alias to "request()", sending the "GET" method.

       "$furl->head($url :Str, $headers :ArrayRef[Str] )"

       This is an easy-to-use alias to "request()", sending the "HEAD" method.

       "$furl->post($url :Str, $headers :ArrayRef[Str], $content :Any)"

       This is an easy-to-use alias to "request()", sending the "POST" method.

       "$furl->put($url :Str, $headers :ArrayRef[Str], $content :Any)"

       This is an easy-to-use alias to "request()", sending the "PUT" method.

       "$furl->delete($url :Str, $headers :ArrayRef[Str] )"

       This is an easy-to-use alias to "request()", sending the "DELETE" method.

FAQ

       Why IO::Socket::SSL?
           Net::SSL is not well documented.

       Why is env_proxy optional?
           Environment variables are highly dependent on each users' environment, and we think it may confuse
           users when something doesn't go right.

       What operating systems are supported?
           Linux 2.6 or higher, OSX Tiger or higher, Windows XP or higher.

           And other operating systems will be supported if you send a patch.

       Why doesn't Furl support chunked upload?
           There are reasons why chunked POST/PUTs should not be used in general.

           First, you cannot send chunked requests unless the peer server at the other end of the established
           TCP connection is known to be a HTTP/1.1 server.

           Second, HTTP/1.1 servers disconnect their persistent connection quite quickly (compared to the time
           they wait for the first request), so it is not a good idea to post non-idempotent requests (e.g.
           POST, PUT, etc.) as a succeeding request over persistent connections.

           These facts together makes using chunked requests virtually impossible (unless you _know_ that the
           server supports HTTP/1.1), and this is why we decided that supporting the feature is NOT of high
           priority.

       How do you build the response content as it arrives?
           You can use IO::Callback for this purpose.

               my $fh = IO::Callback->new(
                   '<',
                   sub {
                       my $x = shift @data;
                       $x ? "-$x" : undef;
                   }
               );
               my ( $code, $msg, $headers, $content ) =
                 $furl->put( "http://127.0.0.1:$port/", [ 'Content-Length' => $len ], $fh,
                 );

       How do you use gzip/deflate compressed communication?
           Add an Accept-Encoding header to your request. Furl inflates response bodies transparently according
           to the Content-Encoding response header.

       How do you use multipart/form-data?
           You can use multipart/form-data with HTTP::Request::Common.

               use HTTP::Request::Common;

               my $furl = Furl->new();
               $req = POST 'http://www.perl.org/survey.cgi',
                 Content_Type => 'form-data',
                 Content      => [
                   name   => 'Hiromu Tokunaga',
                   email  => 'tokuhirom@example.com',
                   gender => 'F',
                   born   => '1978',
                   init   => ["$ENV{HOME}/.profile"],
                 ];
               $furl->request($req);

           Native multipart/form-data support for Furl is available if you can send a patch for me.

       How do you use Keep-Alive and what happens on the HEAD method?
           Furl supports HTTP/1.1, hence "Keep-Alive". However, if you use the HEAD method, the connection is
           closed immediately.

           RFC 2616 section 9.4 says:

               The HEAD method is identical to GET except that the server MUST NOT
               return a message-body in the response.

           Some web applications, however, returns message bodies on the HEAD method, which might confuse
           "Keep-Alive" processes, so Furl closes connection in such cases.

           Anyway, the HEAD method is not so useful nowadays. The GET method and "If-Modified-Since" are more
           suitable to cache HTTP contents.

       Why does Furl take longer than specified until it returns a timeout error?
           Although Furl itself supports timeout, some underlying modules / functions do not. And the most
           noticeable one is Socket::inet_aton, the function used for name resolution (a function that converts
           host names to IP addresses). If you need accurate and short timeout for name resolution, the use of
           Net::DNS::Lite is recommended. The following code snippet describes how to use the module in
           conjunction with Furl.

               use Net::DNS::Lite qw();

               my $furl = Furl->new(
                   timeout   => $my_timeout_in_seconds,
                   inet_aton => sub { Net::DNS::Lite::inet_aton(@_) },
               );

       How can I replace Host header instead of hostname?
           Furl::HTTP does not provide a way to replace the Host header because such a design leads to security
           issues.

           If you want to send HTTP requests to a dedicated server (or a UNIX socket), you should use the
           get_address callback to designate the peer to which Furl should connect as sockaddr.

           The example below sends all requests to 127.0.0.1:8080.

               my $ua = Furl::HTTP->new(
                   get_address => sub {
                       my ($host, $port, $timeout) = @_;
                       pack_sockaddr_in(8080, inet_aton("127.0.0.1"));
                   },
               );

               my ($minor_version, $code, $msg, $headers, $body) = $furl->request(
                   url => 'http://example.com/foo',
                   method => 'GET'
               );

TODO

           - AnyEvent::Furl?
           - ipv6 support
           - better docs for NO_PROXY

OPTIONAL FEATURES

   Internationalized Domain Name (IDN)
       This feature requires Net::IDN::Encode.

   SSL
       This feature requires IO::Socket::SSL.

   Content-Encoding (deflate, gzip)
       This feature requires Compress::Raw::Zlib.

DEVELOPMENT

       To setup your environment:

           $ git clone http://github.com/tokuhirom/Furl.git
           $ cd Furl

       To get picohttpparser:

           $ git submodule init
           $ git submodule update

           $ perl Makefile.PL
           $ make
           $ sudo make install

   HOW TO CONTRIBUTE
       Please send the pull request via <http://github.com/tokuhirom/Furl/>.

SEE ALSO

       LWP

       HTTP specs: <http://www.w3.org/Protocols/HTTP/1.0/spec.html>
       <http://www.w3.org/Protocols/HTTP/1.1/spec.html>

LICENSE

       Copyright (C) Tokuhiro Matsuno.

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