Browse Source

Use binary:match/2 instead of binary:split/2 in cowboy_http

Also fix a bug introduced in a previous commit.
Loïc Hoguin 12 years ago
parent
commit
332c274d87
1 changed files with 14 additions and 9 deletions
  1. 14 9
      src/cowboy_http.erl

+ 14 - 9
src/cowboy_http.erl

@@ -95,17 +95,22 @@ request_line(Data) ->
 %% We just want to extract the path/qs and skip everything else.
 %% We do not really parse the URI, nor do we need to.
 uri_to_abspath(Data, Fun) ->
-	case binary:split(Data, <<" ">>) of
-		[_] -> %% We require the HTTP version.
+	case binary:match(Data, <<" ">>) of
+		nomatch -> %% We require the HTTP version.
 			{error, badarg};
-		[URI, Rest] ->
-			case binary:split(URI, <<"://">>) of
-				[_] -> %% Already is a path or "*".
+		{Pos1, _} ->
+			<< URI:Pos1/binary, _:8, Rest/bits >> = Data,
+			case binary:match(URI, <<"://">>) of
+				nomatch -> %% Already is a path or "*".
 					Fun(Rest, URI);
-				[_, NoScheme] ->
-					case binary:split(NoScheme, <<"/">>) of
-						[_] -> <<"/">>;
-						[_, NoHost] -> Fun(Rest, << "/", NoHost/binary >>)
+				{Pos2, _} ->
+					<< _:Pos2/binary, _:24, NoScheme/bits >> = Rest,
+					case binary:match(NoScheme, <<"/">>) of
+						nomatch ->
+							Fun(Rest, <<"/">>);
+						{Pos3, _} ->
+							<< _:Pos3/binary, _:8, NoHost/bits >> = NoScheme,
+							Fun(Rest, << "/", NoHost/binary >>)
 					end
 			end
 	end.