package miniwget; use strict; use warnings; use IO::Socket; my $send_header=<<'EOH'; GET %s HTTP/1.1 Accept: text/html,*/* Accept-Language: de-DE,de,de-de,en-us,en Accept-Encoding: deflate User-Agent: Mozilla/5.0 (X11; U; Linux; cl-CL; rv:42) Gecko/2229082006 Fake/42 (Clingon) Host: %s Connection: Close EOH # get an website # accepts url like http://test.com/a/smal/path?option=txt... # $site=wget_mini->new([$url]) sub new { my $class=shift; my $url=shift; my $self= bless({},$class); $self->load($url) if($url); return $self; } # request success sub success { my $stat=shift()->{status}; return $stat >= 200 && $stat < 300; } # get the header hash sub header { return shift()->{header}; } # get the body sub body { return shift->{body}; } # get messages sub message { return shift->{message}; } # get statusnumber sub status { return shift->{status}; } # get/set host sub host { my $self=shift; my $host=shift; if($host) { my $old=$self->{host}; $self->{host}=$host; return $old; } else { return $self->{host}; } } # get/set port sub port { my $self=shift; my $port=shift || 0; if($port >0 ) { my $old=$self->{port}; $self->{port}=$port; return $old; } else { return $self->{port}; } } #get/set path sub path { my $self=shift; my $path=shift; if($path) { my $old=$self->{path}; $self->{path}=$path; return $old; } else { return $self->{path}; } } # load site # $ok=$site->load([$url]); sub load { my $self=shift; my $url=shift; $self->{header}={}; $self->{body}=''; $self->{message}=''; $self->{status}=-1; if($url && !$self->parse($url)) { $self->{message}='no url'; $self->{status}='000'; return 0; } if(!$self->{host}) { $self->{message}='no host'; $self->{status}='001'; return 0; } $self->{port}=80 unless($self->{port}); $self->{path}='/' unless($self->{path}); my $socket=IO::Socket::INET->new(PeerAddr => $self->{host}, PeerPort => $self->{port} ); if(!$socket) { $self->{message}='no connectinon to host'; $self->{status}='002'; return 0; } binmode($socket); # create header my $header=sprintf($send_header,$self->{path},$self->{host}); # cleanup header $header=~s/[\x0D\x0A]+/\x0D\x0A/gs; $header.="\x0D\x0A"; # send header: print $socket $header; # read header { local $/="\x0A"; while (my $line = <$socket>) { $line=~s/[\x0D\x0A]+//; last unless ($line); $self->{header}->{lc($1)}=$2 if($line=~m!^\s*([\w-]+)\s*:\s*(.+?)[\x0D\x0A]*$!); if($line=~m!\s*HTTP/[\d.]+\s+(\d+)\s+(.+?)[\x0D\x0A]*$!) { $self->{status}=$1; $self->{message}=$2; } } } # read body if($self->{header}->{'content-length'}) { my $length=$self->{header}->{'content-length'}; $socket->read($self->{body},$length) if($length>0); } else { # read all you get while(!$socket->eof()) { $self->{body}.=$socket->getc(); } } return 1; } # parse url # $ok=$site->parse($url); sub parse { my $self=shift; my $url=shift || ''; if($url=~m"^http://((?:[-\w]+\.)+\w{1,3})((?::\d{1,5})?)(.*)$") { $self->{host}=$1; $self->{port}=$2 || 80; $self->{path}=$3 || '/'; $self->{port}=~s/^://; return 1; } return 0; } 1;