#!/usr/bin/perl
# Added by Debian package rules script
push @INC, ("/usr/lib/perl5/misterhouse","/usr/share/perl5/misterhouse");
# -*- Perl -*-

use strict;
                                # Point to mh LWP, in case local perl does not have it installed
my ($Pgm_Path, $Pgm_Name);
BEGIN {
    ($Pgm_Path, $Pgm_Name) = $0 =~ /(.*)[\\\/](.*)\.?/;
    ($Pgm_Name) = $0 =~ /([^.]+)/, $Pgm_Path = '.' unless $Pgm_Name;
    eval "use lib '$Pgm_Path/../lib', '$Pgm_Path/../lib/site'"; # So perl2exe works
}

my (%config_parms, %parms);

use Getopt::Long;
#print "get_url: @ARGV\n";
if (!&GetOptions(\%parms, 'h', 'help',
                 'quiet', 'cookies=s', 'cookie_file_in=s', 'cookie_file_out=s', 'post=s', 'header=s',
                 'userid=s', 'password=s') or
    !@ARGV or $parms{h} or $parms{help}) {

    print<<eof;

    $Pgm_Name gets a web page and echos it to STDOUT or a local file.

Usage:

    $Pgm_Name [-quiet] [-cookies 'cookiestr'] [-post 'poststr'] [-header header_file] url [local_file]

    -quiet: no output on stdout

    -cookies 'cookiestr': Uses the specified cookie string for the request.
      The format of 'cookiestr' should be like this: 'name1=val1; name2=val2'.

    -cookie_file_in  'file':  Like the -cookies option, but string is sent via a file.
    -cookie_file_out 'file':  Generates a cookies string from the resulting web request.

    -userid 'userid'    :  Use these 2 parms if your web page is protected by
    -password 'password':  'basic credentials' (i.e. you get a browser popup).

    -post 'poststr': Makes this a post request with the specified name/value pairs
      as the form data, such as: 'name1=val1&name2=val2'

    -header 'header_file': HTTP headers from the server are stored in this file


    If local_file is specified, data is stored there.
    If local_file = /dev/null, data is not returned.
    Otherwise, data is echoed to STDOUT.


eof
    exit;
}

my $url  = shift;
$url = 'http://' . $url unless $url =~ /^(\S+):\/\//;

                                # Get parms from mh.ini
require 'handy_utilities.pl';
&main::read_mh_opts(\%config_parms, $Pgm_Path);

                                # Allow for this ... get_url > $file is better/safer, but
                                # background processes in windows really messes up with > :(
my $file = shift;

$parms{cookies} = &file_read($parms{cookie_file_in}) if $parms{cookie_file_in};


if (($config_parms{get_url} eq 'useragent') or $parms{post} or $parms{header} or
    $parms{cookies} or $parms{cookie_file_out} or $parms{password}) {
    &use_ua;                    # This fails for some people.  Required if using a proxy
}
else {
    &use_get;                   # The simple get does not have a timeout :(
}

sub use_ua {
    use LWP::UserAgent;
#   use HTTP::Request;
#   use HTTP::Response;
#   require LWP::UserAgent;

    my $ua = new LWP::UserAgent;
    $config_parms{proxy} = $ENV{http_proxy}           unless $config_parms{proxy};
    $config_parms{proxy} = $ENV{HTTP_PROXY}           unless $config_parms{proxy}; # Just in case (lc is the standard)
    $ua -> proxy(['http', 'ftp'] => $config_parms{proxy}) if $config_parms{proxy};

    $ua->timeout([120]);         # Time out after 60 seconds
    $ua->env_proxy();
    $ua->agent($config_parms{get_url_ua}) if $config_parms{get_url_ua};

    my $request;
    if ($parms{post}) {
      $request = new HTTP::Request('POST' => $url);
      $request->content_type('application/x-www-form-urlencoded');
      $request->content($parms{post});
    } else {
      $request = new HTTP::Request('GET', $url);
    }

    if ($parms{userid} or $parms{password}) {
#       $ua->credentials("192.168.0.1", "Linksys BEFW11S4", $parms{userid}, $parms{password});
        $request->authorization_basic($parms{userid}, $parms{password});
    }

    if ($parms{cookies}) {
       $request->header('Cookie' => $parms{cookies});
    }
    my $response;

    if ($file) {
        print "Retrieving (with ua) $url into $file ..." unless $parms{quiet};
        if ($file eq '/dev/null') {
            $response = $ua->request($request);
        }
        else {
            $response = $ua->request($request, $file);   # Old UserAgent code
        }
        print " url retrieved.\n" unless $parms{quiet};
        if ($parms{header}) {
           open (OUT, ">$parms{header}") or die "Error, could not open file '$parms{header}' for output: $!\n";
           binmode OUT;
           print OUT $response->headers_as_string();
           close OUT;
        }
        if ($parms{cookie_file_out}) {
            my $cookies;
            for my $header (split /\n/, $response->headers_as_string()) {
                if (my ($name, $value) = $header =~ /^Set-Cookie: ([^=]+)=([^;]+)/) {
                    $cookies .= "$name=$value; ";
                }
            }
            $cookies =~ s/;\s*$//;
            &file_write($parms{cookie_file_out}, $cookies);
        }
        exit;
    }
    else {
        $response = $ua->request($request);
        print $response->content();
    }
    if ($response->is_error()) {
        printf " %s\n", $response->status_line;
    }
}

sub use_get {
    use LWP::Simple;
    if ($file) {
        print "Retrieving (with simple) $url into $file ..." unless $parms{quiet};

        # Do not use simple get ... it will not time out :(
        my $data = get $url;
#       print $data;
        unless ($file eq '/dev/null') {
            if ($data) {
                open (OUT, ">$file") or die "Error, could not open file '$file' for output: $!\n";
                binmode OUT;
                print OUT $data;
                close OUT;
                print " url retrieved\n" unless $parms{quiet};
            }
            else {
                print " get failed\n";
            }
        }
    }
    else {
        print get $url;
    }
}

#
# $Log: get_url,v $
# Revision 1.18  2004/11/22 22:57:17  winter
# *** empty log message ***
#
# Revision 1.17  2004/09/25 19:51:50  winter
# *** empty log message ***
#
# Revision 1.16  2003/03/09 19:34:32  winter
#  - 2.79 release
#
# Revision 1.15  2003/01/12 20:38:53  winter
#  - 2.76 release
#
# Revision 1.14  2002/10/13 02:07:57  winter
#  - 2.72 release
#
# Revision 1.13  2002/08/22 04:33:18  winter
# - 2.70 release
#
# Revision 1.12  2002/03/02 02:36:49  winter
# - 2.65 release
#
# Revision 1.11  2002/01/23 01:50:33  winter
# - 2.64 release
#
# Revision 1.10  2002/01/19 21:11:09  winter
# - 2.63 release
#
# Revision 1.9  2001/02/04 20:31:30  winter
# - 2.43 release
#
# Revision 1.8  2000/12/21 18:54:14  winter
# - 2.38 release
#
# Revision 1.7  2000/11/12 21:01:02  winter
# - 2.34 release
#
# Revision 1.6  2000/01/27 13:23:18  winter
# - update version number
#
# Revision 1.5  1999/07/05 22:30:50  winter
# - check for help request
#
# Revision 1.4  1999/06/20 22:30:41  winter
# *** empty log message ***
#
# Revision 1.3  1999/03/12 04:35:48  winter
# - add proxy.
#
# Revision 1.2  1999/02/26 14:30:27  winter
# - use UserAgent so we can time out
#
# Revision 1.1  1999/02/21 00:29:49  winter
# - created
#
#
