Skip to content

Commit 1e2b808

Browse files
author
Chris Busbey
committed
refactoring of session code
1 parent 1e65673 commit 1e2b808

File tree

8 files changed

+133
-200
lines changed

8 files changed

+133
-200
lines changed

in_session.go

Lines changed: 48 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -12,75 +12,46 @@ type inSession struct {
1212
func (state inSession) String() string { return "In Session" }
1313
func (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

8657
func (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

10879
func (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

127101
func (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

148133
func (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 {

latent_state.go

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,11 @@ type latentState struct{}
55
func (state latentState) String() string { return "Latent State" }
66
func (state latentState) IsLoggedOn() bool { return false }
77

8-
func (state latentState) VerifyMsgIn(session *session, msg Message) MessageRejectError {
9-
return InvalidMessageType()
10-
}
11-
128
func (state latentState) FixMsgIn(session *session, msg Message) (nextState sessionState) {
139
session.log.OnEventf("Invalid Session State: Unexpected Msg %v while in Latent state", msg)
1410
return state
1511
}
1612

17-
func (state latentState) FixMsgInRej(session *session, msg Message, err MessageRejectError) (nextState sessionState) {
18-
return state.FixMsgIn(session, msg)
19-
}
20-
2113
func (state latentState) Timeout(*session, event) (nextState sessionState) {
2214
return state
2315
}

logon_state.go

Lines changed: 8 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4,40 +4,25 @@ import "github.com/quickfixgo/quickfix/enum"
44

55
type logonState struct{}
66

7-
func (state logonState) String() string { return "Logon State" }
8-
func (s logonState) IsLoggedOn() bool { return false }
9-
10-
func (s logonState) VerifyMsgIn(session *session, msg Message) MessageRejectError {
7+
func (s logonState) String() string { return "Logon State" }
8+
func (s logonState) IsLoggedOn() bool { return false }
9+
func (s logonState) FixMsgIn(session *session, msg Message) (nextState sessionState) {
1110
var msgType FIXString
1211
if err := msg.Header.GetField(tagMsgType, &msgType); err != nil {
13-
return RequiredTagMissing(tagMsgType)
12+
return session.handleError(err)
1413
}
1514

16-
switch string(msgType) {
17-
case enum.MsgType_LOGON:
18-
err := session.verifyLogon(msg)
19-
if err != nil {
20-
session.log.OnEvent(err.Error())
21-
}
22-
return err
23-
default:
24-
session.log.OnEventf("Invalid Session State: Received Msg %v while waiting for Logon", msg)
25-
return InvalidMessageType()
15+
if string(msgType) != enum.MsgType_LOGON {
16+
session.log.OnEventf("Invalid Session State: Received Msg %s while waiting for Logon", msg)
17+
return latentState{}
2618
}
27-
}
2819

29-
func (s logonState) FixMsgIn(session *session, msg Message) (nextState sessionState) {
3020
if err := session.handleLogon(msg); err != nil {
31-
session.log.OnEvent(err.Error())
32-
return latentState{}
21+
return session.handleError(err)
3322
}
3423
return inSession{}
3524
}
3625

37-
func (s logonState) FixMsgInRej(session *session, msg Message, err MessageRejectError) sessionState {
38-
return latentState{}
39-
}
40-
4126
func (s logonState) Timeout(session *session, e event) (nextState sessionState) {
4227
if e == logonTimeout {
4328
session.log.OnEvent("Timed out waiting for logon response")

logout_state.go

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,8 @@ import "github.com/quickfixgo/quickfix/enum"
44

55
type logoutState struct{}
66

7-
func (state logoutState) String() string { return "Logout State" }
8-
func (s logoutState) IsLoggedOn() bool { return false }
9-
10-
func (state logoutState) VerifyMsgIn(session *session, msg Message) MessageRejectError { return nil }
7+
func (state logoutState) String() string { return "Logout State" }
8+
func (state logoutState) IsLoggedOn() bool { return false }
119

1210
func (state logoutState) FixMsgIn(session *session, msg Message) (nextState sessionState) {
1311
var msgType FIXString
@@ -25,10 +23,6 @@ func (state logoutState) FixMsgIn(session *session, msg Message) (nextState sess
2523
}
2624
}
2725

28-
func (state logoutState) FixMsgInRej(session *session, msg Message, err MessageRejectError) sessionState {
29-
return state.FixMsgIn(session, msg)
30-
}
31-
3226
func (state logoutState) Timeout(session *session, event event) (nextState sessionState) {
3327
switch event {
3428
case logoutTimeout:

resend_state.go

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -20,29 +20,18 @@ func (s resendState) Timeout(session *session, event event) (nextState sessionSt
2020
return
2121
}
2222

23-
func (s resendState) VerifyMsgIn(session *session, msg Message) (err MessageRejectError) {
24-
return inSession{}.VerifyMsgIn(session, msg)
25-
}
26-
2723
func (s resendState) FixMsgIn(session *session, msg Message) (nextState sessionState) {
28-
session.log.OnEventf("Got FIXMsgIn in resend %s", msg.rawMessage)
29-
return s.handleNextState(session, inSession{}.FixMsgIn(session, msg))
30-
}
24+
nextState = inSession{}.FixMsgIn(session, msg)
3125

32-
func (s resendState) FixMsgInRej(session *session, msg Message, rej MessageRejectError) (nextState sessionState) {
33-
return s.handleNextState(session, inSession{}.FixMsgInRej(session, msg, rej))
34-
}
35-
36-
func (s resendState) handleNextState(session *session, nextState sessionState) sessionState {
3726
if !nextState.IsLoggedOn() || len(session.messageStash) == 0 {
38-
return nextState
27+
return
3928
}
4029

4130
targetSeqNum := session.store.NextTargetMsgSeqNum()
4231
if msg, ok := session.messageStash[targetSeqNum]; ok {
4332
delete(session.messageStash, targetSeqNum)
44-
session.resendIn <- msg
33+
nextState = nextState.FixMsgIn(session, msg)
4534
}
4635

47-
return s
36+
return
4837
}

0 commit comments

Comments
 (0)