#!/usr/bin/perl

use IO::Socket;

$url = shift;

($host, $path) = $url =~ /http:\/\/([^\/]+)(\/.*)/;
if ($host =~ /:/){
   ($hostname, $port) = $host =~ /(.*):(\d+)/;
}
else {
   $hostname = $host;
   $port = 80;
}

$socket = new IO::Socket::INET(PeerAddr => $hostname,
                               PeerPort => $port,
                               Proto    => 'tcp',
                               Timeout  => 5);

die "Failed to open connection\n" if (!$socket);

$socket->autoflush(1);

$socket->print("GET $path HTTP/1.0\n\n");

$statusline = $socket->getline();
($http, $code, $message) = $statusline =~ /(HTTP.*) (\d{3}) (.*)/;

if ($code >= 100 && $code <= 199){
   print STDERR "Got informational response $code: $message\n";
}
if ($code >= 200 && $code <= 299){

   ($filename) = $path =~ /([^\/]*)$/;
   open(OUTFILE, "> $filename") || die "Couldn't open $filename\n";

   while ($stuff = $socket->getline()){
      $stuff =~ s/\r\n$//;
      last if ($stuff eq "");
      $stuff = uc($stuff);
      if ($stuff =~ /CONTENT-LENGTH/){
         ($length) = $stuff =~ /CONTENT-LENGTH\s*:\s*(\d+)/;
      }
   }
   $bytes_received = 0;
   while ($bytes_received < $length){
      $data_read = $socket->getline();
      $how_much = length($data_read);
      print OUTFILE $data_read;
      $bytes_received += $how_much;
   }
   close(OUTFILE);
}
if ($code >= 300 && $code <= 399){
   print STDERR "Got redirect response $code: $message\n";
   print STDERR "Redirects not handled yet\n";
}
if ($code >= 400 && $code <= 499){
   print STDERR "Request incomplete $code: $message\n";
}
if ($code >= 500 && $code <= 599){
   print STDERR "Server error $code: $message\n";
}

$socket->close();
