Current section

Files

Jump to
ewe src ewe_ffi.erl
Raw

src/ewe_ffi.erl

-module(ewe_ffi).
-export([decode_packet/3, rescue/1, validate_field_value/1]).
decode_packet(Type, Packet, Options) ->
case erlang:decode_packet(Type, Packet, Options) of
{ok, {http_request, Method, Uri, Version}, Rest} ->
{ok, {packet, {http_request, atom_to_binary(Method), Uri, Version}, Rest}};
{ok, {http_header, Idx, _, Field, Value}, Rest} ->
{ok, {packet, {http_header, Idx, Field, Value}, Rest}};
{ok, Bin, Rest} ->
{ok, {packet, Bin, Rest}};
{more, undefined} ->
{ok, {more, none}};
{more, Length} ->
{ok, {more, {some, Length}}};
{error, Reason} ->
{error, Reason}
end.
rescue(Callable) ->
try {ok, Callable()}
catch
error:Error -> {error, {errored, Error}};
throw:Error -> {error, {thrown, Error}};
exit:Error -> {error, {exited, Error}}
end.
validate_field_value(Value) ->
case do_validate_field_value(Value) of
true -> {ok, Value};
false -> {error, nil}
end.
% HTTP field values can contain:
% - VCHAR: 0x21-0x7E (visible ASCII characters)
% - WSP: 0x20 (space), 0x09 (tab)
% - obs-text: 0x80-0xFF (for backward compatibility)
% Invalid: control characters 0x00-0x08, 0x0A-0x1F, 0x7F
do_validate_field_value(Value) ->
case Value of
<<>> -> true;
<<C, Rest/bitstring>> when C =:= 16#09
orelse (C >= 16#20 andalso C =< 16#7E)
orelse (C >= 16#80 andalso C =< 16#FF)
-> do_validate_field_value(Rest);
_ -> false
end.