Changeset 810

Show
Ignore:
Timestamp:
12/11/08 23:43:05 (12 months ago)
Author:
hachi
Message:

Allow zero byte content-length PUT requests

Location:
trunk
Files:
3 modified

Legend:

Unmodified
Added
Removed
  • trunk/CHANGES

    r809 r810  
     1    -- Allow zero byte PUT requests (in normal PUT situations) 
    12 
    23    -- Fix for serving files from the filesystem over SSL (Greg Denton)  
  • trunk/lib/Perlbal/ClientHTTP.pm

    r763 r810  
    146146    # bigger than any specified max put size 
    147147    return $self->send_response(400, "Content-length of $clen is invalid.") 
    148         if !$clen || 
     148        if ! defined($clen) || 
     149        $clen < 0 || 
    149150        ($self->{service}->{max_put_size} && 
    150151         $clen > $self->{service}->{max_put_size}); 
    151152 
    152     # if we have some data already from a header over-read, note it 
    153     if (defined $self->{read_ahead} && $self->{read_ahead} > 0) { 
     153    # if we are supposed to read data and have some data already from a header over-read, note it 
     154    if ($clen && defined $self->{read_ahead} && $self->{read_ahead} > 0) { 
    154155        $self->{content_length_remain} -= $self->{read_ahead}; 
    155156    } 
     
    228229 
    229230    my $disk_path = $self->{service}->{docroot} . '/' . $path; 
    230     $self->start_put_open($disk_path, $filename); 
    231231 
    232232    $self->{chunked_upload_state} = Perlbal::ChunkedUploadState->new(%{{ 
     
    268268        }, 
    269269    }}); 
     270 
     271    $self->start_put_open($disk_path, $filename); 
    270272 
    271273    return 1; 
     
    396398        $self->{put_fh_filename} = "$path/$file"; 
    397399 
     400        # We just opened the file, haven't read_ahead any bytes, are expecting 0 bytes for read and we're 
     401        # not in chunked mode, so close the file immediately, we're done. 
     402        unless ($self->{read_ahead} || $self->{content_length_remain} || $self->{chunked_upload_state}) { 
     403            # FIXME this should be done through AIO 
     404            $self->put_close; 
     405            return; 
     406        } 
     407 
    398408        $self->put_writeout; 
    399409    }); 
  • trunk/t/20-put.t

    r358 r810  
    22 
    33use strict; 
     4use warnings; 
     5 
    46use Perlbal::Test; 
    57 
     
    3638 
    3739sub put_file { 
     40    my %opts = @_; 
    3841    my $req = HTTP::Request->new(PUT => $url); 
    3942    $content = "foo bar baz\n" x 1000; 
     43 
     44    if (exists $opts{content}) { 
     45        $content = $opts{content} 
     46    } 
     47 
    4048    $req->content($content); 
     49 
     50    if (my $headers = $opts{headers}) { 
     51        $req->header(@$headers); 
     52    } 
     53 
    4154    my $res = $ua->request($req); 
    4255    return $res->is_success; 
     
    8396    ok(put_file(), "aio $mode: good put at dir1/dir2/foo.txt"); 
    8497    verify_put(); 
     98    ok(put_file(content => "", headers => [ "Content-Length" => 0 ]), "aio $mode: zero byte file put"); 
     99    verify_put(); 
    85100    ok(unlink($disk_file), "rm file"); 
    86101    ok(rmdir("$dir/$dir1/dir2"), "rm dir2");