Skip to content

Commit cf9b4c0

Browse files
authored
Merge pull request #499 from lkcole/cme-drop-copy
Cme drop copy
2 parents 8a2144a + 1ce30eb commit cf9b4c0

File tree

2 files changed

+41
-4
lines changed

2 files changed

+41
-4
lines changed

message.go

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -205,14 +205,24 @@ func ParseMessageWithDataDictionary(
205205
return
206206
}
207207

208+
//prevTag := tagMsgType
209+
xmlDataLen := 0
210+
xmlDataMsg := false
211+
208212
msg.Header.add(msg.fields[fieldIndex : fieldIndex+1])
209213
fieldIndex++
210214

211215
trailerBytes := []byte{}
212216
foundBody := false
213217
for {
214218
parsedFieldBytes = &msg.fields[fieldIndex]
215-
rawBytes, err = extractField(parsedFieldBytes, rawBytes)
219+
if xmlDataLen > 0 {
220+
rawBytes, err = extractXMLDataField(parsedFieldBytes, rawBytes, xmlDataLen)
221+
xmlDataLen = 0
222+
xmlDataMsg = true
223+
} else {
224+
rawBytes, err = extractField(parsedFieldBytes, rawBytes)
225+
}
216226
if err != nil {
217227
return
218228
}
@@ -235,6 +245,10 @@ func ParseMessageWithDataDictionary(
235245
msg.bodyBytes = rawBytes
236246
}
237247

248+
//prevTag = parsedFieldBytes.tag
249+
if parsedFieldBytes.tag == tagXMLDataLen {
250+
xmlDataLen, _ = msg.Header.GetInt(tagXMLDataLen)
251+
}
238252
fieldIndex++
239253
}
240254

@@ -255,7 +269,7 @@ func ParseMessageWithDataDictionary(
255269
bodyLength, err := msg.Header.GetInt(tagBodyLength)
256270
if err != nil {
257271
err = parseError{OrigError: err.Error()}
258-
} else if length != bodyLength {
272+
} else if length != bodyLength && !xmlDataMsg {
259273
err = parseError{OrigError: fmt.Sprintf("Incorrect Message Length, expected %d, got %d", bodyLength, length)}
260274
}
261275

@@ -353,6 +367,19 @@ func extractSpecificField(field *TagValue, expectedTag Tag, buffer []byte) (remB
353367
return
354368
}
355369

370+
func extractXMLDataField(parsedFieldBytes *TagValue, buffer []byte, dataLen int) (remBytes []byte, err error) {
371+
endIndex := bytes.IndexByte(buffer, '=')
372+
if endIndex == -1 {
373+
err = parseError{OrigError: "extractField: No Trailing Delim in " + string(buffer)}
374+
remBytes = buffer
375+
return
376+
}
377+
endIndex += dataLen + 1
378+
379+
err = parsedFieldBytes.parse(buffer[:endIndex+1])
380+
return buffer[(endIndex + 1):], err
381+
}
382+
356383
func extractField(parsedFieldBytes *TagValue, buffer []byte) (remBytes []byte, err error) {
357384
endIndex := bytes.IndexByte(buffer, '\001')
358385
if endIndex == -1 {

message_test.go

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@ import (
2828
func BenchmarkParseMessage(b *testing.B) {
2929
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")
3030

31-
var msg Message
31+
msg := NewMessage()
3232
for i := 0; i < b.N; i++ {
33-
_ = ParseMessage(&msg, rawMsg)
33+
_ = ParseMessage(msg, rawMsg)
3434
}
3535
}
3636

@@ -47,6 +47,16 @@ func (s *MessageSuite) SetupTest() {
4747
s.msg = NewMessage()
4848
}
4949

50+
func TestXMLNonFIX(t *testing.T) {
51+
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\"")
52+
msg := NewMessage()
53+
_ = ParseMessage(msg, rawMsg)
54+
55+
if !msg.Header.Has(tagXMLData) {
56+
t.Error("Expected xmldata tag")
57+
}
58+
}
59+
5060
func (s *MessageSuite) TestParseMessageEmpty() {
5161
rawMsg := bytes.NewBufferString("")
5262

0 commit comments

Comments
 (0)