X-Git-Url: https://git.camperquake.de/gitweb.cgi?a=blobdiff_plain;f=videosite%2FBase.pm;h=001ec56a55081a60dc4e6e1e9d8b2562f297f3bb;hb=8f82d425fa17990e24c78232e69b20f07e386ef5;hp=f0fa43945d03e5a1e11a149e16d634a2f349cb66;hpb=4faf1e5fcb46955cea9eaa04e4370c8bff767a84;p=videosite.git diff --git a/videosite/Base.pm b/videosite/Base.pm index f0fa439..001ec56 100644 --- a/videosite/Base.pm +++ b/videosite/Base.pm @@ -1,15 +1,22 @@ # (c) 2007 by Ralf Ertzinger # licensed under GNU GPL v2 -package Base; +package videosite::Base; use strict; +use LWP::UserAgent; +use HTTP::Cookies; use Data::Dumper; sub new { my $class = shift; - my $self = {'_DEBUG' => 0, '_OUT' => sub {print shift}}; - + my $self = {'_DEBUG' => 0, + '_OUT' => sub {printf(@_)}, + '_CONNECTORS' => sub { return ({ 'name' => 'direct', + 'schemas' => {} }) }, + '_CONNECTOR' => undef, + }; + bless($self, $class); $self->_prepare_parameters(); @@ -19,11 +26,11 @@ sub new { sub error { my $self = shift; - my $t; + my @data = @_; - $t = sprintf(shift(@_), @_); - $t =~ s/%/%%/g; - $self->{'_OUT'}($t); + $data[0] = "(" . ref($self) . ") " . $data[0]; + + $self->{'_OUT'}(@data); } sub debug { @@ -170,4 +177,80 @@ sub setdebug { $self->{'_DEBUG'} = shift; } +sub ua { + my $self = shift; + my $ua; + + $ua = LWP::UserAgent->new('agent' => 'Mozilla/5.0', 'cookie_jar' => HTTP::Cookies->new); + + # Remove a currently defined HTTPS proxy. See below for a longer explanation. + delete($ENV{'HTTPS_PROXY'}); + + if (defined($self->{'_CONNECTOR'})) { + my $schemas = $self->{'_CONNECTOR'}->{'schemas'}; + foreach (keys(%{$schemas})) { + $self->debug("Adding schema %s with proxy %s", $_, $schemas->{$_}); + if ($_ eq 'https') { + # OK, so here's the gist. + # + # The usual way of reqesting an HTTPS URL through a proxy is + # to connect to the proxy server, issue a CONNECT request to + # create a channel to the web server and start an SSL session over + # this channel, so there is an end-to-end connection between + # the client and the server. + # + # Setting a proxy for the https schema in LWP WILL NOT ACCOMPLISH + # THIS. + # + # LWP will connect to the proxy server, and issue a standard GET + # request for the target URL, which most proxy servers will refuse + # to get. + # + # The way to use a proxy server is to set some environment variables + # and let the underlying Crypt::SSLeay module do the rest. + # + # This is positively appaling. + $ENV{'HTTPS_PROXY'} = $schemas->{$_}; + } else { + $ua->proxy($_, $schemas->{$_}); + } + } + } + + return $ua; +} + +sub decode_hexurl { + my $self = shift; + my $d = shift; + + $d =~ s/%([[:xdigit:]]{2})/chr(hex($1))/ge; + + return $d; +} + +sub decode_querystring { + my $self = shift; + + return { map { split /=/, $_, 2; } split /&/, shift }; +} + +sub connectors { + my $self = shift; + + return $self->{'_CONNECTORS'}->(); +} + +sub selectconn { + my $self = shift; + + $self->{'_CONNECTOR'} = shift; +} + +sub setconn { + my $self = shift; + + $self->{'_CONNECTORS'} = shift; +} + 1;