@@ -12,75 +12,46 @@ type inSession struct {
1212func (state inSession ) String () string { return "In Session" }
1313func (state inSession ) IsLoggedOn () bool { return true }
1414
15- func (state inSession ) VerifyMsgIn (session * session , msg Message ) ( err MessageRejectError ) {
15+ func (state inSession ) FixMsgIn (session * session , msg Message ) sessionState {
1616 var msgType FIXString
17- if err := msg .Header .GetField (tagMsgType , & msgType ); err == nil {
18- switch string (msgType ) {
19- case enum .MsgType_LOGON :
20- return session .verifyLogon (msg )
21- case enum .MsgType_LOGOUT :
22- return nil
23- case enum .MsgType_RESEND_REQUEST :
24- return session .verifyIgnoreSeqNumTooHighOrLow (msg )
25- case enum .MsgType_SEQUENCE_RESET :
26- var gapFillFlag FIXBoolean
27- msg .Body .GetField (tagGapFillFlag , & gapFillFlag )
28- return session .verifySelect (msg , bool (gapFillFlag ), bool (gapFillFlag ))
29- default :
30- return session .verify (msg )
31- }
17+ if err := msg .Header .GetField (tagMsgType , & msgType ); err != nil {
18+ return session .handleError (err )
3219 }
33- return nil
34- }
35-
36- func (state inSession ) FixMsgIn (session * session , msg Message ) (nextState sessionState ) {
37- nextState = state
3820
39- var msgType FIXString
40- if err := msg .Header .GetField (tagMsgType , & msgType ); err == nil {
41- switch string (msgType ) {
42- case enum .MsgType_LOGON :
43- if err := session .handleLogon (msg ); err != nil {
21+ switch string (msgType ) {
22+ case enum .MsgType_LOGON :
23+ if err := session .handleLogon (msg ); err != nil {
24+ if err := session .initiateLogout ("" ); err != nil {
4425 return session .handleError (err )
4526 }
27+ return logoutState {}
28+ }
4629
47- return
48- case enum .MsgType_LOGOUT :
49- session .log .OnEvent ("Received logout request" )
50- session .log .OnEvent ("Sending logout response" )
51- if err := session .sendLogout ("" ); err != nil {
52- return session .handleError (err )
53- }
54- nextState = latentState {}
55- case enum .MsgType_TEST_REQUEST :
56- return state .handleTestRequest (session , msg )
57- case enum .MsgType_RESEND_REQUEST :
58- return state .handleResendRequest (session , msg )
59- case enum .MsgType_SEQUENCE_RESET :
60- return state .handleSequenceReset (session , msg )
30+ return state
31+ case enum .MsgType_LOGOUT :
32+ session .log .OnEvent ("Received logout request" )
33+ session .log .OnEvent ("Sending logout response" )
34+ if err := session .sendLogout ("" ); err != nil {
35+ session .logError (err )
36+ }
37+ return latentState {}
38+ case enum .MsgType_RESEND_REQUEST :
39+ return state .handleResendRequest (session , msg )
40+ case enum .MsgType_SEQUENCE_RESET :
41+ return state .handleSequenceReset (session , msg )
42+ case enum .MsgType_TEST_REQUEST :
43+ return state .handleTestRequest (session , msg )
44+ default :
45+ if err := session .verify (msg ); err != nil {
46+ return state .processReject (session , msg , err )
6147 }
6248 }
6349
6450 if err := session .store .IncrNextTargetMsgSeqNum (); err != nil {
6551 return session .handleError (err )
6652 }
67- return
68- }
6953
70- func (state inSession ) FixMsgInRej (session * session , msg Message , rej MessageRejectError ) (nextState sessionState ) {
71- var msgType FIXString
72- if err := msg .Header .GetField (tagMsgType , & msgType ); err == nil {
73- switch string (msgType ) {
74- case enum .MsgType_LOGON :
75- if err := session .initiateLogout ("" ); err != nil {
76- return session .handleError (err )
77- }
78- return logoutState {}
79- case enum .MsgType_LOGOUT :
80- return latentState {}
81- }
82- }
83- return state .processReject (session , msg , rej )
54+ return state
8455}
8556
8657func (state inSession ) Timeout (session * session , event event ) (nextState sessionState ) {
@@ -106,6 +77,9 @@ func (state inSession) Timeout(session *session, event event) (nextState session
10677}
10778
10879func (state inSession ) handleTestRequest (session * session , msg Message ) (nextState sessionState ) {
80+ if err := session .verify (msg ); err != nil {
81+ return state .processReject (session , msg , err )
82+ }
10983 var testReq FIXString
11084 if err := msg .Body .GetField (tagTestReqID , & testReq ); err != nil {
11185 session .log .OnEvent ("Test Request with no testRequestID" )
@@ -125,6 +99,17 @@ func (state inSession) handleTestRequest(session *session, msg Message) (nextSta
12599}
126100
127101func (state inSession ) handleSequenceReset (session * session , msg Message ) (nextState sessionState ) {
102+ var gapFillFlag FIXBoolean
103+ if msg .Body .Has (tagGapFillFlag ) {
104+ if err := msg .Body .GetField (tagGapFillFlag , & gapFillFlag ); err != nil {
105+ return state .processReject (session , msg , err )
106+ }
107+ }
108+
109+ if err := session .verifySelect (msg , bool (gapFillFlag ), bool (gapFillFlag )); err != nil {
110+ return state .processReject (session , msg , err )
111+ }
112+
128113 var newSeqNo FIXInt
129114 if err := msg .Body .GetField (tagNewSeqNo , & newSeqNo ); err == nil {
130115 expectedSeqNum := FIXInt (session .store .NextTargetMsgSeqNum ())
@@ -146,6 +131,10 @@ func (state inSession) handleSequenceReset(session *session, msg Message) (nextS
146131}
147132
148133func (state inSession ) handleResendRequest (session * session , msg Message ) (nextState sessionState ) {
134+ if err := session .verifyIgnoreSeqNumTooHighOrLow (msg ); err != nil {
135+ return state .processReject (session , msg , err )
136+ }
137+
149138 var err error
150139 var beginSeqNoField FIXInt
151140 if err = msg .Body .GetField (tagBeginSeqNo , & beginSeqNoField ); err != nil {
@@ -287,7 +276,9 @@ func (state inSession) doTargetTooLow(session *session, msg Message, rej targetT
287276 }
288277
289278 sendingTime := new (FIXUTCTimestamp )
290- msg .Header .GetField (tagSendingTime , sendingTime )
279+ if err = msg .Header .GetField (tagSendingTime , sendingTime ); err != nil {
280+ return state .processReject (session , msg , err )
281+ }
291282
292283 if sendingTime .Before (origSendingTime .Time ) {
293284 if err := session .doReject (msg , sendingTimeAccuracyProblem ()); err != nil {
0 commit comments