Speed up and move couch_httpd:find_in_binary. See https://issues.apache.org/jira/browse/COUCHDB-1953
Project: http://git-wip-us.apache.org/repos/asf/couchdb-couch-httpd/repo Commit: http://git-wip-us.apache.org/repos/asf/couchdb-couch-httpd/commit/dc841e04 Tree: http://git-wip-us.apache.org/repos/asf/couchdb-couch-httpd/tree/dc841e04 Diff: http://git-wip-us.apache.org/repos/asf/couchdb-couch-httpd/diff/dc841e04 Branch: refs/heads/1994-merge-rcouch Commit: dc841e0492d960e1a19f6564a34076b9bbbd7d16 Parents: e41dc6c Author: NickNorth <[email protected]> Authored: Tue Dec 3 20:58:53 2013 +0000 Committer: Paul J. Davis <[email protected]> Committed: Wed Feb 12 21:05:52 2014 -0600 ---------------------------------------------------------------------- src/couch_httpd.erl | 30 +----------------------------- 1 file changed, 1 insertion(+), 29 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/couchdb-couch-httpd/blob/dc841e04/src/couch_httpd.erl ---------------------------------------------------------------------- diff --git a/src/couch_httpd.erl b/src/couch_httpd.erl index 7be8a2a..29f9db0 100644 --- a/src/couch_httpd.erl +++ b/src/couch_httpd.erl @@ -968,7 +968,7 @@ split_header(Line) -> mochiweb_util:parse_header(Value)}]. read_until(#mp{data_fun=DataFun, buffer=Buffer}=Mp, Pattern, Callback) -> - case find_in_binary(Pattern, Buffer) of + case couch_util:find_in_binary(Pattern, Buffer) of not_found -> Callback2 = Callback(Buffer), {Buffer2, DataFun2} = DataFun(), @@ -1044,34 +1044,6 @@ check_for_last(#mp{buffer=Buffer, data_fun=DataFun}=Mp) -> data_fun = DataFun2}) end. -find_in_binary(_B, <<>>) -> - not_found; - -find_in_binary(B, Data) -> - case binary:match(Data, [B], []) of - nomatch -> - partial_find(binary:part(B, {0, byte_size(B) - 1}), - binary:part(Data, {byte_size(Data), -byte_size(Data) + 1}), 1); - {Pos, _Len} -> - {exact, Pos} - end. - -partial_find(<<>>, _Data, _Pos) -> - not_found; - -partial_find(B, Data, N) when byte_size(Data) > 0 -> - case binary:match(Data, [B], []) of - nomatch -> - partial_find(binary:part(B, {0, byte_size(B) - 1}), - binary:part(Data, {byte_size(Data), -byte_size(Data) + 1}), N + 1); - {Pos, _Len} -> - {partial, N + Pos} - end; - -partial_find(_B, _Data, _N) -> - not_found. - - validate_bind_address(Address) -> case inet_parse:address(Address) of {ok, _} -> ok;
