Skip to content

Commit

Permalink
Re-throw original error, if permissive header decoder fails
Browse files Browse the repository at this point in the history
  • Loading branch information
seriyps committed Nov 29, 2013
1 parent 3785e23 commit 8f6ae4f
Showing 1 changed file with 13 additions and 6 deletions.
19 changes: 13 additions & 6 deletions src/mimemail.erl
Expand Up @@ -127,8 +127,14 @@ decode_header(Value, Charset) ->
RTokens = tokenize_header(Value, []),
Tokens = lists:reverse(RTokens),
Decoded = try decode_header_tokens_strict(Tokens, Charset)
catch _:_ ->
decode_header_tokens_permissive(Tokens, Charset, [])
catch Type:Reason ->
case decode_header_tokens_permissive(Tokens, Charset, []) of
{ok, Dec} -> Dec;
error ->
% re-throw original error
% may also use erlang:raise/3 to preserve original traceback
erlang:Type(Reason)
end
end,
iolist_to_binary(Decoded).

Expand Down Expand Up @@ -193,9 +199,10 @@ decode_header_tokens_strict([Data | Tokens], Charset) ->
%% multibyte string not by characters, but by bytes. It first join folded
%% string and only then decode it with iconv.
decode_header_tokens_permissive([], _, [Result]) when is_binary(Result) ->
Result;
decode_header_tokens_permissive([], _, []) ->
[];
{ok, Result};
decode_header_tokens_permissive([], _, _Stack) ->
%% io:format(user, "Stack: ~p~n", [Stack]),
error;
decode_header_tokens_permissive([{Enc, Data} | Tokens], Charset, [{Enc, PrevData} | Stack]) ->
NewData = iolist_to_binary([PrevData, Data]),
case convert(Charset, Enc, NewData) of
Expand All @@ -206,7 +213,7 @@ decode_header_tokens_permissive([{Enc, Data} | Tokens], Charset, [{Enc, PrevData
end;
decode_header_tokens_permissive([NextToken | _] = Tokens, Charset, [{_, _} | Stack])
when is_binary(NextToken) orelse is_tuple(NextToken) ->
%% practicaly very rare case "=?utf-8?Q?BROKEN?= =?windows-1251?Q?maybe-broken?="
%% practicaly very rare case "=?utf-8?Q?BROKEN?=\r\n\t=?windows-1251?Q?maybe-broken?="
%% or "=?utf-8?Q?BROKEN?= raw-ascii-string"
%% drop broken value from stack
decode_header_tokens_permissive(Tokens, Charset, Stack);
Expand Down

0 comments on commit 8f6ae4f

Please sign in to comment.