aboutsummaryrefslogtreecommitdiffstats
path: root/lib/xmerl/src/xmerl_sax_parser_base.erlsrc
diff options
context:
space:
mode:
authorLars Thorsen <[email protected]>2014-01-16 12:21:20 +0100
committerMagnus Lidén <[email protected]>2014-01-21 16:38:28 +0100
commite750b2aa3698d5bd7f4a9d23f568031e34c6ba2a (patch)
tree57dbc03e9e25bbccc55335148615116a7e58c781 /lib/xmerl/src/xmerl_sax_parser_base.erlsrc
parentfbcf11307e6e5eb9685fe6603ec2935638217423 (diff)
downloadotp-e750b2aa3698d5bd7f4a9d23f568031e34c6ba2a.tar.gz
otp-e750b2aa3698d5bd7f4a9d23f568031e34c6ba2a.tar.bz2
otp-e750b2aa3698d5bd7f4a9d23f568031e34c6ba2a.zip
[xmerl] Fix problem with header of next XML document is in the buffer
when using xmerl_sax_parser:stream/2 function.
Diffstat (limited to 'lib/xmerl/src/xmerl_sax_parser_base.erlsrc')
-rw-r--r--lib/xmerl/src/xmerl_sax_parser_base.erlsrc43
1 files changed, 28 insertions, 15 deletions
diff --git a/lib/xmerl/src/xmerl_sax_parser_base.erlsrc b/lib/xmerl/src/xmerl_sax_parser_base.erlsrc
index 6f95b67b99..e198f2fef5 100644
--- a/lib/xmerl/src/xmerl_sax_parser_base.erlsrc
+++ b/lib/xmerl/src/xmerl_sax_parser_base.erlsrc
@@ -113,6 +113,10 @@ parse_dtd(Xml, State) ->
State3 = event_callback(endDocument, State2),
ets:delete(RefTable),
{ok, State3#xmerl_sax_parser_state.event_state, Rest};
+ {endDocument, Rest, State2} when is_record(State2, xmerl_sax_parser_state) ->
+ State3 = event_callback(endDocument, State2),
+ ets:delete(RefTable),
+ {ok, State3#xmerl_sax_parser_state.event_state, Rest};
Other ->
_State2 = event_callback(endDocument, State1),
ets:delete(RefTable),
@@ -211,8 +215,9 @@ parse_prolog(?STRING_REST("<?", Rest), State) ->
{Rest1, State1} ->
parse_prolog(Rest1, State1);
{endDocument, Rest1, State1} ->
- IValue = ?TO_INPUT_FORMAT("<?"),
- {?APPEND_STRING(IValue, Rest1), State1}
+ parse_prolog(Rest1, State1)
+ % IValue = ?TO_INPUT_FORMAT("<?"),
+ % {?APPEND_STRING(IValue, Rest1), State1}
end;
parse_prolog(?STRING_REST("<!", Rest), State) ->
parse_prolog_1(Rest, State);
@@ -414,10 +419,11 @@ parse_pi(?STRING_UNBOUND_REST(C, Rest) = Bytes, State) ->
parse_name(Rest, State, [C]),
case string:to_lower(PiTarget) of
"xml" ->
- case State#xmerl_sax_parser_state.end_tags of
- [] ->
+ case check_if_new_doc_allowed(State#xmerl_sax_parser_state.input_type,
+ State#xmerl_sax_parser_state.end_tags) of
+ true ->
{endDocument, Bytes, State};
- _ ->
+ false ->
?fatal_error(State1, "<?xml ...?> not first in document")
end;
_ ->
@@ -431,6 +437,11 @@ parse_pi(?STRING_UNBOUND_REST(C, Rest) = Bytes, State) ->
parse_pi(Bytes, State) ->
unicode_incomplete_check([Bytes, State, fun parse_pi/2], undefined).
+check_if_new_doc_allowed(stream, []) ->
+ true;
+check_if_new_doc_allowed(_, _) ->
+ false.
+
%%----------------------------------------------------------------------
%% Function: parse_pi_1(Rest, State) -> Result
%% Input: Rest = string() | binary()
@@ -665,9 +676,9 @@ parse_misc(?STRING_REST("<?", Rest), State, Eod) ->
case parse_pi(Rest, State) of
{Rest1, State1} ->
parse_misc(Rest1, State1, Eod);
- {endDocument, Rest1, State1} ->
+ {endDocument, _Rest1, State1} ->
IValue = ?TO_INPUT_FORMAT("<?"),
- {?APPEND_STRING(IValue, Rest1), State1}
+ {?APPEND_STRING(IValue, Rest), State1}
end;
parse_misc(?STRING("<!") = Rest, State, Eod) ->
cf(Rest, State, Eod, fun parse_misc/3);
@@ -1076,9 +1087,9 @@ parse_content(?STRING_REST("<?", Rest), State, Acc, IgnorableWS) ->
case parse_pi(Rest, State1) of
{Rest1, State2} ->
parse_content(Rest1, State2, [], true);
- {endDocument, Rest1, State2} ->
+ {endDocument, _Rest1, State2} ->
IValue = ?TO_INPUT_FORMAT("<?"),
- {?APPEND_STRING(IValue, Rest1), State2}
+ {?APPEND_STRING(IValue, Rest), State2}
end;
parse_content(?STRING_REST("<!", Rest1) = Rest, #xmerl_sax_parser_state{end_tags = ET} = State, Acc, IgnorableWS) ->
case ET of
@@ -1664,8 +1675,9 @@ handle_external_entity({file, FileToOpen}, State) ->
{?STRING_EMPTY, EntityState} =
parse_external_entity_1(<<>>,
State#xmerl_sax_parser_state{continuation_state=FD,
- current_location=filename:dirname(FileToOpen),
- entity=filename:basename(FileToOpen)}),
+ current_location=filename:dirname(FileToOpen),
+ entity=filename:basename(FileToOpen),
+ input_type=file}),
file:close(FD),
EntityState#xmerl_sax_parser_state.event_state
end;
@@ -1682,8 +1694,9 @@ handle_external_entity({http, Url}, State) ->
{?STRING_EMPTY, EntityState} =
parse_external_entity_1(<<>>,
State#xmerl_sax_parser_state{continuation_state=FD,
- current_location=filename:dirname(Url),
- entity=filename:basename(Url)}),
+ current_location=filename:dirname(Url),
+ entity=filename:basename(Url),
+ input_type=file}),
file:close(FD),
file:delete(TmpFile),
EntityState#xmerl_sax_parser_state.event_state
@@ -1899,9 +1912,9 @@ parse_doctype_decl(?STRING_REST("<?", Rest), State) ->
case parse_pi(Rest, State) of
{Rest1, State1} ->
parse_doctype_decl(Rest1, State1);
- {endDocument, Rest1, State1} ->
+ {endDocument, _Rest1, State1} ->
IValue = ?TO_INPUT_FORMAT("<?"),
- {?APPEND_STRING(IValue, Rest1), State1}
+ {?APPEND_STRING(IValue, Rest), State1}
end;
parse_doctype_decl(?STRING_REST("%", Rest), State) ->
{Ref, Rest1, State1} = parse_pe_reference(Rest, State),