|
|
@ -5,22 +5,21 @@ |
|
|
|
-compile(inline). |
|
|
|
-compile({inline_size, 128}). |
|
|
|
|
|
|
|
-export([request/3]). |
|
|
|
-export([request/4]). |
|
|
|
|
|
|
|
-spec request(Stage :: stage(), Data :: binary(), State :: #wsState{}) -> {ok, NewState :: #wsState{}} | {done, NewState :: #wsState{}} | {error, term()}. |
|
|
|
request(reqLine, Data, State) -> |
|
|
|
-spec request(Stage :: stage(), Data :: binary(), wsSocket(), State :: #wsState{}) -> {ok, NewState :: #wsState{}} | {done, NewState :: #wsState{}} | {error, term()}. |
|
|
|
request(reqLine, Data, Socket, State) -> |
|
|
|
case erlang:decode_packet(http_bin, Data, []) of |
|
|
|
{more, _} -> |
|
|
|
{ok, State#wsState{buffer = Data}}; |
|
|
|
{ok, {http_request, Method, RawPath, Version}, Rest} -> |
|
|
|
?wsErr("IMY**************11111 ~p~n", [{http_request, Method, RawPath, Version}]), |
|
|
|
case parsePath(RawPath) of |
|
|
|
{ok, Scheme, Host, Port, Path, URLArgs} -> |
|
|
|
case Rest of |
|
|
|
<<>> -> |
|
|
|
{ok, State#wsState{stage = header, buffer = <<>>, method = Method, path = Path, wsReq = #wsReq{method = Method, path = Path, version = Version, scheme = Scheme, host = Host, port = Port, args = URLArgs}}}; |
|
|
|
{ok, State#wsState{stage = header, buffer = <<>>, method = Method, path = Path, socket = Socket, wsReq = #wsReq{method = Method, path = Path, version = Version, scheme = Scheme, host = Host, port = Port, args = URLArgs}}}; |
|
|
|
_ -> |
|
|
|
request(header, Rest, State#wsState{stage = header, buffer = Rest, method = Method, path = Path, wsReq = #wsReq{method = Method, path = Path, version = Version, scheme = Scheme, host = Host, port = Port, args = URLArgs}}) |
|
|
|
request(header, Rest, Socket, State#wsState{stage = header, buffer = Rest, method = Method, path = Path, wsReq = #wsReq{method = Method, path = Path, version = Version, scheme = Scheme, host = Host, port = Port, args = URLArgs}}) |
|
|
|
end; |
|
|
|
_Err -> |
|
|
|
_Err |
|
|
@ -32,12 +31,12 @@ request(reqLine, Data, State) -> |
|
|
|
{error, _Reason} = Ret -> |
|
|
|
Ret |
|
|
|
end; |
|
|
|
request(header, Data, State) -> |
|
|
|
request(header, Data, Socket, State) -> |
|
|
|
case erlang:decode_packet(httph_bin, Data, []) of |
|
|
|
{more, _} -> |
|
|
|
{ok, State#wsState{buffer = Data}}; |
|
|
|
{ok, {http_header, _, Key, _, Value}, Rest} -> |
|
|
|
#wsState{headerCnt = HeaderCnt, temHeader = TemHeader, rn = Rn, maxSize = MaxSize} = State, |
|
|
|
#wsState{headerCnt = HeaderCnt, temHeader = TemHeader, rn = Rn, maxSize = MaxSize, chunkedSupp = ChunkedSupp} = State, |
|
|
|
NewTemHeader = [{Key, Value} | TemHeader], |
|
|
|
NewHeaderCnt = HeaderCnt + 1, |
|
|
|
case NewHeaderCnt >= 100 of |
|
|
@ -51,29 +50,28 @@ request(header, Data, State) -> |
|
|
|
true -> |
|
|
|
{err_code, 413}; |
|
|
|
_ -> |
|
|
|
request(header, Rest, State#wsState{buffer = Rest, headerCnt = NewHeaderCnt, temHeader = NewTemHeader, contentLength = ContentLength}) |
|
|
|
request(header, Rest, Socket, State#wsState{buffer = Rest, headerCnt = NewHeaderCnt, temHeader = NewTemHeader, contentLength = ContentLength}) |
|
|
|
end; |
|
|
|
'Transfer-Encoding' -> |
|
|
|
case Value of |
|
|
|
<<"chunked">> -> |
|
|
|
case Rn of |
|
|
|
undefined -> |
|
|
|
request(header, Rest, State#wsState{buffer = Rest, headerCnt = NewHeaderCnt, temHeader = NewTemHeader, contentLength = chunked, rn = binary:compile_pattern(<<"\r\n">>)}); |
|
|
|
_ -> |
|
|
|
request(header, Rest, State#wsState{buffer = Rest, headerCnt = NewHeaderCnt, temHeader = NewTemHeader, contentLength = chunked}) |
|
|
|
end; |
|
|
|
<<"Chunked">> -> |
|
|
|
case Rn of |
|
|
|
undefined -> |
|
|
|
request(header, Rest, State#wsState{buffer = Rest, headerCnt = NewHeaderCnt, temHeader = NewTemHeader, contentLength = chunked, rn = binary:compile_pattern(<<"\r\n">>)}); |
|
|
|
IsChunked = ?IIF(Value == <<"chunked">> orelse Value == <<"Chunked">>, true, false), |
|
|
|
case IsChunked of |
|
|
|
true -> |
|
|
|
case ChunkedSupp of |
|
|
|
true -> |
|
|
|
case Rn of |
|
|
|
undefined -> |
|
|
|
request(header, Rest, Socket, State#wsState{buffer = Rest, headerCnt = NewHeaderCnt, temHeader = NewTemHeader, contentLength = chunked, rn = binary:compile_pattern(<<"\r\n">>)}); |
|
|
|
_ -> |
|
|
|
request(header, Rest, Socket, State#wsState{buffer = Rest, headerCnt = NewHeaderCnt, temHeader = NewTemHeader, contentLength = chunked}) |
|
|
|
end; |
|
|
|
_ -> |
|
|
|
request(header, Rest, State#wsState{buffer = Rest, headerCnt = NewHeaderCnt, temHeader = NewTemHeader, contentLength = chunked}) |
|
|
|
{error, not_support_chunked} |
|
|
|
end; |
|
|
|
_ -> |
|
|
|
{error, 'Transfer-Encoding'} |
|
|
|
end; |
|
|
|
_ -> |
|
|
|
request(header, Rest, State#wsState{buffer = Rest, headerCnt = NewHeaderCnt, temHeader = NewTemHeader}) |
|
|
|
request(header, Rest, Socket, State#wsState{buffer = Rest, headerCnt = NewHeaderCnt, temHeader = NewTemHeader}) |
|
|
|
end |
|
|
|
end; |
|
|
|
{ok, http_eoh, Rest} -> |
|
|
@ -89,7 +87,7 @@ request(header, Data, State) -> |
|
|
|
<<>> -> |
|
|
|
{ok, State#wsState{stage = body, buffer = <<>>, wsReq = NewWsReq}}; |
|
|
|
_ -> |
|
|
|
request(body, Rest, State#wsState{stage = body, buffer = Rest, wsReq = NewWsReq}) |
|
|
|
request(body, Rest, Socket, State#wsState{stage = body, buffer = Rest, wsReq = NewWsReq}) |
|
|
|
end |
|
|
|
end; |
|
|
|
{ok, {http_error, ErrStr}, _Rest} -> |
|
|
@ -97,7 +95,7 @@ request(header, Data, State) -> |
|
|
|
{error, _Reason} = Ret -> |
|
|
|
Ret |
|
|
|
end; |
|
|
|
request(body, Data, State) -> |
|
|
|
request(body, Data, _Socket, State) -> |
|
|
|
#wsState{contentLength = CLen, wsReq = WsReq, temChunked = TemChunked, rn = Rn} = State, |
|
|
|
case CLen of |
|
|
|
chunked -> |
|
|
|