diff --git a/src/mochiweb_html.erl b/src/mochiweb_html.erl index b10bbe39..0f281db9 100644 --- a/src/mochiweb_html.erl +++ b/src/mochiweb_html.erl @@ -404,8 +404,8 @@ destack(TagName, Stack) when is_list(Stack) -> {_, []} -> %% Actually was a singleton Stack; - {Pre, [{T1, A1, []} | Post1]} -> - [{T0, A0, [{T1, A1, lists:reverse(Pre)} | Post1]} + {Pre, [{T1, A1, Acc1} | Post1]} -> + [{T0, A0, [{T1, A1, Acc1 ++ lists:reverse(Pre)} | Post1]} | Post0] end; _ -> @@ -576,6 +576,10 @@ find_qgt(Bin, S=#decoder{offset=O}) -> case Bin of <<_:O/binary, "?>", _/binary>> -> ?ADV_COL(S, 2); + <<_:O/binary, ">", _/binary>> -> + ?ADV_COL(S, 1); + <<_:O/binary, "/>", _/binary>> -> + ?ADV_COL(S, 2); %% tokenize_attributes takes care of this state: %% <<_:O/binary, C, _/binary>> -> %% find_qgt(Bin, ?INC_CHAR(S, C)); @@ -1236,5 +1240,25 @@ parse_missing_attr_name_test() -> {<<"html">>, [ { <<"=">>, <<"=">> }, { <<"black">>, <<"black">> } ], [] }, mochiweb_html:parse(D0)), ok. + +parse_broken_pi_test() -> + D0 = <<"">>, + ?assertEqual( + {<<"html">>, [], [ + { pi, <<"xml:namespace">>, [ { <<"prefix">>, <<"o">> }, + { <<"ns">>, <<"urn:schemas-microsoft-com:office:office">> } ] } + ] }, + mochiweb_html:parse(D0)), + ok. + +parse_funny_singletons_test() -> + D0 = <<"x">>, + ?assertEqual( + {<<"html">>, [], [ + { <<"input">>, [], [] }, + { <<"input">>, [], [ <<"x">> ] } + ] }, + mochiweb_html:parse(D0)), + ok. -endif.