You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by be...@apache.org on 2014/02/13 17:06:44 UTC

[49/50] mochiweb commit: updated refs/heads/import-upstream to 8eb1f22

Allow whitespace in Range headers

While investigating basho/webmachine#186 it was noted that a small but
non-zero percentage of clients embed whitespace in Range headers. It
appears this is valid:

>From http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

    byte-range-set  = 1#( byte-range-spec | suffix-byte-range-spec )

>From http://www.w3.org/Protocols/rfc2616/rfc2616-sec2.html#sec2

    #rule
    ...separated by one or more commas (",") and OPTIONAL linear
    white space (LWS)...
    ...null elements are allowed, but do not contribute to the count
    of elements present. That is, "(element), , (element) " is permitted,
    but counts as only two elements...


Project: http://git-wip-us.apache.org/repos/asf/couchdb-mochiweb/repo
Commit: http://git-wip-us.apache.org/repos/asf/couchdb-mochiweb/commit/176ddce1
Tree: http://git-wip-us.apache.org/repos/asf/couchdb-mochiweb/tree/176ddce1
Diff: http://git-wip-us.apache.org/repos/asf/couchdb-mochiweb/diff/176ddce1

Branch: refs/heads/import-upstream
Commit: 176ddce1590f91748f84b8014966bac8acea5e13
Parents: 7a7cefa
Author: Nathan Parry <np...@gmail.com>
Authored: Wed Feb 5 23:22:02 2014 -0500
Committer: Nathan Parry <np...@gmail.com>
Committed: Wed Feb 5 23:26:49 2014 -0500

----------------------------------------------------------------------
 src/mochiweb_http.erl | 16 +++++++++++++++-
 1 file changed, 15 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/couchdb-mochiweb/blob/176ddce1/src/mochiweb_http.erl
----------------------------------------------------------------------
diff --git a/src/mochiweb_http.erl b/src/mochiweb_http.erl
index 8c814cb..38d51d4 100644
--- a/src/mochiweb_http.erl
+++ b/src/mochiweb_http.erl
@@ -158,7 +158,8 @@ parse_range_request("bytes=0-") ->
 parse_range_request(RawRange) when is_list(RawRange) ->
     try
         "bytes=" ++ RangeString = RawRange,
-        Ranges = string:tokens(RangeString, ","),
+        RangeTokens = [string:strip(R) || R <- string:tokens(RangeString, ",")],
+        Ranges = [R || R <- RangeTokens, string:len(R) > 0],
         lists:map(fun ("-" ++ V)  ->
                           {none, list_to_integer(V)};
                       (R) ->
@@ -221,6 +222,19 @@ range_test() ->
        [{20, none}, {50, 100}, {none, 200}],
        parse_range_request("bytes=20-,50-100,-200")),
 
+    %% valid, multiple range with whitespace
+    ?assertEqual(
+       [{20, 30}, {50, 100}, {110, 200}],
+       parse_range_request("bytes=20-30, 50-100 , 110-200")),
+
+    %% valid, multiple range with extra commas
+    ?assertEqual(
+       [{20, 30}, {50, 100}, {110, 200}],
+       parse_range_request("bytes=20-30,,50-100,110-200")),
+    ?assertEqual(
+       [{20, 30}, {50, 100}, {110, 200}],
+       parse_range_request("bytes=20-30, ,50-100,,,110-200")),
+
     %% no ranges
     ?assertEqual([], parse_range_request("bytes=")),
     ok.