@@ -9,6 +9,7 @@ enum StanzaState {
9
9
StanzaFirstChar ,
10
10
InsideTagFirstChar ,
11
11
InsideTag ,
12
+ InsideAttribute ( u8 ) ,
12
13
BetweenTags ,
13
14
ExclamationTag ( usize ) ,
14
15
InsideCDATA ,
@@ -71,18 +72,18 @@ impl StanzaFilter {
71
72
}
72
73
StanzaFirstChar => match b {
73
74
b'/' => self . state = EndStream ,
74
- b'!' => bail ! ( "illegal stanza: {}" , to_str( & self . buf[ ..( self . cnt + 1 ) ] ) ) ,
75
+ b'!' | b'>' | b'\'' | b'"' => bail ! ( "illegal stanza: {}" , to_str( & self . buf[ ..( self . cnt + 1 ) ] ) ) ,
75
76
b'?' => self . state = QuestionTag ( self . cnt + 4 ) , // 4 is length of b"xml "
76
77
_ => self . state = InsideTag ,
77
78
} ,
78
79
InsideTagFirstChar => match b {
79
80
b'/' => self . tag_cnt -= 2 ,
80
81
b'!' => self . state = ExclamationTag ( self . cnt + 7 ) , // 7 is length of b"[CDATA["
81
- b'?' => bail ! ( "illegal stanza: {}" , to_str( & self . buf[ ..( self . cnt + 1 ) ] ) ) ,
82
+ b'?' | b'>' | b'\'' | b'"' => bail ! ( "illegal stanza: {}" , to_str( & self . buf[ ..( self . cnt + 1 ) ] ) ) ,
82
83
_ => self . state = InsideTag ,
83
84
} ,
84
- InsideTag => {
85
- if b == b '>' {
85
+ InsideTag => match b {
86
+ b '>' => {
86
87
if self . buf [ self . cnt - 1 ] == b'/' {
87
88
// state can't be InsideTag unless we are on at least the second character, so can't go out of range
88
89
// self-closing tag
@@ -97,6 +98,13 @@ impl StanzaFilter {
97
98
}
98
99
self . state = BetweenTags ;
99
100
}
101
+ b'\'' | b'"' => self . state = InsideAttribute ( b) ,
102
+ _ => { }
103
+ } ,
104
+ InsideAttribute ( end) => {
105
+ if b == end {
106
+ self . state = InsideTag ;
107
+ }
100
108
}
101
109
QuestionTag ( idx) => {
102
110
if idx == self . cnt {
@@ -206,13 +214,19 @@ mod tests {
206
214
async fn process_next_byte ( ) -> std:: result:: Result < ( ) , anyhow:: Error > {
207
215
let mut filter = StanzaFilter :: new ( 262_144 ) ;
208
216
217
+ //todo: <x a='/>'>This is going to be fun.</x>
209
218
assert_eq ! (
210
219
StanzaReader ( Cursor :: new(
211
220
br###"
212
221
<?xml version='1.0'?>
213
222
<stream:stream xmlns='jabber:server' xmlns:stream='http://etherx.jabber.org/streams' xmlns:db='jabber:server:dialback' version='1.0' to='example.org' from='example.com' xml:lang='en'>
214
223
<a/><b>inside b before c<c>inside c</c></b></stream:stream>
215
224
<q>bla<![CDATA[<this>is</not><xml/>]]>bloo</q>
225
+ <x><![CDATA[ lol</x> ]]></x>
226
+ <z><x><![CDATA[ lol</x> ]]></x></z>
227
+ <a a='![CDATA['/>
228
+ <x a='/>'>This is going to be fun.</x>
229
+ <z><x a='/>'>This is going to be fun.</x></y>
216
230
<d></d><e><![CDATA[what]>]]]]></e></stream:stream>
217
231
"### ,
218
232
) )
@@ -225,6 +239,11 @@ mod tests {
225
239
"<b>inside b before c<c>inside c</c></b>" ,
226
240
"</stream:stream>" ,
227
241
"<q>bla<![CDATA[<this>is</not><xml/>]]>bloo</q>" ,
242
+ "<x><![CDATA[ lol</x> ]]></x>" ,
243
+ "<z><x><![CDATA[ lol</x> ]]></x></z>" ,
244
+ "<a a='![CDATA['/>" ,
245
+ "<x a='/>'>This is going to be fun.</x>" ,
246
+ "<z><x a='/>'>This is going to be fun.</x></y>" ,
228
247
"<d></d>" ,
229
248
"<e><![CDATA[what]>]]]]></e>" ,
230
249
"</stream:stream>" ,
0 commit comments