From 440cf090d6cb5bd0c65cced777d4e1ca58c9526c Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Wed, 7 Nov 2018 12:46:20 +0100 Subject: [PATCH] notify remote peer to close session --- common/mux/client.go | 8 ++++++++ common/mux/server.go | 10 +++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/common/mux/client.go b/common/mux/client.go index 81aa3b5c..5cb58191 100644 --- a/common/mux/client.go +++ b/common/mux/client.go @@ -322,6 +322,10 @@ func (m *ClientWorker) handleStatusKeep(meta *FrameMetadata, reader *buf.Buffere s, found := m.sessionManager.Get(meta.SessionID) if !found { + // Notify remote peer to close this session. + closingWriter := NewResponseWriter(meta.SessionID, m.link.Writer, protocol.TransferTypeStream) + closingWriter.Close() + return buf.Copy(NewStreamReader(reader), buf.Discard) } @@ -330,6 +334,10 @@ func (m *ClientWorker) handleStatusKeep(meta *FrameMetadata, reader *buf.Buffere if err != nil && buf.IsWriteError(err) { newError("failed to write to downstream. closing session ", s.ID).Base(err).WriteToLog() + // Notify remote peer to close this session. + closingWriter := NewResponseWriter(meta.SessionID, m.link.Writer, protocol.TransferTypeStream) + closingWriter.Close() + drainErr := buf.Copy(rr, buf.Discard) pipe.CloseError(s.input) s.Close() diff --git a/common/mux/server.go b/common/mux/server.go index b45e1315..372692a2 100644 --- a/common/mux/server.go +++ b/common/mux/server.go @@ -159,6 +159,10 @@ func (w *ServerWorker) handleStatusKeep(meta *FrameMetadata, reader *buf.Buffere s, found := w.sessionManager.Get(meta.SessionID) if !found { + // Notify remote peer to close this session. + closingWriter := NewResponseWriter(meta.SessionID, w.link.Writer, protocol.TransferTypeStream) + closingWriter.Close() + return buf.Copy(NewStreamReader(reader), buf.Discard) } @@ -166,7 +170,11 @@ func (w *ServerWorker) handleStatusKeep(meta *FrameMetadata, reader *buf.Buffere err := buf.Copy(rr, s.output) if err != nil && buf.IsWriteError(err) { - newError("failed to write to downstream writer. closing session ", s.ID).Base(err) + newError("failed to write to downstream writer. closing session ", s.ID).Base(err).WriteToLog() + + // Notify remote peer to close this session. + closingWriter := NewResponseWriter(meta.SessionID, w.link.Writer, protocol.TransferTypeStream) + closingWriter.Close() drainErr := buf.Copy(rr, buf.Discard) pipe.CloseError(s.input)