X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?p=ypp-sc-tools.main.git;a=blobdiff_plain;f=pctb%2FCommods.pm;h=073906ff9da07defd3a8aa3380115ffc6c3cbcd9;hp=e695f15a5efe27afefba5ecdec381f1d87900e4e;hb=b958771fa67513ba09630953ec91b9d21b3f42f9;hpb=769239e4cc9af0b88578d1b15a1b14a7cb3dc7ba diff --git a/pctb/Commods.pm b/pctb/Commods.pm index e695f15..073906f 100644 --- a/pctb/Commods.pm +++ b/pctb/Commods.pm @@ -1,6 +1,7 @@ package Commods; use IO::File; +use HTTP::Request::Common (); use strict; use warnings; @@ -12,7 +13,10 @@ BEGIN { @ISA = qw(Exporter); @EXPORT = qw(&parse_masters %oceans %commods %clients &parse_pctb_commodmap %pctb_commodmap @pctb_commodmap - &get_our_version); + &get_our_version + &pipethrough_prep &pipethrough_run + &pipethrough_run_gzip + &cgipostform); %EXPORT_TAGS = ( ); @EXPORT_OK = qw(); @@ -109,14 +113,72 @@ sub parse_pctb_commodmap () { return 1; } -sub get_our_version ($) { - my ($prefix); - { - no strict (qw(refs)); - ${ "${prefix}name" }= 'ypp-sc-tools yarrg'; - ${ "${prefix}fixes" }= 'lastpage'; - ${ "${prefix}version" }= `git-describe --tags HEAD`; - $? and die $?; +sub get_our_version ($$) { + my ($aref,$prefix) = @_; + $aref->{"${prefix}name"}= 'ypp-sc-tools yarrg'; + $aref->{"${prefix}fixes"}= 'lastpage'; + $aref->{"${prefix}version"}= `git-describe --tags HEAD`; $? and die $?; + return $aref; +} + +sub pipethrough_prep () { + my $tf= IO::File::new_tmpfile() or die $!; + return $tf; +} + +sub pipethrough_run ($$$@) { + my ($tf, $childprep, $cmd, @a) = @_; + $tf->flush or die $!; + $tf->seek(0,0) or die $!; + my $child= open GZ, "-|"; defined $child or die $!; + if (!$child) { + open STDIN, "<&", $tf; + &$childprep() if defined $childprep; + exec $cmd @a; die $!; + } + my $r; + { undef $/; $!=0; $r= ; } + defined $r or die $!; + close GZ or die "$! $?"; die $? if $?; + return $r; +} +sub pipethrough_run_gzip ($) { + pipethrough_run($_[0],undef,'gzip','gzip'); +} + +sub cgipostform ($$$) { + my ($ua, $url, $form) = @_; + my $req= HTTP::Request::Common::POST($url, + Content => $form, + Content_Type => 'form-data'); + if ($url =~ m,^\.?/,) { + my $tf= pipethrough_prep(); + print $tf $req->content() or die $!; +#print STDERR "[[[",$req->content(),"]]]"; + my $out= pipethrough_run($tf, sub { + $ENV{'REQUEST_METHOD'}= 'POST'; + $ENV{'QUERY_STRING'}= ''; + $ENV{'PATH_TRANSLATED'}= $url; + $ENV{'PATH_INFO'}= ''; + $ENV{'HTTP_HOST'}= 'localhost'; + $ENV{'REMOTE_ADDR'}= '127.0.0.1'; + $ENV{'GATEWAY_INTERFACE'}= 'CGI/1.1'; + $ENV{'DOCUMENT_ROOT'}= '.'; + $ENV{'SCRIPT_FILENAME'}= $url; + $ENV{'SCRIPT_NAME'}= $url; + $ENV{'HTTP_USER_AGENT'}= 'Commods.pm local test'; + + foreach my $f (qw(Content_Length Content_Type)) { + $ENV{uc $f}= $req->header($f); + } +#system 'printenv >&2'; + }, "$url", "$url"); + $out =~ m,^Content-Type: text/plain.*\n\n, or die "$out ?"; + return $'; + } else { + my $resp= $ua->request($url,$req); + die $resp->status_line unless $resp->is_success; + return $resp->content(); } }