@@ -12,37 +12,65 @@ 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 ) {
16+ 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+ }
32+ }
33+ return nil
34+ }
35+
1536func (state inSession ) FixMsgIn (session * session , msg Message ) (nextState sessionState ) {
1637 var msgType FIXString
1738 if err := msg .Header .GetField (tagMsgType , & msgType ); err == nil {
1839 switch string (msgType ) {
19- //logon
20- case "A" :
21- return state .handleLogon (session , msg )
22- //logout
23- case "5" :
24- return state .handleLogout (session , msg )
25- //test request
26- case "1" :
40+ case enum .MsgType_LOGON :
41+ session .handleLogon (msg )
42+ return state
43+ case enum .MsgType_LOGOUT :
44+ session .log .OnEvent ("Received logout request" )
45+ session .log .OnEvent ("Sending logout response" )
46+ state .generateLogout (session )
47+ return latentState {}
48+ case enum .MsgType_TEST_REQUEST :
2749 return state .handleTestRequest (session , msg )
28- //resend request
29- case "2" :
50+ case enum .MsgType_RESEND_REQUEST :
3051 return state .handleResendRequest (session , msg )
31- //sequence reset
32- case "4" :
52+ case enum .MsgType_SEQUENCE_RESET :
3353 return state .handleSequenceReset (session , msg )
34- default :
35- if err := session .verify (msg ); err != nil {
36- return state .processReject (session , msg , err )
37- }
3854 }
3955 }
4056
4157 session .store .IncrNextTargetMsgSeqNum ()
42-
4358 return state
4459}
4560
61+ func (state inSession ) FixMsgInRej (session * session , msg Message , rej MessageRejectError ) (nextState sessionState ) {
62+ var msgType FIXString
63+ if err := msg .Header .GetField (tagMsgType , & msgType ); err == nil {
64+ switch string (msgType ) {
65+ case enum .MsgType_LOGON :
66+ return state .initiateLogout (session , "" )
67+ case enum .MsgType_LOGOUT :
68+ return latentState {}
69+ }
70+ }
71+ return state .processReject (session , msg , rej )
72+ }
73+
4674func (state inSession ) Timeout (session * session , event event ) (nextState sessionState ) {
4775 switch event {
4876 case needHeartbeat :
@@ -60,30 +88,22 @@ func (state inSession) Timeout(session *session, event event) (nextState session
6088 return state
6189}
6290
63- func (state inSession ) handleLogon (session * session , msg Message ) (nextState sessionState ) {
64- if err := session .handleLogon (msg ); err != nil {
65- return state .initiateLogout (session , "" )
91+ func (state inSession ) handleTestRequest (session * session , msg Message ) (nextState sessionState ) {
92+ var testReq FIXString
93+ if err := msg .Body .GetField (tagTestReqID , & testReq ); err != nil {
94+ session .log .OnEvent ("Test Request with no testRequestID" )
95+ } else {
96+ heartBt := NewMessage ()
97+ heartBt .Header .SetField (tagMsgType , FIXString ("0" ))
98+ heartBt .Body .SetField (tagTestReqID , testReq )
99+ session .send (heartBt )
66100 }
67101
102+ session .store .IncrNextTargetMsgSeqNum ()
68103 return state
69104}
70105
71- func (state inSession ) handleLogout (session * session , msg Message ) (nextState sessionState ) {
72- session .log .OnEvent ("Received logout request" )
73- session .log .OnEvent ("Sending logout response" )
74-
75- state .generateLogout (session )
76- return latentState {}
77- }
78-
79106func (state inSession ) handleSequenceReset (session * session , msg Message ) (nextState sessionState ) {
80- var gapFillFlag FIXBoolean
81- msg .Body .GetField (tagGapFillFlag , & gapFillFlag )
82-
83- if err := session .verifySelect (msg , bool (gapFillFlag ), bool (gapFillFlag )); err != nil {
84- return state .processReject (session , msg , err )
85- }
86-
87107 var newSeqNo FIXInt
88108 if err := msg .Body .GetField (tagNewSeqNo , & newSeqNo ); err == nil {
89109 expectedSeqNum := FIXInt (session .store .NextTargetMsgSeqNum ())
@@ -97,15 +117,10 @@ func (state inSession) handleSequenceReset(session *session, msg Message) (nextS
97117 session .doReject (msg , valueIsIncorrectNoTag ())
98118 }
99119 }
100-
101120 return state
102121}
103122
104123func (state inSession ) handleResendRequest (session * session , msg Message ) (nextState sessionState ) {
105- if err := session .verifyIgnoreSeqNumTooHighOrLow (msg ); err != nil {
106- return state .processReject (session , msg , err )
107- }
108-
109124 var err error
110125 var beginSeqNoField FIXInt
111126 if err = msg .Body .GetField (tagBeginSeqNo , & beginSeqNoField ); err != nil {
@@ -167,26 +182,6 @@ func (state inSession) resendMessages(session *session, beginSeqNo, endSeqNo int
167182 }
168183}
169184
170- func (state inSession ) handleTestRequest (session * session , msg Message ) (nextState sessionState ) {
171- if err := session .verify (msg ); err != nil {
172- return state .processReject (session , msg , err )
173- }
174-
175- var testReq FIXString
176- if err := msg .Body .GetField (tagTestReqID , & testReq ); err != nil {
177- session .log .OnEvent ("Test Request with no testRequestID" )
178- } else {
179- heartBt := NewMessage ()
180- heartBt .Header .SetField (tagMsgType , FIXString ("0" ))
181- heartBt .Body .SetField (tagTestReqID , testReq )
182- session .send (heartBt )
183- }
184-
185- session .store .IncrNextTargetMsgSeqNum ()
186-
187- return state
188- }
189-
190185func (state inSession ) processReject (session * session , msg Message , rej MessageRejectError ) (nextState sessionState ) {
191186 switch TypedError := rej .(type ) {
192187 case targetTooHigh :
@@ -197,6 +192,7 @@ func (state inSession) processReject(session *session, msg Message, rej MessageR
197192 case resendState :
198193 //assumes target too high reject already sent
199194 }
195+
200196 session .messageStash [TypedError .ReceivedTarget ] = msg
201197 return resendState {}
202198
0 commit comments