# usage . /bin/httplib.rc # GET|POST|HEAD [-r offset count] [-t content_type (for POST)] [-e referer] [-c cookie'='value] http[s]://uri # for https you'll also need /n/sources/contrib/maht/tlspipeclient.c fn length { echo -n $1 | wc -c | tr -d \x0a\x20 } fn hdr { echo $"* ^ } fn crack_uri { ofs = $ifs ifs = / bits = `{echo -n $1} if(~ $bits(1) https:) { transport = ssl port = 443 } if not { transport = plain port = 80 } ifs = ' ' host = $bits(2) uri = `{echo $1 | sed 's/^'^$bits(1) ^'\/\/' ^$host ^'//'} if(echo $host | grep -s '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+') ip = $host if not { bits = `{echo $host | ndb/dnsquery} ip = $bits(4) } ifs = $ofs } fn plain { ofs = $ifs ifs =' ' clonefile = /net/tcp/clone <[4] $clonefile { netdir=`{basename -d $clonefile} ^ / ^ `{cat /fd/4} if(echo connect $ip!$port > $netdir/ctl) { cat > $netdir/data chunked = 0 header = `{read $netdir/data} while(! ~ $header ) { if(~ $header *chunked*) chunked = 1 echo $header | tr -d >[1=2] header = `{read $netdir/data} } if(~ $chunked 1) { chunksize = `{ read $netdir/data | tr -d | awk ' { printf "ibase=16; 0%s\n", toupper($0) ; } ' | bc} while(test $chunksize -gt 0) { dd -if $netdir/data -bs $chunksize -count 1 -quiet 1 dd -if $netdir/data -bs 2 -count 1 -quiet 1 > /dev/null chunksize = `{ read $netdir/data | tr -d | awk ' { printf "ibase=16; 0%s\n", toupper($0) ; } ' | bc} } } if not cat $netdir/data } if not { echo Connection to $ip failed >[1=2] } } ifs = $ofs } fn ssl { tlspipeclient tcp!$ip!$port } fn HEAD { method = HEAD perform_method $* } fn GET { method = GET perform_method $* } fn POST { method = POST perform_method $* } fn perform_method { if(~ $method POST) content_type = application/x-www-form-urlencoded cookie = (' ') count = None referer = '' while(~ $1 -*) { switch($1) { case -t content_type = $2 shift 2 case -c cookie = ($cookie $2';') shift 2 case -r offset = $2 count = $3 shift 3 case -e referer = $2 shift 2 } } crack_uri $1 if(~ $ip [0-9]*) { if(~ $method POST) body = `{cat} { hdr $method $uri HTTP/1.1 hdr host: $host if(~ $method POST) { hdr 'Content-type: '$content_type hdr 'Content-length: ' `{wc -c /env/body | sed -e 's/^ +//' -e 's/ .*//'} } hdr 'Cookie: '$"cookie if(! ~ $count None) hdr Range: bytes'='$offset-$count if(test -n $referer) hdr Referer: $referer hdr Connection: Close hdr '' if(~ $method POST) cat /env/body } | tee /fd/2 | $transport } if not { echo DNS failed for $host >[1=2] } }