Skip to content

Commit

Permalink
Fix 0-length range responses.
Browse files Browse the repository at this point in the history
There were two issues:

- file:pread() returns eof in the case when the length of the
  read is 0 bytes, for any offset.  This causes badarg exceptions
  later in iolist_size when the 'eof' atom is encountered instead
  of a binary

- The range-length computation is off by 1 for 0-length ranges:
  {Skip, Skip + Length - 1, PartialBody} would result in e.g.
  {0, -1, eof}. {0, -1} is invalid HTTP according to

  http://tools.ietf.org/html/rfc2616#section-14.16

     A byte-content-range-spec with a byte-range-resp-spec whose
     last-byte-pos value is less than its first-byte-pos value,
     or whose instance-length value is less than or equal to its
     last-byte-pos value, is invalid.

This patch fixes both issues.
  • Loading branch information
pmundkur committed Nov 6, 2012
1 parent e282266 commit 8ec8af1
Showing 1 changed file with 6 additions and 1 deletion.
7 changes: 6 additions & 1 deletion src/mochiweb_request.erl
Original file line number Diff line number Diff line change
Expand Up @@ -652,7 +652,12 @@ range_parts({file, IoDevice}, Ranges) ->
LocNums = lists:foldr(F, [], Ranges),
{ok, Data} = file:pread(IoDevice, LocNums),
Bodies = lists:zipwith(fun ({Skip, Length}, PartialBody) ->
{Skip, Skip + Length - 1, PartialBody}
case Length of
0 ->
{Skip, Skip, <<>>};
_ ->
{Skip, Skip + Length - 1, PartialBody}
end
end,
LocNums, Data),
{Bodies, Size};
Expand Down

0 comments on commit 8ec8af1

Please sign in to comment.