HTTP-Promise
view release on metacpan or search on metacpan
lib/HTTP/Promise.pm view on Meta::CPAN
use HTTP::Promise::Status qw( :all );
# use Nice::Try;
use Promise::Me;
use Scalar::Util ();
use URI;
use URI::Escape::XS ();
# < 0 so we recognise those as system errors
use constant {
ERROR_EINTR => ( abs( Errno::EINTR ) * -1 ),
TYPE_URL_ENCODED => 'application/x-www-form-urlencoded',
};
our @EXPORT = qw( async await );
our @EXPORT_OK = qw( fetch );
# "\r\n" is not portable
our $CRLF = "\015\012";
our $DEFAULT_PROTOCOL = 'HTTP/1.1';
our $EXCEPTION_CLASS = 'HTTP::Promise::Exception';
our $HTTP_TOKEN = qr/[^\x00-\x31\x7F]+/;
our $HTTP_QUOTED_STRING = qr/"([^"]+|\\.)*"/;
# 10K
our $BUFFER_SIZE = 10240000;
our $MAX_HEADERS_SIZE = 8192;
# 256Kb
our $MAX_BODY_IN_MEMORY_SIZE = 102400;
# 1Mb
our $EXPECT_THRESHOLD = 1024000000;
our $EXTENSION_VARY = 1;
our $DEFAULT_MIME_TYPE = 'application/octet-stream';
our $SERIALISER = $Promise::Me::SERIALISER;
our $VERSION = 'v0.7.4';
};
use strict;
use warnings;
sub init
{
my $self = shift( @_ );
$self->{accept_language} = [];
$self->{accept_encoding} = 'auto';
$self->{agent} = qq{HTTP-Promise/$VERSION (perl; +https://metacpan.org/pod/HTTP::Promise)};
$self->{auto_switch_https} = 1;
$self->{buffer_size} = $BUFFER_SIZE;
$self->{cookie_jar} = Cookie::Jar->new;
$self->{default_headers} = undef;
$self->{default_protocol} = ( $DEFAULT_PROTOCOL || 'HTTP/1.1' );
# DNT -> Do not track header field
$self->{dnt} = undef;
$self->{expect_threshold} = $EXPECT_THRESHOLD;
$self->{ext_vary} = $EXTENSION_VARY;
$self->{from} = undef;
$self->{inactivity_timeout} = 600;
$self->{local_host} = undef;
$self->{local_port} = undef;
$self->{max_body_in_memory_size} = $MAX_BODY_IN_MEMORY_SIZE;
$self->{max_headers_size} = $MAX_HEADERS_SIZE;
$self->{max_redirect} = 7;
$self->{max_size} = undef;
$self->{medium} = $Promise::Me::SHARE_MEDIUM;
$self->{no_proxy} = [];
$self->{proxy} = $ENV{http_proxy} || $ENV{HTTP_PROXY} || undef;
$self->{proxy_authorization} = undef;
$self->{requests_redirectable} = [qw( GET HEAD )];
$self->{send_te} = 1;
$self->{serialiser} = $SERIALISER;
$self->{shared_mem_size} = $Promise::Me::RESULT_MEMORY_SIZE;
$self->{ssl_opts} = undef;
$self->{stop_if} = sub{};
$self->{threshold} = $CONTENT_SIZE_THRESHOLD;
# 3 minutes
$self->{timeout} = 180;
$self->{use_content_file} = 0;
$self->{use_promise} = 1;
$self->{_init_strict_use_sub} = 1;
$self->{_exception_class} = $EXCEPTION_CLASS;
$self->SUPER::init( @_ ) || return( $self->pass_error );
my $headers = $self->default_headers;
if( $headers )
{
unless( $self->connection_header )
{
my $connection_header = 'keep-alive';
if( $headers->exists( 'connection' ) )
{
$connection_header = $headers->get( 'connection' );
}
$self->{connection_header} = $connection_header;
}
}
else
{
$self->default_headers( HTTP::Promise::Headers->new ) ||
return( $self->pass_error( HTTP::Promise::Headers->error ) );
}
$self->{_pool} = HTTP::Promise::Pool->new;
return( $self );
}
sub accept_language { return( shift->_set_get_array_as_object( 'accept_language', @_ ) ); }
sub accept_encoding { return( shift->_set_get_scalar_as_object( 'accept_encoding', @_ ) ); }
# NOTE: request parameter
sub agent { return( shift->_set_get_scalar_as_object( 'agent', @_ ) ); }
sub auto_switch_https { return( shift->_set_get_boolean( 'auto_switch_https', @_ ) ); }
sub buffer_size { return( shift->_set_get_number( 'buffer_size', @_ ) ); }
sub clone
{
my $self = shift( @_ );
my $new = $self->SUPER::clone;
if( $self->{default_headers} )
{
$new->{default_headers} = $self->{default_headers}->clone;
}
$new->{_pool} = HTTP::Promise::Pool->new;
return( $new );
}
( run in 0.638 second using v1.01-cache-2.11-cpan-71847e10f99 )