Skip to content

Commit

Permalink
Merge pull request quickfixgo#499 from lkcole/cme-drop-copy
Browse files Browse the repository at this point in the history
Cme drop copy
  • Loading branch information
ackleymi authored Jan 31, 2023
2 parents 8a2144a + 1ce30eb commit cf9b4c0
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 4 deletions.
31 changes: 29 additions & 2 deletions message.go
Original file line number Diff line number Diff line change
Expand Up @@ -205,14 +205,24 @@ func ParseMessageWithDataDictionary(
return
}

//prevTag := tagMsgType
xmlDataLen := 0
xmlDataMsg := false

msg.Header.add(msg.fields[fieldIndex : fieldIndex+1])
fieldIndex++

trailerBytes := []byte{}
foundBody := false
for {
parsedFieldBytes = &msg.fields[fieldIndex]
rawBytes, err = extractField(parsedFieldBytes, rawBytes)
if xmlDataLen > 0 {
rawBytes, err = extractXMLDataField(parsedFieldBytes, rawBytes, xmlDataLen)
xmlDataLen = 0
xmlDataMsg = true
} else {
rawBytes, err = extractField(parsedFieldBytes, rawBytes)
}
if err != nil {
return
}
Expand All @@ -235,6 +245,10 @@ func ParseMessageWithDataDictionary(
msg.bodyBytes = rawBytes
}

//prevTag = parsedFieldBytes.tag
if parsedFieldBytes.tag == tagXMLDataLen {
xmlDataLen, _ = msg.Header.GetInt(tagXMLDataLen)
}
fieldIndex++
}

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

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

func extractXMLDataField(parsedFieldBytes *TagValue, buffer []byte, dataLen int) (remBytes []byte, err error) {
endIndex := bytes.IndexByte(buffer, '=')
if endIndex == -1 {
err = parseError{OrigError: "extractField: No Trailing Delim in " + string(buffer)}
remBytes = buffer
return
}
endIndex += dataLen + 1

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

func extractField(parsedFieldBytes *TagValue, buffer []byte) (remBytes []byte, err error) {
endIndex := bytes.IndexByte(buffer, '\001')
if endIndex == -1 {
Expand Down
14 changes: 12 additions & 2 deletions message_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,9 @@ import (
func BenchmarkParseMessage(b *testing.B) {
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")

var msg Message
msg := NewMessage()
for i := 0; i < b.N; i++ {
_ = ParseMessage(&msg, rawMsg)
_ = ParseMessage(msg, rawMsg)
}
}

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

func TestXMLNonFIX(t *testing.T) {
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\"")
msg := NewMessage()
_ = ParseMessage(msg, rawMsg)

if !msg.Header.Has(tagXMLData) {
t.Error("Expected xmldata tag")
}
}

func (s *MessageSuite) TestParseMessageEmpty() {
rawMsg := bytes.NewBufferString("")

Expand Down

0 comments on commit cf9b4c0

Please sign in to comment.