Furl::HTTP - Low level interface to Furl
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 => '/' ); # or # Accept-Encoding is supported but optional $furl = Furl->new( headers => [ 'Accept-Encoding' => 'gzip' ], ); my $body = $furl->get('http://example.com/some/compressed');
Furl is yet another HTTP client library. LWP is the de facto standard HTTP client for Perl5, but it is too slow for some critical jobs, and too complex for weekend hacking. Furl resolves these issues. Enjoy it!
This library is an alpha software. Any API may change without notice.
Furl::HTTP->new(%args | \%args) :Furl
Creates and returns a new Furl client with %args. Dies on errors.
%args might be:
This option choose return value format of $furl->request.
$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.
$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.
Protocol scheme. May be http or https.
http
https
Server host to connect.
You must specify at least host or url.
host
url
Server port to connect. The default is 80 on scheme => 'http', or 443 on scheme => 'https'.
scheme => 'http'
scheme => 'https'
Path and query to request.
URL to request.
You can use url instead of scheme, host, port and path_query.
scheme
port
path_query
HTTP request headers. e.g. headers => [ 'Accept-Encoding' => 'gzip' ].
headers => [ 'Accept-Encoding' => 'gzip' ]
Content to request.
You must encode all the queries or this method will die, saying Wide character in ....
Wide character in ...
$furl->get($url :Str, $headers :ArrayRef[Str] )
This is an easy-to-use alias to request(), sending the GET method.
request()
GET
$furl->head($url :Str, $headers :ArrayRef[Str] )
This is an easy-to-use alias to request(), sending the HEAD method.
HEAD
$furl->post($url :Str, $headers :ArrayRef[Str], $content :Any)
This is an easy-to-use alias to request(), sending the POST method.
POST
$furl->put($url :Str, $headers :ArrayRef[Str], $content :Any)
This is an easy-to-use alias to request(), sending the PUT method.
PUT
$furl->delete($url :Str, $headers :ArrayRef[Str] )
This is an easy-to-use alias to request(), sending the DELETE method.
DELETE
$furl->request_with_http_request($req :HTTP::Request)
This is an easy-to-use alias to request() with an instance of HTTP::Request.
HTTP::Request
Net::SSL is not well documented.
Environment variables are highly dependent on each users' environment, and we think it may confuse users when something doesn't go right.
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.
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.
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, );
Add an Accept-Encoding header to your request. Furl inflates response bodies transparently according to the Content-Encoding response header.
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_with_http_request($req);
Native multipart/form-data support for Furl is available if you can send a patch for me.
Furl supports HTTP/1.1, hence Keep-Alive. However, if you use the HEAD method, the connection is closed immediately.
Keep-Alive
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-Sinse are more suitable to cache HTTP contents.
If-Modified-Sinse
- AnyEvent::Furl? - ipv6 support - better docs for NO_PROXY
This feature requires Net::IDN::Encode.
This feature requires IO::Socket::SSL.
This feature requires Compress::Raw::Zlib.
To setup your environment:
$ git clone http://github.com/tokuhirom/p5-Furl.git $ cd p5-Furl
To get picohttpparser:
$ git submodule init $ git submodule update $ perl Makefile.PL $ make $ sudo make install
Please send the pull-req via http://github.com/tokuhirom/p5-Furl/.
LWP
HTTP specs: http://www.w3.org/Protocols/HTTP/1.0/spec.html http://www.w3.org/Protocols/HTTP/1.1/spec.html
Copyright (C) Tokuhiro Matsuno.
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
To install Furl, copy and paste the appropriate command in to your terminal.
cpanm
cpanm Furl
CPAN shell
perl -MCPAN -e shell install Furl
For more information on module installation, please visit the detailed CPAN module installation guide.