mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
rexml: add close tag check on end of document to StreamParser
[ruby-core:81593] [Bug #13636] Reported by Anton Sivakov. Thanks!!! git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@59033 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
c2127d0a03
commit
d311921d31
2 changed files with 40 additions and 0 deletions
|
@ -7,6 +7,7 @@ module REXML
|
|||
def initialize source, listener
|
||||
@listener = listener
|
||||
@parser = BaseParser.new( source )
|
||||
@tag_stack = []
|
||||
end
|
||||
|
||||
def add_listener( listener )
|
||||
|
@ -19,14 +20,21 @@ module REXML
|
|||
event = @parser.pull
|
||||
case event[0]
|
||||
when :end_document
|
||||
unless @tag_stack.empty?
|
||||
tag_path = "/" + @tag_stack.join("/")
|
||||
raise ParseException.new("Missing end tag for '#{tag_path}'",
|
||||
@parser.source)
|
||||
end
|
||||
return
|
||||
when :start_element
|
||||
@tag_stack << event[1]
|
||||
attrs = event[2].each do |n, v|
|
||||
event[2][n] = @parser.unnormalize( v )
|
||||
end
|
||||
@listener.tag_start( event[1], attrs )
|
||||
when :end_element
|
||||
@listener.tag_end( event[1] )
|
||||
@tag_stack.pop
|
||||
when :text
|
||||
normalized = @parser.unnormalize( event[1] )
|
||||
@listener.text( normalized )
|
||||
|
|
32
test/rexml/parser/test_stream.rb
Normal file
32
test/rexml/parser/test_stream.rb
Normal file
|
@ -0,0 +1,32 @@
|
|||
require "test/unit"
|
||||
require "rexml/document"
|
||||
require "rexml/streamlistener"
|
||||
|
||||
module REXMLTests
|
||||
class TestStreamParser < Test::Unit::TestCase
|
||||
class NullListener
|
||||
include REXML::StreamListener
|
||||
end
|
||||
|
||||
class TestInvalid < self
|
||||
def test_no_end_tag
|
||||
xml = "<root><sub>"
|
||||
exception = assert_raise(REXML::ParseException) do
|
||||
parse(xml)
|
||||
end
|
||||
assert_equal(<<-MESSAGE, exception.to_s)
|
||||
Missing end tag for '/root/sub'
|
||||
Line: 1
|
||||
Position: #{xml.bytesize}
|
||||
Last 80 unconsumed characters:
|
||||
MESSAGE
|
||||
end
|
||||
|
||||
private
|
||||
def parse(xml, listener=nil)
|
||||
listener ||= NullListener.new
|
||||
REXML::Document.parse_stream(xml, listener)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue