Re: [patch] http/1.1 + https

2001-08-27 Thread Gisle Aas

Gisle Aas <[EMAIL PROTECTED]> writes:

> > +package LWP::Protocol::https11;
> > +
> > +use vars qw(@ISA);
> > +
> > +require LWP::Protocol::http11;
> > +require LWP::Protocol::https;
> > +
> > +@ISA = qw(LWP::Protocol::http11);
> > +my $SSL_CLASS = $LWP::Protocol::https::SSL_CLASS;
> > +
> > +#used to avoid calling IO::Socket::INET::configure twice
> > +sub LWP::Protocol::https11::Noop::configure {$_[0]};
> > +
> > +#we need this to setup a proper @ISA tree
> > +{
> > +package LWP::Protocol::MyHTTPS;
> > +use vars qw(@ISA);
> > +@ISA = ($SSL_CLASS, 'LWP::Protocol::MyHTTP');
> > +
> > +#we need to call both Net::SSL::configure and Net::HTTP::configure
> > +#however both call SUPER::configure (which is IO::Socket::INET)
> > +#to avoid calling that twice we trick Net::HTTP into calling
> > +#Noop::configure
> > +
> > +sub configure {
> > +my $self = shift;
> > +local @Net::HTTP::ISA = qw(LWP::Protocol::https11::Noop);
> 
> This blows away the perl method cache each time we connect to an https
> server.  There must be a better way?

I'm thinking of changing Net::HTTP::configure into calling
$self->_http_socket_configure() instead of $self->SUPER::configure()
directly.  The default _http_socket_configure then just calls
SUPER::configure, i.e:

sub Net::HTTP::_http_socket_configure {
 my $self = shift;
 $self->SUPER::configure(@_);
}

This allow LWP::Protocol::MyHTTPS to simply override this method to be
a noop.  How does that sound to you?

Any better ideas for this?

> 
> > +for my $class (@ISA) {
> > +my $cfg = $class->can('configure');
> > +$cfg->($self, @_);
> > +}
> > +$self;
> > +}
> > +}



Re: [patch] http/1.1 + https

2001-08-27 Thread Gisle Aas

Doug MacEachern <[EMAIL PROTECTED]> writes:

> started using the new http/1.1 support for testing apache-2.0 (in the
> httpd-test project).  things are working great except https is not 
> supported with http/1.1.  it works with the patch below but requires the
> following code:
> 
> require LWP::Protocol::https11;
> LWP::Protocol::implementor('https', 'LWP::Protocol::https11');

Very cool.  Some comments below...

> would be great if 5.54 supports http/1.1 + https.
> 
> --- ./lib/LWP/Protocol/http11.pm~ Sun Aug 26 14:44:04 2001
> +++ ./lib/LWP/Protocol/http11.pm  Sun Aug 26 18:21:43 2001
> @@ -340,7 +342,7 @@
>  
>  my $complete;
>  $response = $self->collect($arg, $response, sub {
> - my $buf;
> + my $buf = ""; #prevent use of uninitialized value
>   my $n;
>READ:
>   {

Where did this 'use of uninitialized value' happen??

> --- ./lib/Net/HTTP.pm~Thu Aug  2 16:30:44 2001
> +++ ./lib/Net/HTTP.pm Sun Aug 26 18:21:49 2001
> @@ -194,7 +194,7 @@
>  }
>  
>  sub xread {
> -sysread($_[0], $_[1], $_[2], $_[3] || 0);
> +$_[0]->sysread($_[1], $_[2], $_[3] || 0);
>  }

I think I'll switch lib/Net/HTTP.pm info calling the sysread instead
of xread directly.  This is just too much indirection :-(

> --- /dev/null Thu Aug 24 02:00:32 2000
> +++ lib/LWP/Protocol/https11.pm   Sun Aug 26 18:16:15 2001
> @@ -0,0 +1,57 @@
> +#
> +# $Id: https.pm,v 1.8 1999/09/20 12:48:37 gisle Exp $
> +
> +use strict;
> +
> +package LWP::Protocol::https11;
> +
> +use vars qw(@ISA);
> +
> +require LWP::Protocol::http11;
> +require LWP::Protocol::https;
> +
> +@ISA = qw(LWP::Protocol::http11);
> +my $SSL_CLASS = $LWP::Protocol::https::SSL_CLASS;
> +
> +#used to avoid calling IO::Socket::INET::configure twice
> +sub LWP::Protocol::https11::Noop::configure {$_[0]};
> +
> +#we need this to setup a proper @ISA tree
> +{
> +package LWP::Protocol::MyHTTPS;
> +use vars qw(@ISA);
> +@ISA = ($SSL_CLASS, 'LWP::Protocol::MyHTTP');
> +
> +#we need to call both Net::SSL::configure and Net::HTTP::configure
> +#however both call SUPER::configure (which is IO::Socket::INET)
> +#to avoid calling that twice we trick Net::HTTP into calling
> +#Noop::configure
> +
> +sub configure {
> +my $self = shift;
> +local @Net::HTTP::ISA = qw(LWP::Protocol::https11::Noop);

This blows away the perl method cache each time we connect to an https
server.  There must be a better way?

> +for my $class (@ISA) {
> +my $cfg = $class->can('configure');
> +$cfg->($self, @_);
> +}
> +$self;
> +}
> +}
> +
> +sub _new_socket
> +{
> +#needs to be blessed into our pseudo class
> +local $LWP::Protocol::MyHTTP::Class = 'LWP::Protocol::MyHTTPS';
> +shift->SUPER::_new_socket(@_);
> +}
> +
> +{
> +#if we inherit from LWP::Protocol::https we inherit from
> +#LWP::Protocol::http, so just setup aliases for these two
> +no strict 'refs';
> +for (qw(_check_sock _get_sock_info)) {
> +*{"$_"} = \&{"LWP::Protocol::https::$_"};
> +}
> +}
> +
> +1;