staging #74

Merged
bagas merged 12 commits from staging into main 2026-01-22 22:16:34 +07:00
2 changed files with 40 additions and 18 deletions
Showing only changes of commit 8fb19af5a6 - Show all commits
+12 -1
View File
@@ -347,7 +347,18 @@ func forwardRequest(cw HTTPWriter, initialRequest RequestHeaderManager, sshSessi
go func() { go func() {
channel, reqs, err := sshSession.Lifecycle().Connection().OpenChannel("forwarded-tcpip", payload) channel, reqs, err := sshSession.Lifecycle().Connection().OpenChannel("forwarded-tcpip", payload)
resultChan <- channelResult{channel, reqs, err} select {
case resultChan <- channelResult{channel, reqs, err}:
default:
if channel != nil {
err := channel.Close()
if err != nil {
log.Printf("Failed to close unused channel: %v", err)
return
}
go ssh.DiscardRequests(reqs)
}
}
}() }()
var channel ssh.Channel var channel ssh.Channel
+28 -17
View File
@@ -73,14 +73,6 @@ func (f *forwarder) AcceptTCPConnections() {
continue continue
} }
if err = conn.SetDeadline(time.Now().Add(5 * time.Second)); err != nil {
log.Printf("Failed to set connection deadline: %v", err)
if closeErr := conn.Close(); closeErr != nil {
log.Printf("Failed to close connection: %v", closeErr)
}
continue
}
payload := f.CreateForwardedTCPIPPayload(conn.RemoteAddr()) payload := f.CreateForwardedTCPIPPayload(conn.RemoteAddr())
type channelResult struct { type channelResult struct {
@@ -92,7 +84,18 @@ func (f *forwarder) AcceptTCPConnections() {
go func() { go func() {
channel, reqs, err := f.conn.OpenChannel("forwarded-tcpip", payload) channel, reqs, err := f.conn.OpenChannel("forwarded-tcpip", payload)
resultChan <- channelResult{channel, reqs, err} select {
case resultChan <- channelResult{channel, reqs, err}:
default:
if channel != nil {
err := channel.Close()
if err != nil {
log.Printf("Failed to close unused channel: %v", err)
return
}
go ssh.DiscardRequests(reqs)
}
}
}() }()
select { select {
@@ -104,14 +107,8 @@ func (f *forwarder) AcceptTCPConnections() {
} }
continue continue
} }
if err = conn.SetDeadline(time.Time{}); err != nil {
log.Printf("Failed to clear connection deadline: %v", err)
}
go ssh.DiscardRequests(result.reqs) go ssh.DiscardRequests(result.reqs)
go f.HandleConnection(conn, result.channel, conn.RemoteAddr()) go f.HandleConnection(conn, result.channel, conn.RemoteAddr())
case <-time.After(5 * time.Second): case <-time.After(5 * time.Second):
log.Printf("Timeout opening forwarded-tcpip channel") log.Printf("Timeout opening forwarded-tcpip channel")
if closeErr := conn.Close(); closeErr != nil { if closeErr := conn.Close(); closeErr != nil {
@@ -150,7 +147,18 @@ func (f *forwarder) HandleConnection(dst io.ReadWriter, src ssh.Channel, remoteA
defer wg.Done() defer wg.Done()
_, err := copyWithBuffer(dst, src) _, err := copyWithBuffer(dst, src)
if err != nil && !errors.Is(err, io.EOF) && !errors.Is(err, net.ErrClosed) { if err != nil && !errors.Is(err, io.EOF) && !errors.Is(err, net.ErrClosed) {
log.Printf("Error copying srcdst: %v", err) log.Printf("Error copying src to dst: %v", err)
}
if conn, ok := dst.(interface{ CloseWrite() error }); ok {
if err = conn.CloseWrite(); err != nil {
log.Printf("Error closing write side of dst: %v", err)
}
} else {
if closer, closerOk := dst.(io.Closer); closerOk {
if err = closer.Close(); err != nil && !errors.Is(err, io.EOF) {
log.Printf("Error closing dst connection: %v", err)
}
}
} }
}() }()
@@ -158,7 +166,10 @@ func (f *forwarder) HandleConnection(dst io.ReadWriter, src ssh.Channel, remoteA
defer wg.Done() defer wg.Done()
_, err := copyWithBuffer(src, dst) _, err := copyWithBuffer(src, dst)
if err != nil && !errors.Is(err, io.EOF) && !errors.Is(err, net.ErrClosed) { if err != nil && !errors.Is(err, io.EOF) && !errors.Is(err, net.ErrClosed) {
log.Printf("Error copying dstsrc: %v", err) log.Printf("Error copying dst to src: %v", err)
}
if err = src.CloseWrite(); err != nil {
log.Printf("Error closing write side of src: %v", err)
} }
}() }()