Ubic
view release on metacpan - search on metacpan
view release on metacpan or search on metacpan
lib/Ubic/UA.pm view on Meta::CPAN
package Ubic::UA;
$Ubic::UA::VERSION = '1.60';
# ABSTRACT: tiny http client
use strict;
use warnings;
use IO::Socket;
sub new {
my $class = shift;
my %arg = @_;
my $self = {};
$self->{timeout} = $arg{timeout} || 10;
return bless $self => $class;
}
sub get {
my $self = shift;
my ($url) = @_;
unless ($url) {
return { error => 'Url not specified' };
}
my ($scheme, $authority, $path, $query, undef) = $url
=~ m|(?:([^:/?#]+):)?(?://([^/?#]*))?([^?#]*)(?:\?([^#]*))?(?:#(.*))?|;
my $socket = IO::Socket::INET->new(
PeerAddr => $authority,
Proto => 'tcp',
Timeout => $self->{timeout}
) or return {error => $@};
$socket->autoflush(1);
$path .= '?' . $query if $query;
print $socket "GET $path HTTP/1.0\r\n\r\n";
my @arr = <$socket>;
close $socket;
my $status_line = shift @arr;
my @headers;
while (my $line = shift @arr) {
last if $line eq "\r\n";
$line =~ s/\r\n//;
push @headers, $line;
}
if ($status_line =~ /^HTTP\/([0-9\.]+)\s+([0-9]{3})\s+(?=([^\r\n]*))?/i) {
my ($ver, $code, $status) = ($1, $2, $3);
return {
ver => $ver,
code => $code,
status => $status,
body => join('', @arr),
headers => \@headers,
};
}
else {
return { error => 'Invalid http response' };
}
}
1;
__END__
=pod
=encoding UTF-8
=head1 NAME
Ubic::UA - tiny http client
view all matches for this distributionview release on metacpan - search on metacpan
( run in 0.580 second using v1.00-cache-2.02-grep-82fe00e-cpan-2c419f77a38b )