Skip to content

Commit 253060f

Browse files
committed
initiate loggout for all logged on states
1 parent 8bb1291 commit 253060f

File tree

2 files changed

+34
-35
lines changed

2 files changed

+34
-35
lines changed

in_session.go

Lines changed: 13 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ func (state inSession) FixMsgIn(session *session, msg Message) (nextState sessio
4343
case enum.MsgType_LOGOUT:
4444
session.log.OnEvent("Received logout request")
4545
session.log.OnEvent("Sending logout response")
46-
state.generateLogout(session)
46+
session.sendLogout("")
4747
return latentState{}
4848
case enum.MsgType_TEST_REQUEST:
4949
return state.handleTestRequest(session, msg)
@@ -63,7 +63,8 @@ func (state inSession) FixMsgInRej(session *session, msg Message, rej MessageRej
6363
if err := msg.Header.GetField(tagMsgType, &msgType); err == nil {
6464
switch string(msgType) {
6565
case enum.MsgType_LOGON:
66-
return state.initiateLogout(session, "")
66+
session.initiateLogout("")
67+
return logoutState{}
6768
case enum.MsgType_LOGOUT:
6869
return latentState{}
6970
}
@@ -199,13 +200,15 @@ func (state inSession) processReject(session *session, msg Message, rej MessageR
199200
case targetTooLow:
200201
return state.doTargetTooLow(session, msg, TypedError)
201202
case incorrectBeginString:
202-
return state.initiateLogout(session, rej.Error())
203+
session.initiateLogout(rej.Error())
204+
return logoutState{}
203205
}
204206

205207
switch rej.RejectReason() {
206208
case rejectReasonCompIDProblem, rejectReasonSendingTimeAccuracyProblem:
207209
session.doReject(msg, rej)
208-
return state.initiateLogout(session, "")
210+
session.initiateLogout("")
211+
return logoutState{}
209212
default:
210213
session.doReject(msg, rej)
211214
session.store.IncrNextTargetMsgSeqNum()
@@ -228,28 +231,23 @@ func (state inSession) doTargetTooLow(session *session, msg Message, rej targetT
228231

229232
if sendingTime.Before(origSendingTime.Time) {
230233
session.doReject(msg, sendingTimeAccuracyProblem())
231-
return state.initiateLogout(session, "")
234+
session.initiateLogout("")
235+
return logoutState{}
232236
}
233237

234238
if appReject := session.fromCallback(msg); appReject != nil {
235239
session.doReject(msg, appReject)
236-
return state.initiateLogout(session, "")
240+
session.initiateLogout("")
241+
return logoutState{}
237242
}
238243
} else {
239-
return state.initiateLogout(session, rej.Error())
244+
session.initiateLogout(rej.Error())
245+
return logoutState{}
240246
}
241247

242248
return state
243249
}
244250

245-
func (state *inSession) initiateLogout(session *session, reason string) (nextState logoutState) {
246-
session.log.OnEvent("Inititated logout request")
247-
state.generateLogoutWithReason(session, reason)
248-
time.AfterFunc(time.Duration(2)*time.Second, func() { session.sessionEvent <- logoutTimeout })
249-
250-
return
251-
}
252-
253251
func (state *inSession) generateSequenceReset(session *session, beginSeqNo int, endSeqNo int) {
254252
sequenceReset := NewMessage()
255253
session.fillDefaultHeader(sequenceReset)
@@ -269,21 +267,3 @@ func (state *inSession) generateSequenceReset(session *session, beginSeqNo int,
269267
msgBytes, _ := sequenceReset.Build()
270268
session.sendBytes(msgBytes)
271269
}
272-
273-
func (state *inSession) generateLogout(session *session) {
274-
state.generateLogoutWithReason(session, "")
275-
}
276-
277-
func (state *inSession) generateLogoutWithReason(session *session, reason string) {
278-
logout := NewMessage()
279-
logout.Header.SetField(tagMsgType, FIXString("5"))
280-
logout.Header.SetField(tagBeginString, FIXString(session.sessionID.BeginString))
281-
logout.Header.SetField(tagTargetCompID, FIXString(session.sessionID.TargetCompID))
282-
logout.Header.SetField(tagSenderCompID, FIXString(session.sessionID.SenderCompID))
283-
284-
if reason != "" {
285-
logout.Body.SetField(tagText, FIXString(reason))
286-
}
287-
288-
session.send(logout)
289-
}

session.go

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,18 @@ func (s *session) fillDefaultHeader(msg Message) {
172172
s.insertSendingTime(msg.Header)
173173
}
174174

175+
func (s *session) sendLogout(reason string) {
176+
logout := NewMessage()
177+
logout.Header.SetField(tagMsgType, FIXString("5"))
178+
logout.Header.SetField(tagBeginString, FIXString(s.sessionID.BeginString))
179+
logout.Header.SetField(tagTargetCompID, FIXString(s.sessionID.TargetCompID))
180+
logout.Header.SetField(tagSenderCompID, FIXString(s.sessionID.SenderCompID))
181+
if reason != "" {
182+
logout.Body.SetField(tagText, FIXString(reason))
183+
}
184+
s.send(logout)
185+
}
186+
175187
func (s *session) resend(msg Message) {
176188
msg.Header.SetField(tagPossDupFlag, FIXBoolean(true))
177189

@@ -310,6 +322,12 @@ func (s *session) handleLogon(msg Message) error {
310322
return nil
311323
}
312324

325+
func (s *session) initiateLogout(reason string) {
326+
s.log.OnEvent("Inititated logout request")
327+
s.sendLogout(reason)
328+
time.AfterFunc(time.Duration(2)*time.Second, func() { s.sessionEvent <- logoutTimeout })
329+
}
330+
313331
func (s *session) verify(msg Message) MessageRejectError {
314332
return s.verifySelect(msg, true, true)
315333
}
@@ -595,8 +613,9 @@ func (s *session) run(msgIn chan fixIn, msgOut chan []byte, quit chan bool) {
595613
}
596614
case <-quit:
597615
quit = nil // prevent infinitly receiving on a closed channel
598-
if state, ok := s.sessionState.(inSession); ok {
599-
s.sessionState = state.initiateLogout(s, "")
616+
if s.IsLoggedOn() {
617+
s.initiateLogout("")
618+
s.sessionState = logoutState{}
600619
} else {
601620
return
602621
}

0 commit comments

Comments
 (0)