@@ -52,6 +52,8 @@ type session struct {
5252 sentReset bool
5353 stopOnce sync.Once
5454
55+ isResendRequestActive bool
56+
5557 targetDefaultApplVerID string
5658
5759 admin chan interface {}
@@ -295,6 +297,10 @@ func (s *session) notifyMessageOut() {
295297
296298// send will validate, persist, queue the message. If the session is logged on, send all messages in the queue.
297299func (s * session ) send (msg * Message ) error {
300+ if err := s .isResendRequestBlocking (msg ); err != nil {
301+ return err
302+ }
303+
298304 return s .sendInReplyTo (msg , nil )
299305}
300306func (s * session ) sendInReplyTo (msg * Message , inReplyTo * Message ) error {
@@ -316,6 +322,20 @@ func (s *session) sendInReplyTo(msg *Message, inReplyTo *Message) error {
316322 return nil
317323}
318324
325+ func (s * session ) isResendRequestBlocking (msg * Message ) error {
326+ msgType , err := msg .Header .GetBytes (tagMsgType )
327+ if err != nil {
328+ return err
329+ }
330+
331+ if s .isResendRequestActive && ! bytes .Equal (msgType , msgTypeResendRequest ) {
332+ s .log .OnEvent ("Message blocked: resend request in progress" )
333+ return errors .New ("cannot send message while resend request is active" )
334+ }
335+
336+ return nil
337+ }
338+
319339// dropAndReset will drop the send queue and reset the message store.
320340func (s * session ) dropAndReset () error {
321341 s .sendMutex .Lock ()
@@ -443,12 +463,12 @@ func (s *session) sendBytes(msg []byte, blockUntilSent bool) bool {
443463 }
444464}
445465
446- func (s * session ) doTargetTooHigh (reject targetTooHigh ) (nextState resendState , err error ) {
466+ func (s * session ) doTargetTooHigh (reject targetTooHigh , isReject bool ) (nextState resendState , err error ) {
447467 s .log .OnEventf ("MsgSeqNum too high, expecting %v but received %v" , reject .ExpectedTarget , reject .ReceivedTarget )
448- return s .sendResendRequest (reject .ExpectedTarget , reject .ReceivedTarget - 1 )
468+ return s .sendResendRequest (reject .ExpectedTarget , reject .ReceivedTarget - 1 , isReject )
449469}
450470
451- func (s * session ) sendResendRequest (beginSeq , endSeq int ) (nextState resendState , err error ) {
471+ func (s * session ) sendResendRequest (beginSeq , endSeq int , isReject bool ) (nextState resendState , err error ) {
452472 nextState .resendRangeEnd = endSeq
453473
454474 resend := NewMessage ()
@@ -477,6 +497,9 @@ func (s *session) sendResendRequest(beginSeq, endSeq int) (nextState resendState
477497 return
478498 }
479499 s .log .OnEventf ("Sent ResendRequest FROM: %v TO: %v" , beginSeq , endSeqNo )
500+ if ! isReject {
501+ s .isResendRequestActive = true
502+ }
480503
481504 return
482505}
0 commit comments