Beefy Boxes and Bandwidth Generously Provided by pair Networks
There's more than one way to do things
 
PerlMonks  

Re^2: sending a large file via http

by mifflin (Curate)
on Jun 18, 2007 at 22:52 UTC ( #621885=note: print w/ replies, xml ) Need Help??


in reply to Re: sending a large file via http
in thread sending a large file via http

So does this mean that the content-length header value is no longer used?
Here is some untested sample code based on your response and reading the lwp::useragent docs...

use strict; use warnings; use LWP; use IO::Handle; use Fatal qw( open close ); my $url = 'https://........'; my filename = 'file2send.txt'; my $LINES_PER_CHUNK = 100; open my $fh, '<', $filename; sub sendthis { my @buf; my $linesread = 0; if ($fh->isopened) { while (my $line = <$fh>) { $linesread++; push(@buf, $line); if ($linesread == $LINES_PER_CHUNK) { return join('', @buf); } } close $fh; return join('', @buf); } return ''; } eval { my $headers = HTTP::Headers->new(); $headers->header('Content-Type' => 'text/plain; charset=utf-8'); $headers->header('Content-Length' => -s $file2send); my $request = HTTP::Request->new('POST', $url, $headers); $request->protocol('HTTP/1.1'); my $browser = LWP::UserAgent->new(); my $response = $browser->request($request, \&sendthis); my $gotthis = $response->content(); print $gotthis; }; if ($@) { # handle error ! }
Edit: made changes that rhesa suggested regarding request method callback and content length


Comment on Re^2: sending a large file via http
Download Code
Re^3: sending a large file via http
by rhesa (Vicar) on Jun 18, 2007 at 23:13 UTC
    So does this mean that the content-length header value is no longer used?
    I can't tell from the LWP docs if it handles that for you, but you can still set it yourself, for example with my $length = -s $filename; and then adding the appropriate header.

    Regarding your code, I read the docs slightly differently:

    my $request = HTTP::Request->new('POST', $url, $headers); $request->protocol('HTTP/1.1'); my $browser = LWP::UserAgent->new(); my $response = $browser->request($request, \&sendthis);
    That is, you pass the callback to the LWP->request method, not the HTTP::Request constructor.
      Thanks for the response.
      I made the changes you suggested above.
      Now if I could just get the client to give me a url so I can test....
      Check out LWP/Protocol/http.pm
        When request is called here, your coderef is in $arg
      
      sub request {
        my($self, $request, $proxy, $arg, $size, $timeout) = @_;
       ...
          my $content_ref = $request->content_ref;
          $content_ref = $$content_ref if ref($$content_ref);
      ....
              if (ref($content_ref) eq 'CODE') {
                  my $buf = &$content_ref();
      ...
      
      http.pm doesn't look at $arg as a code ref.
      Instead it looks at $content_ref.
      But if $content_ref was a code ref, then you'll get a run time error.
      
      It'll never work !  This feature is totally broken.
      

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://621885]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others cooling their heels in the Monastery: (16)
As of 2014-07-14 14:27 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    When choosing user names for websites, I prefer to use:








    Results (261 votes), past polls