From 8ec8af12439c951987202d4aed6d7f7f12257d79 Mon Sep 17 00:00:00 2001 From: Prashanth Mundkur Date: Mon, 5 Nov 2012 17:12:23 -0800 Subject: [PATCH] Fix 0-length range responses. 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. --- src/mochiweb_request.erl | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/mochiweb_request.erl b/src/mochiweb_request.erl index aeeeb1b5..9a8f28d1 100644 --- a/src/mochiweb_request.erl +++ b/src/mochiweb_request.erl @@ -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};