in reply to Re: Upload file to REST service
in thread Upload file to REST service

Something is wrong with the syntax though, and I can't understand what:
open my $up, "<", "$_[0]" or die "Something went wrong: ".$!; binmode +$up; my $ck = Digest::MD5->new; $ck->addfile($up); close $up; my $us = HTTP::Headers->new; $us->header(Content_Type => 'multipart/fo +rm-data'); my $req = HTTP::Request->new('POST',"https://".$server."/file_bucket_f +ile/md5/".$_[1]."/".$ck->hexdigest, $us, [ file => ["$_[0]"] ]); print Dumper($req); my $res = $ua->request($req); die "Something went wrong: ".$res->status_line unless $res->is_success +;
perl -wc file doesn't complain, but when running I get "Can't call method "request" on an undefined value ". $req is defined, and shown on the line above, but the code doesn't get to the "something went wrong" line.
I have tried various invocations (there are probably 50 ways in which one can call LWP::UserAgent). with and without HTTP::Request::Common::DYNAMIC_FILE_UPLOAD, no luck..

Replies are listed 'Best First'.
Re^3: Upload file to REST service
by Anonymous Monk on Jun 02, 2011 at 05:21 UTC
    Something is wrong with the syntax though, and I can't understand

    Nothing is wrong with the syntax, there are no syntax errors

    get "Can't call method "request" on an undefined value ". $req is defined, and shown on the line above,

    But you aren't calling any method request on variable $req. See diagnostics

      You are right, I was staring at the undefined $ua (just a typo) and not seeing it, thank you.
      Still, this doesn't seem to work in my test setup, i.e. apache as proxy in front of puppet. I get a "..timeout specified has expired: proxy: prefetch request body failed to 127.0.0.1:18140" in apache's log.
      GETs do work, just PUTs fail. Config is
      Listen 8140 <Proxy balancer://puppetmaster> BalancerMember http://127.0.0.1:18140 BalancerMember http://127.0.0.1:18141 </Proxy> <VirtualHost *:8140> SSLEngine On SSLCipherSuite SSLv2:-LOW:-EXPORT:RC4+RSA SSLCertificateFile /var/lib/puppet/ssl/certs/server.pem SSLCertificateKeyFile /var/lib/puppet/ssl/private_keys/server. +pem SSLCertificateChainFile /var/lib/puppet/ssl/ca/ca_crt.pem SSLCACertificateFile /var/lib/puppet/ssl/ca/ca_crt.pem SSLCARevocationFile /var/lib/puppet/ssl/ca/ca_crl.pem SSLVerifyClient require SSLVerifyDepth 1 SSLOptions +StdEnvVars RequestHeader set X-Client-DN %{SSL_CLIENT_S_DN}e RequestHeader set X-Client-Verify %{SSL_CLIENT_VERIFY}e <Location /> SetHandler balancer-manager Order allow,deny Allow from all </Location> ProxyPass / balancer://puppetmaster/ ProxyPassReverse / balancer://puppetmaster/ ProxyPreserveHost On ErrorLog /mirror/log/balancer_error_log CustomLog /mirror/log/balancer_access_log "%h %l %u %t \"%r\" +%>s %b \"%{SSL_CLIENT_S_DN}x\" \"%{User-Agent}i\"" </VirtualHost>
      and the perl code is
      { open my $up, "<", "$_[0]" or die "Something went wrong: ".$!; binm +ode $up; my $ck = Digest::MD5->new; $ck->addfile($up); close $up; my $req = HTTP::Request::StreamingUpload->new( PUT => "https:// ".$server."/file_bucket_file/md5/".$ck->hexdigest, path => $_[0], headers => HTTP::Headers->new( 'Content-Type' => 'application/binary', 'Content-Length' => -s $_[0], 'Accept' => 's', ), ); my $res = $ua->request($req); die "Something went wrong: ".$res->status_line unless $res->is_suc +cess; return $res->content; }
      SSL handshake does work, but the puppet process doesn't seem to receive any data (I'm tailing its debug log). Not sure if I am doing something wrong, or it is a problem in mod_proxy..
        Could be an Apache bug, some googling for the error message showed an old bug ("mod_proxy fails to send post request to backend server"), usually blamed on IE. Another style of invocation does work:
        my $req = HTTP::Request::StreamingUpload->new( PUT => "https://$server", callback => sub { shift @chunk }, headers => HTTP::Headers->new( 'Content-Type' => 'application/binary', 'Content-Length' => 9, 'Accept' => 's', ), ); my $res = $ua->request($req);
        My httpd is 2.2.15 though (RH6), and it should have been fixed in 2.2.9