diff --git a/app/proxyman/mux/frame.go b/app/proxyman/mux/frame.go index b7aa87faf..74cabda23 100644 --- a/app/proxyman/mux/frame.go +++ b/app/proxyman/mux/frame.go @@ -9,9 +9,10 @@ import ( type SessionStatus byte const ( - SessionStatusNew SessionStatus = 0x01 - SessionStatusKeep SessionStatus = 0x02 - SessionStatusEnd SessionStatus = 0x03 + SessionStatusNew SessionStatus = 0x01 + SessionStatusKeep SessionStatus = 0x02 + SessionStatusEnd SessionStatus = 0x03 + SessionStatusKeepAlive SessionStatus = 0x04 ) type Option byte diff --git a/app/proxyman/mux/mux.go b/app/proxyman/mux/mux.go index ca9e3a4bf..61169213f 100644 --- a/app/proxyman/mux/mux.go +++ b/app/proxyman/mux/mux.go @@ -295,6 +295,16 @@ func (m *Client) fetchOutput() { log.Trace(newError("failed to read metadata").Base(err)) break } + if meta.SessionStatus == SessionStatusKeepAlive { + if meta.Option.Has(OptionData) { + if err := drain(reader); err != nil { + log.Trace(newError("failed to read data").Base(err)) + break + } + } + continue + } + m.access.RLock() s, found := m.sessions[meta.SessionID] m.access.RUnlock() @@ -390,6 +400,16 @@ func (w *ServerWorker) run(ctx context.Context) { return } + if meta.SessionStatus == SessionStatusKeepAlive { + if meta.Option.Has(OptionData) { + if err := drain(reader); err != nil { + log.Trace(newError("failed to read data").Base(err)) + break + } + } + continue + } + w.access.RLock() s, found := w.sessions[meta.SessionID] w.access.RUnlock()