Skip to content

Commit 1ce30eb

Browse files
Lordackleymi
authored andcommitted
Properly process CME XMLData for 35=n
1 parent f26aaad commit 1ce30eb

File tree

2 files changed

+27
-21
lines changed

2 files changed

+27
-21
lines changed

message.go

Lines changed: 15 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,9 @@ func ParseMessageWithDataDictionary(
190190
return
191191
}
192192

193-
prevTag := tagMsgType
193+
//prevTag := tagMsgType
194+
xmlDataLen := 0
195+
xmlDataMsg := false
194196

195197
msg.Header.add(msg.fields[fieldIndex : fieldIndex+1])
196198
fieldIndex++
@@ -199,8 +201,10 @@ func ParseMessageWithDataDictionary(
199201
foundBody := false
200202
for {
201203
parsedFieldBytes = &msg.fields[fieldIndex]
202-
if prevTag == tagXMLDataLen {
203-
rawBytes, err = extractXMLDataField(parsedFieldBytes, rawBytes)
204+
if xmlDataLen > 0 {
205+
rawBytes, err = extractXMLDataField(parsedFieldBytes, rawBytes, xmlDataLen)
206+
xmlDataLen = 0
207+
xmlDataMsg = true
204208
} else {
205209
rawBytes, err = extractField(parsedFieldBytes, rawBytes)
206210
}
@@ -226,7 +230,10 @@ func ParseMessageWithDataDictionary(
226230
msg.bodyBytes = rawBytes
227231
}
228232

229-
prevTag = parsedFieldBytes.tag
233+
//prevTag = parsedFieldBytes.tag
234+
if parsedFieldBytes.tag == tagXMLDataLen {
235+
xmlDataLen, _ = msg.Header.GetInt(tagXMLDataLen)
236+
}
230237
fieldIndex++
231238
}
232239

@@ -247,7 +254,7 @@ func ParseMessageWithDataDictionary(
247254
bodyLength, err := msg.Header.GetInt(tagBodyLength)
248255
if err != nil {
249256
err = parseError{OrigError: err.Error()}
250-
} else if length != bodyLength {
257+
} else if length != bodyLength && !xmlDataMsg {
251258
err = parseError{OrigError: fmt.Sprintf("Incorrect Message Length, expected %d, got %d", bodyLength, length)}
252259
}
253260

@@ -345,25 +352,14 @@ func extractSpecificField(field *TagValue, expectedTag Tag, buffer []byte) (remB
345352
return
346353
}
347354

348-
func extractXMLDataField(parsedFieldBytes *TagValue, buffer []byte) (remBytes []byte, err error) {
349-
endIndex := bytes.IndexByte(buffer, '>')
350-
if endIndex == -1 {
351-
err = parseError{OrigError: "extractField: No Trailing Delim in " + string(buffer)}
352-
remBytes = buffer
353-
return
354-
}
355-
356-
endIndex = bytes.IndexByte(buffer[endIndex+1:], '>')
355+
func extractXMLDataField(parsedFieldBytes *TagValue, buffer []byte, dataLen int) (remBytes []byte, err error) {
356+
endIndex := bytes.IndexByte(buffer, '=')
357357
if endIndex == -1 {
358358
err = parseError{OrigError: "extractField: No Trailing Delim in " + string(buffer)}
359359
remBytes = buffer
360360
return
361361
}
362-
363-
tempEndIndex := bytes.IndexByte(buffer[endIndex:], '\001')
364-
endIndex += tempEndIndex
365-
tempEndIndex = bytes.IndexByte(buffer[endIndex+1:], '\001')
366-
endIndex += tempEndIndex + 1
362+
endIndex += dataLen + 1
367363

368364
err = parsedFieldBytes.parse(buffer[:endIndex+1])
369365
return buffer[(endIndex + 1):], err

message_test.go

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ import (
1313
func BenchmarkParseMessage(b *testing.B) {
1414
rawMsg := bytes.NewBufferString("8=FIX.4.29=10435=D34=249=TW52=20140515-19:49:56.65956=ISLD11=10021=140=154=155=TSLA60=00010101-00:00:00.00010=039")
1515

16-
var msg Message
16+
msg := NewMessage()
1717
for i := 0; i < b.N; i++ {
18-
_ = ParseMessage(&msg, rawMsg)
18+
_ = ParseMessage(msg, rawMsg)
1919
}
2020
}
2121

@@ -32,6 +32,16 @@ func (s *MessageSuite) SetupTest() {
3232
s.msg = NewMessage()
3333
}
3434

35+
func TestXMLNonFIX(t *testing.T) {
36+
rawMsg := bytes.NewBufferString("8=FIX.4.29=37235=n34=25512369=148152=20200522-07:05:33.75649=CME50=G56=OAEAAAN57=TRADE_CAPTURE143=US,IL212=261213=<RTRF>8=FIX.4.29=22535=BZ34=6549369=651852=20200522-07:05:33.74649=CME50=G56=9Q5000N57=DUMMY143=US,IL11=ACP159013113373460=20200522-07:05:33.734533=0893=Y1028=Y1300=991369=99612:325081373=31374=91375=15979=159013113373461769710=167</RTRF>10=245\"")
37+
msg := NewMessage()
38+
_ = ParseMessage(msg, rawMsg)
39+
40+
if !msg.Header.Has(tagXMLData) {
41+
t.Error("Expected xmldata tag")
42+
}
43+
}
44+
3545
func (s *MessageSuite) TestParseMessageEmpty() {
3646
rawMsg := bytes.NewBufferString("")
3747

0 commit comments

Comments
 (0)