| blib/lib/Net/DirectConnect/http.pm | |||
|---|---|---|---|
| Criterion | Covered | Total | % |
| statement | 18 | 58 | 31.0 |
| branch | 0 | 22 | 0.0 |
| condition | 0 | 24 | 0.0 |
| subroutine | 6 | 10 | 60.0 |
| pod | 0 | 1 | 0.0 |
| total | 24 | 115 | 20.8 |
| line | stmt | bran | cond | sub | pod | time | code |
|---|---|---|---|---|---|---|---|
| 1 | #$Id: http.pm 998 2013-08-14 12:21:20Z pro $ $URL: svn://svn.setun.net/dcppp/trunk/lib/Net/DirectConnect/http.pm $ | ||||||
| 2 | package #hide from cpan | ||||||
| 3 | Net::DirectConnect::http; | ||||||
| 4 | 1 | 1 | 7 | use Data::Dumper; #dev only | |||
| 1 | 2 | ||||||
| 1 | 55 | ||||||
| 5 | #$Data::Dumper::Sortkeys = 1; | ||||||
| 6 | #$Data::Dumper::Sortkeys = $Data::Dumper::Useqq = $Data::Dumper::Indent = 1; | ||||||
| 7 | 1 | 1 | 7 | use Net::DirectConnect; | |||
| 1 | 1 | ||||||
| 1 | 23 | ||||||
| 8 | #use Net::DirectConnect::hubcli; | ||||||
| 9 | 1 | 1 | 6 | use strict; | |||
| 1 | 1 | ||||||
| 1 | 38 | ||||||
| 10 | 1 | 1 | 6 | no warnings qw(uninitialized); | |||
| 1 | 2 | ||||||
| 1 | 47 | ||||||
| 11 | 1 | 1 | 6 | no if $] >= 5.017011, warnings => 'experimental::smartmatch'; | |||
| 1 | 2 | ||||||
| 1 | 7 | ||||||
| 12 | our $VERSION = ( split( ' ', '$Revision: 998 $' ) )[1]; | ||||||
| 13 | #our @ISA = ('Net::DirectConnect'); | ||||||
| 14 | 1 | 1 | 147 | use base 'Net::DirectConnect'; | |||
| 1 | 2 | ||||||
| 1 | 1456 | ||||||
| 15 | |||||||
| 16 | sub init { | ||||||
| 17 | 0 | 0 | 0 | my $self = shift; | |||
| 18 | #$self->log( 'dev', 'httpcli init' ); | ||||||
| 19 | #%$self = ( %$self, | ||||||
| 20 | 0 | local %_ = ( | |||||
| 21 | #'incomingclass' => 'Net:DirectConnect::httpcli', | ||||||
| 22 | 'auto_connect' => 0, | ||||||
| 23 | 'auto_listen' => 0, | ||||||
| 24 | 'protocol' => 'http', | ||||||
| 25 | #); $self->{$_} = $_{$_} for keys %_; | ||||||
| 26 | # local %_ = ( | ||||||
| 27 | #'myport' => 80, | ||||||
| 28 | #'myport' => 443, | ||||||
| 29 | #modules => [], | ||||||
| 30 | #'myport_base' => 8000, | ||||||
| 31 | #'myport_random' => 99, | ||||||
| 32 | #'myport_tries' => 5, | ||||||
| 33 | 'myport_inc' => 1, | ||||||
| 34 | #'HubName' => 'Net::DirectConnect test hub', | ||||||
| 35 | 'allow' => '127.0.0.1', | ||||||
| 36 | 'cmd_bef' => undef, | ||||||
| 37 | 'cmd_aft' => "\n", | ||||||
| 38 | ); | ||||||
| 39 | 0 | 0 | $self->{$_} //= $_{$_} for keys %_; | ||||
| 40 | 0 | local %_ = @_; | |||||
| 41 | #warn "$_=$_{$_}"; | ||||||
| 42 | 0 | $self->{$_} = $_{$_} for keys %_; | |||||
| 43 | #$self->{$_} ||= $self->{'parent'}{$_} ||= {} for qw(peers peers_sid peers_cid want share_full share_tth); | ||||||
| 44 | 0 | 0 | $self->{$_} ||= $self->{'parent'}{$_} for qw(http_download http_control http_allow); #allow | ||||
| 45 | #$self->baseinit(); | ||||||
| 46 | #$self->{'parse'} ||= $self->{'parent'}{'parse'}; | ||||||
| 47 | #$self->{'cmd'} ||= $self->{'parent'}{'cmd'}; | ||||||
| 48 | 0 | 0 | $self->{'allow'} = $self->{http_allow} if defined $self->{http_allow}; | ||||
| 49 | $self->{'handler_int'}{'unknown'} ||= sub { | ||||||
| 50 | 0 | 0 | 0 | my $self = shift if ref $_[0]; | |||
| 51 | #$self->log( 'dev', "unknown1", Dumper \@_ ); | ||||||
| 52 | 0 | ( $self->{http_headers}{ $_[0] } = $_[1] ) =~ s/^: |\s+$//g; | |||||
| 53 | #}; | ||||||
| 54 | 0 | 0 | }; | ||||
| 55 | #$self->{'handler'}{ 'unknown'}||=sub { | ||||||
| 56 | #my $self = shift if ref $_[0]; | ||||||
| 57 | #$self->log( 'dev', "unknown2", @_ ); | ||||||
| 58 | #}; | ||||||
| 59 | #}; | ||||||
| 60 | #'GET' => sub { | ||||||
| 61 | $self->{'parse'} ||= { | ||||||
| 62 | 'DELLLLLLLnoGET' => sub { | ||||||
| 63 | 0 | 0 | 0 | my $self = shift if ref $_[0]; | |||
| 64 | 0 | my ( $url, $prot ) = split /\s/, $_[0]; | |||||
| 65 | 0 | $self->log( 'dev', "get $url : $prot" ); | |||||
| 66 | 0 | $self->{'http_geturl'} = $url; | |||||
| 67 | }, | ||||||
| 68 | "\x0D" => sub { #$self->log('dev', 'can send'); }, | ||||||
| 69 | #'' => sub { | ||||||
| 70 | 0 | 0 | 0 | my $self = shift if ref $_[0]; | |||
| 71 | #$self->log( 'dev', 'can send2', Dumper $self->{'handler_int'}, $self->{http_headers} ); | ||||||
| 72 | 0 | ( $self->{'http_geturl'} ) = split ' ', $self->{http_headers}{GET}; | |||||
| 73 | 0 | ( $self->{'http_getfile'} ) = $self->{'http_geturl'} =~ m{^/(.+)}; | |||||
| 74 | 0 | my $c = "HTTP/1.1 200 OK" . "\nContent-Type: text/html; charset=utf-8\n\n"; | |||||
| 75 | 0 | 0 | 0 | if ( $self->{'http_control'} and $self->{'http_geturl'} eq '/' ) { | |||
| 0 | 0 | ||||||
| 0 | 0 | ||||||
| 76 | 0 | 0 | $c .= "" . "clients: " . ( |
||||
| 77 | join ', ', | ||||||
| 78 | map { | ||||||
| 79 | 0 | "$_($self->{clients}{$_}{status}" | |||||
| 80 | . ( | ||||||
| 81 | !$self->{clients}{$_}{'filebytes'} ? () : ":$self->{clients}{$_}{'filebytes'}/$self->{clients}{$_}{'filetotal'}" ) | ||||||
| 82 | . ")" | ||||||
| 83 | 0 | } sort keys %{ $self->{clients} } | |||||
| 84 | ) | ||||||
| 85 | . " peers: " |
||||||
| 86 | . ( | ||||||
| 87 | join ' ', |
||||||
| 88 | map { | ||||||
| 89 | 0 | join ' ', $_->{INF}{NI}, $_->{INF}{SS}, $_->{INF}{I4}, | |||||
| 90 | } sort { | ||||||
| 91 | 0 | $b->{INF}{SS} <=> $a->{INF}{SS} | |||||
| 92 | 0 | } values %{ $self->{peers_cid} } | |||||
| 93 | ) | ||||||
| 94 | . "" #.Dumper($self->{peers}) |
||||||
| 95 | #. "" . Dumper($self) |
||||||
| 96 | . ""; | ||||||
| 97 | } elsif ( $self->{'http_download'} and my $full = $self->{"share_full"}{ $self->{'http_getfile'} } ) { | ||||||
| 98 | 0 | my ($name) = $full =~ m{([^/]+)$}; | |||||
| 99 | 0 | my $size = -s $full; | |||||
| 100 | 0 | my $sizep = $size + 1; | |||||
| 101 | 0 | my ( $from, $to ) = $self->{http_headers}{Range} =~ /^bytes=(\d+)\-(\d*)/; | |||||
| 102 | 0 | 0 | 0 | $to ||= $size if $from; | |||
| 103 | 0 | 0 | my $type = { xml => 'text/xml' }->{ lc +( $name =~ m/\.(\w+)/ )[0] } || 'binary/octet-stream'; | ||||
| 104 | 0 | 0 | $c = | ||||
| 0 | |||||||
| 105 | "HTTP/1.1 " | ||||||
| 106 | . ( $from ? "206 Partial Content" : "200 OK" ) | ||||||
| 107 | . "\nContent-Type: $type" | ||||||
| 108 | . "\nContent-Length: $size" | ||||||
| 109 | . "\nAccept-Ranges: bytes\n" | ||||||
| 110 | . ( !$from ? () : "Content-Range: bytes $from-$to/$sizep\n" ) | ||||||
| 111 | . "Content-Disposition: attachment; filename=$name\n\n"; | ||||||
| 112 | #$self->log( 'dev', "hdr[$c]" ); | ||||||
| 113 | 0 | $self->send( Encode::encode 'utf8', $c, Encode::FB_WARN ); | |||||
| 114 | 0 | $self->file_send( $self->{"share_full"}{ $self->{'http_getfile'} }, $from, $to ); | |||||
| 115 | 0 | return; | |||||
| 116 | #$c .= "gettii[$self->{'http_getfile'}]"; | ||||||
| 117 | } elsif ( $self->{'http_control'} and $self->{'http_geturl'} =~ m{^/dl/(.+)$} ) { | ||||||
| 118 | 0 | $self->{parent}{parent}->download($1); | |||||
| 119 | 0 | $c .= "try dl [$1]"; | |||||
| 120 | } | ||||||
| 121 | #$c .= "" . Dumper( $self->{http_headers} ); |
||||||
| 122 | 0 | $self->send( Encode::encode 'utf8', $c, Encode::FB_WARN ); | |||||
| 123 | 0 | $self->destroy(); | |||||
| 124 | }, | ||||||
| 125 | 0 | 0 | }; | ||||
| 126 | #$self->{'parser'} = sub { my $self = shift;$self->log('dev', 'myparser', Dumper @_); }; | ||||||
| 127 | #$self->log( 'dev', 'httpcli inited' ); | ||||||
| 128 | } | ||||||
| 129 | 1; |