mirror of
https://github.com/infinite-iroha/touka.git
synced 2026-06-13 15:47:38 +08:00
refactor: cache ResponseController in H2ReadWriteCloser for better performance
This commit is contained in:
parent
7abedc1ace
commit
20dc6e4047
2 changed files with 7 additions and 5 deletions
|
|
@ -96,20 +96,21 @@ type reverseProxyExtendedConnectBridge struct {
|
||||||
type reverseProxyH2ReadWriteCloser struct {
|
type reverseProxyH2ReadWriteCloser struct {
|
||||||
io.ReadCloser
|
io.ReadCloser
|
||||||
ResponseWriter
|
ResponseWriter
|
||||||
|
controller *http.ResponseController
|
||||||
}
|
}
|
||||||
|
|
||||||
func (rwc reverseProxyH2ReadWriteCloser) Write(p []byte) (int, error) {
|
func (rwc *reverseProxyH2ReadWriteCloser) Write(p []byte) (int, error) {
|
||||||
n, err := rwc.ResponseWriter.Write(p)
|
n, err := rwc.ResponseWriter.Write(p)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return n, err
|
return n, err
|
||||||
}
|
}
|
||||||
if err := http.NewResponseController(reverseProxyBaseResponseWriter(rwc.ResponseWriter)).Flush(); err != nil && !errors.Is(err, http.ErrNotSupported) {
|
if err := rwc.controller.Flush(); err != nil && !errors.Is(err, http.ErrNotSupported) {
|
||||||
return n, err
|
return n, err
|
||||||
}
|
}
|
||||||
return n, nil
|
return n, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (rwc reverseProxyH2ReadWriteCloser) Close() error {
|
func (rwc *reverseProxyH2ReadWriteCloser) Close() error {
|
||||||
if rwc.ReadCloser == nil {
|
if rwc.ReadCloser == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
@ -1012,7 +1013,7 @@ func (p *reverseProxyHandler) handleBridgedExtendedConnectResponse(c *Context, r
|
||||||
return &reverseProxyStatusError{status: http.StatusBadGateway, err: err}
|
return &reverseProxyStatusError{status: http.StatusBadGateway, err: err}
|
||||||
}
|
}
|
||||||
|
|
||||||
conn := reverseProxyH2ReadWriteCloser{ReadCloser: bridge.body, ResponseWriter: c.Writer}
|
conn := &reverseProxyH2ReadWriteCloser{ReadCloser: bridge.body, ResponseWriter: c.Writer, controller: controller}
|
||||||
|
|
||||||
backConnClosed := make(chan struct{})
|
backConnClosed := make(chan struct{})
|
||||||
go func() {
|
go func() {
|
||||||
|
|
|
||||||
|
|
@ -836,9 +836,10 @@ func TestReverseProxyH2ReadWriteCloserWriteReturnsWrittenCountOnFlushError(t *te
|
||||||
|
|
||||||
flushErr := errors.New("flush failed")
|
flushErr := errors.New("flush failed")
|
||||||
writer := &flushErrorResponseWriter{flushErr: flushErr}
|
writer := &flushErrorResponseWriter{flushErr: flushErr}
|
||||||
conn := reverseProxyH2ReadWriteCloser{
|
conn := &reverseProxyH2ReadWriteCloser{
|
||||||
ReadCloser: io.NopCloser(strings.NewReader("")),
|
ReadCloser: io.NopCloser(strings.NewReader("")),
|
||||||
ResponseWriter: writer,
|
ResponseWriter: writer,
|
||||||
|
controller: http.NewResponseController(reverseProxyBaseResponseWriter(writer)),
|
||||||
}
|
}
|
||||||
|
|
||||||
n, err := conn.Write([]byte("ping"))
|
n, err := conn.Write([]byte("ping"))
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue