Example #1
0
// MsgType returns MsgType (tag 35) field's value
func (m *Message) MsgType() (enum.MsgType, MessageRejectError) {
	s, err := m.Header.GetString(tagMsgType)
	if err != nil {
		return enum.MsgType(""), err
	}
	return enum.MsgType(s), nil
}
Example #2
0
func (s *session) prepMessageForSend(msg, inReplyTo *Message) error {
	s.fillDefaultHeader(*msg, inReplyTo)
	seqNum := s.store.NextSenderMsgSeqNum()
	msg.Header.SetField(tagMsgSeqNum, FIXInt(seqNum))

	var msgType FIXString
	if err := msg.Header.GetField(tagMsgType, &msgType); err != nil {
		return err
	}

	if isAdminMessageType(string(msgType)) {
		s.application.ToAdmin(*msg, s.sessionID)

		if enum.MsgType(msgType) == enum.MsgType_LOGON {
			var resetSeqNumFlag FIXBoolean
			if msg.Body.Has(tagResetSeqNumFlag) {
				if err := msg.Body.GetField(tagResetSeqNumFlag, &resetSeqNumFlag); err != nil {
					return err
				}
			}

			if resetSeqNumFlag.Bool() {
				if err := s.store.Reset(); err != nil {
					return err
				}

				s.sentReset = true
				seqNum = s.store.NextSenderMsgSeqNum()
				msg.Header.SetField(tagMsgSeqNum, FIXInt(seqNum))
			}

		}
	} else {
		if err := s.application.ToApp(*msg, s.sessionID); err != nil {
			return err
		}
	}

	msgBytes, err := msg.Build()
	if err == nil {
		err = s.persist(seqNum, msgBytes)
	}

	return err
}
Example #3
0
func (s logonState) FixMsgIn(session *session, msg Message) (nextState sessionState) {
	var msgType FIXString
	if err := msg.Header.GetField(tagMsgType, &msgType); err != nil {
		return handleStateError(session, err)
	}

	if enum.MsgType(msgType) != enum.MsgType_LOGON {
		session.log.OnEventf("Invalid Session State: Received Msg %s while waiting for Logon", msg)
		return latentState{}
	}

	if err := session.handleLogon(msg); err != nil {
		switch err := err.(type) {
		case RejectLogon:
			session.log.OnEvent(err.Text)
			logout := session.buildLogout(err.Text)

			if err := session.dropAndSendInReplyTo(logout, false, &msg); err != nil {
				session.logError(err)
			}

			if err := session.store.IncrNextTargetMsgSeqNum(); err != nil {
				session.logError(err)
			}

			return latentState{}

		case targetTooHigh:
			var tooHighErr error
			if nextState, tooHighErr = session.doTargetTooHigh(err); tooHighErr != nil {
				return handleStateError(session, tooHighErr)
			}

			return

		default:
			return handleStateError(session, err)
		}
	}
	return inSession{}
}
Example #4
0
func (state inSession) FixMsgIn(session *session, msg Message) sessionState {
	var msgType FIXString
	if err := msg.Header.GetField(tagMsgType, &msgType); err != nil {
		return handleStateError(session, err)
	}

	switch enum.MsgType(msgType) {
	case enum.MsgType_LOGON:
		if err := session.handleLogon(msg); err != nil {
			if err := session.initiateLogoutInReplyTo("", &msg); err != nil {
				return handleStateError(session, err)
			}
			return logoutState{}
		}

		return state
	case enum.MsgType_LOGOUT:
		return state.handleLogout(session, msg)
	case enum.MsgType_RESEND_REQUEST:
		return state.handleResendRequest(session, msg)
	case enum.MsgType_SEQUENCE_RESET:
		return state.handleSequenceReset(session, msg)
	case enum.MsgType_TEST_REQUEST:
		return state.handleTestRequest(session, msg)
	default:
		if err := session.verify(msg); err != nil {
			return state.processReject(session, msg, err)
		}
	}

	if err := session.store.IncrNextTargetMsgSeqNum(); err != nil {
		return handleStateError(session, err)
	}

	return state
}