#!/bin/akanga -p
#


fn debug {
	if (~ $debug yes)
		echo $* >[1=2]
	
	return 0
	}


#
# printheader <name>
#
#	Print a header from the HTTP response.
#
fn printheader {
	env | awk '
			BEGIN {
				IGNORECASE = 1;
				header = tolower("http." ARGV[1] ":="); ARGV[1] = "";
				hlen = length(header);
				}

			tolower(substr($0, 1, hlen)) == header {
				print substr($0, hlen+1);
				exit 0;
				}' $1
	return 0
	}
	
#
# putline
#
fn putline {
	if (! ~ $#* 0  &&  ! ~ $1 '')
		debug '>>>' $*

	echo $*
	return 0
	}

#
# getline
#
fn getline {
	read header data  ||  return 1
	if (~ $header '')
		return 1

	debug '<<<' $header $data
	http. ^ $header = $data
	return 0
	}

#
# get <uri>
#
fn get {
	putline GET $1 HTTP/1.0
	putline ''

	read proto rc message  ||  return 1
	debug '<<<' $proto $rc $message

	if (! ~ $proto HTTP/1.[0-9] http/1.[0-9]) {
		echo $0: protocol error: $proto >[1=2]
		exit 1
		}

	while (getline) {
		}

	if (! ~ $opt_printserver '') {
		printheader server >$stdout
		exit 0
	} else if (! ~ $rc 200) {
		echo $0: server error: $rc $message >[1=2]
		exit 1
	} else if (! ~ $opt_header '') {
		printheader $opt_header >$stdout
		exit 0
		}

	read - >$stdout
	return 0
	}


#
# httpclient <server> [<uri>]
#
#	Connect to the HTTP server <server> and fetch the item <uri>.
#

initvars '' debug opt_header opt_printserver
parseopt '*' dh:sv $*  ||  exit 1

while (~ $1 -*) {
	switch ($1) {
	case -d -v
		debug = yes
		shift

	case -h
		opt_header = $2
		shift 2

	case -s
		opt_printserver = yes
		shift

	case - --
		shift
		break

	case *
		echo $0: unkown option: $1 >[1=2]
		exit 1
		}
	}


if (~ $#* 0) {
	echo usage: $0 '<server> [<uri>]' >[1=2]
	exit 1
	}

server = $1; shift
~ $server *:*  ||  server = $server ^ :80

if (~ $#* 0) {
	uri = /
} else {
	uri = $1
	shift
	}


connect -wp $server /bin/rc -c '
	stdout = /proc/self/fd/$CONNECT_STDOUT
	get $1
	exit $status
	' $uri  ||  exit 1

exit $status

