On Tue, May 4, 2010 at 12:33, Ivan Shmakov <i...@main.uusia.org> wrote:
> 1.  The questions
>
>        Do I understand it correctly that the most of the libwww HTTP
>        implementation is tied together by the means of the
>        LWP::Protocol::http module, while LWP::UserAgent just invokes
>        scheme-specific protocol handlers?

That's right.

>        I need for the libwww HTTP client to use two scalar values as
>        the read and write buffers for communication instead of a, say,
>        IO::Socket::INET6 instance.  Do I understand it correctly that
>        in order to do that I will have to:

There are many ways to hook into the protocol machinery.  I tried to
set it up just by creating my own http-handler and ::Socket package
that subclass Net::HTTP::Methods, and then just filled in the missing
methods that I found my test program invoked.  I then ended up with
the attached script.  I hope you find it instructive.

Regards,
Gisle
#!perl -w

use strict;

my $read_buf = "HTTP/1.0 200 OK\n\nHi there\n";
my $write_buf = "";

use LWP::UserAgent;
use LWP::Protocol;
LWP::Protocol::implementor('http', 'MyProtocolHandler');

my $ua = LWP::UserAgent->new;
$ua->get("http://www.example.com";)->dump;

use Data::Dump; dd $write_buf;
exit;

BEGIN {

    package MyProtocolHandler;
    use base qw(LWP::Protocol::http);

    package MyProtocolHandler::Socket;
    use base qw(Net::HTTP::Methods);
    require Symbol;

    sub http_connect {
	return 1;
    }

    sub syswrite {
	my($self, $buf, $len) = @_;
	$write_buf .= substr($buf, 0, $len);
	return $len;
    }

    sub sysread {
	my $self = shift;
	my $len = $_[1];
	$len = length($read_buf) if $len > length($read_buf);
	$_[0] = substr($read_buf, 0, $len, "");
	return $len;
    }

    sub peerhost {
	undef;
    }

    sub increment_response_count {
	my $self = shift;
	return ++${*$self}{'myhttp_response_count'};
    }

    sub ping {
	1;
    }
}

Reply via email to