On Mon, May 28, 2012 at 8:37 PM, Rob Dixon <rob.di...@gmx.com> wrote:

> On 28/05/2012 15:15, raphael() wrote:
> >
> > I am trying to use HTTP::Tiny module to download file with RANGE
> attribute.
> > However I cannot accomplish it.
> >
> > In WWW::Mechanize the code I use is simple
> > my $file_obj = $ua->get( $url, 'Range' =>  sprintf("bytes=%s-%s",
> > $file_size, $content_length - 1), ) or die;
> >
> > But I want to use the Tiny Module. How do I do this in HTTP::Tiny?
> >
> > In the doc it says I have to give it a \%options hash-ref.
> > my %options= { default_headers =>  "Range =>  bytes=0-999", };
> > my $file_obj = $ua->get( $url, \%options ) or die;
> >
> > something like above or am I sorely mistaken?
> >
> > The above code doesn't work. Even if half file exists the whole file is
> > re-downloaded so range attribute doesn't work.
> >
> > I checked the length of downloaded content in debugger.  May be the hash
> > ref thing I am doing is wrong!
> >
> > A sample code will be most helpful.
>
> Hi Raphael
>
> HTTP::Tiny is very similar to WWW::Mechanize in this regard. The only
> difference is that the request headers should be passed as a hash
> reference instead of a plain hash, so you basically need a pair of
> containing braces around what you have already written.
>
> You shouldn't play with the default headers unless you want to limit the
> download to the same range of bytes every time. Instead you should pass
> specific values in the calls to the get method.
>
> Also you cannot initialise a hash using
>
>  my %options= { default_headers =>  "Range =>  bytes=0-999", };
>
> as you are trying to assign an anonymous hash - a single scalar value -
> to a hash that requires data in key/value pairs.
>
> You can write
>
>  my $response = $http->get($url, { headers => { Range => 'bytes=1-99' } }
> );
>
> or you can set up the headers in a separate hash, like this
>
>  my %headers = ( Range => 'bytes=1-99' );
>  my $resp = $http->get('http://www.bbc.co.uk/', { headers => \%headers }
> );
>
> Below is a complete working program for you to experiment with.
>
> HTH,
>
> Rob
>
>
>
>  use strict;
>  use warnings;
>
>  use HTTP::Tiny;
>
>  my $http = HTTP::Tiny->new;
>
>  my %headers = ( Range => 'bytes=1-99' );
>  my $resp = $http->get('http://www.bbc.co.uk/', { headers => \%headers }
> );
>
>  print "@{$resp}{qw/ status reason /}\n\n";
>
>  print $resp->{content}, "\n";
>
>
Wow! That was quick and perfect. Also thanks for explaining how to use the
headers hash separately . It was such a simple thing now that I see a
sample code. Shame on me :(

Reply via email to