mirror of
https://github.com/dalbodeule/hop-gate.git
synced 2025-12-12 06:40:11 +09:00
Address code review feedback: cleanup unused code and improve channel safety
- Remove unused streamResponse struct - Add named constant for response channel buffer size - Add default case to prevent blocking in readLoop select - Fix potential double-close of channels during cleanup - Improve comments explaining concurrency patterns Co-authored-by: dalbodeule <11470513+dalbodeule@users.noreply.github.com>
This commit is contained in:
@@ -34,14 +34,6 @@ import (
|
|||||||
// 기본값 "dev" 는 로컬 개발용입니다.
|
// 기본값 "dev" 는 로컬 개발용입니다.
|
||||||
var version = "dev"
|
var version = "dev"
|
||||||
|
|
||||||
// streamResponse collects the complete response for a single HTTP stream request
|
|
||||||
type streamResponse struct {
|
|
||||||
statusCode int
|
|
||||||
header map[string][]string
|
|
||||||
body bytes.Buffer
|
|
||||||
err error
|
|
||||||
}
|
|
||||||
|
|
||||||
// pendingRequest tracks a request waiting for its response
|
// pendingRequest tracks a request waiting for its response
|
||||||
type pendingRequest struct {
|
type pendingRequest struct {
|
||||||
streamID protocol.StreamID
|
streamID protocol.StreamID
|
||||||
@@ -211,7 +203,8 @@ func (w *dtlsSessionWrapper) readLoop() {
|
|||||||
"error": err.Error(),
|
"error": err.Error(),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
// Notify all pending requests of the error
|
// Notify all pending requests of the error by closing their response channels
|
||||||
|
// The doneCh will be closed by each ForwardHTTP's defer
|
||||||
w.mu.Lock()
|
w.mu.Lock()
|
||||||
for _, pending := range w.pending {
|
for _, pending := range w.pending {
|
||||||
close(pending.respCh)
|
close(pending.respCh)
|
||||||
@@ -272,6 +265,12 @@ func (w *dtlsSessionWrapper) readLoop() {
|
|||||||
w.logger.Warn("pending request already closed", logging.Fields{
|
w.logger.Warn("pending request already closed", logging.Fields{
|
||||||
"stream_id": streamID,
|
"stream_id": streamID,
|
||||||
})
|
})
|
||||||
|
default:
|
||||||
|
// Channel buffer full - shouldn't happen with proper sizing
|
||||||
|
w.logger.Warn("response channel buffer full, dropping frame", logging.Fields{
|
||||||
|
"stream_id": streamID,
|
||||||
|
"type": env.Type,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -288,10 +287,15 @@ func (w *dtlsSessionWrapper) ForwardHTTP(ctx context.Context, logger logging.Log
|
|||||||
w.mu.Lock()
|
w.mu.Lock()
|
||||||
streamID := w.nextHTTPStreamID()
|
streamID := w.nextHTTPStreamID()
|
||||||
|
|
||||||
|
// Channel buffer size for response frames to avoid blocking readLoop.
|
||||||
|
// A typical HTTP response has: 1 StreamOpen + N StreamData + 1 StreamClose frames.
|
||||||
|
// With 4KB chunks, even large responses stay within this buffer.
|
||||||
|
const responseChannelBuffer = 16
|
||||||
|
|
||||||
// Create a pending request to receive responses
|
// Create a pending request to receive responses
|
||||||
pending := &pendingRequest{
|
pending := &pendingRequest{
|
||||||
streamID: streamID,
|
streamID: streamID,
|
||||||
respCh: make(chan *protocol.Envelope, 16), // Buffered to avoid blocking readLoop
|
respCh: make(chan *protocol.Envelope, responseChannelBuffer),
|
||||||
doneCh: make(chan struct{}),
|
doneCh: make(chan struct{}),
|
||||||
}
|
}
|
||||||
w.pending[streamID] = pending
|
w.pending[streamID] = pending
|
||||||
|
|||||||
Reference in New Issue
Block a user