mirror of
https://github.com/valyala/fasthttp.git
synced 2026-06-14 15:56:44 +03:00
client: Modify some interfaces to be exportable (#1936)
* client: Client {} supports custom Transport
* client: Modify some interfaces to be exportable
This commit is contained in:
@@ -1519,7 +1519,7 @@ func (c *HostClient) SetMaxConns(newMaxConns int) {
|
||||
c.connsLock.Unlock()
|
||||
}
|
||||
|
||||
func (c *HostClient) acquireConn(reqTimeout time.Duration, connectionClose bool) (cc *clientConn, err error) {
|
||||
func (c *HostClient) AcquireConn(reqTimeout time.Duration, connectionClose bool) (cc *clientConn, err error) {
|
||||
createConn := false
|
||||
startCleaner := false
|
||||
|
||||
@@ -1642,7 +1642,7 @@ func (c *HostClient) dialConnFor(w *wantConn) {
|
||||
cc := acquireClientConn(conn)
|
||||
if !w.tryDeliver(cc, nil) {
|
||||
// not delivered, return idle connection
|
||||
c.releaseConn(cc)
|
||||
c.ReleaseConn(cc)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1660,7 +1660,7 @@ func (c *HostClient) CloseIdleConnections() {
|
||||
c.connsLock.Unlock()
|
||||
|
||||
for _, cc := range scratch {
|
||||
c.closeConn(cc)
|
||||
c.CloseConn(cc)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1701,7 +1701,7 @@ func (c *HostClient) connsCleaner() {
|
||||
|
||||
// Close idle connections.
|
||||
for i, cc := range scratch {
|
||||
c.closeConn(cc)
|
||||
c.CloseConn(cc)
|
||||
scratch[i] = nil
|
||||
}
|
||||
|
||||
@@ -1720,7 +1720,7 @@ func (c *HostClient) connsCleaner() {
|
||||
}
|
||||
}
|
||||
|
||||
func (c *HostClient) closeConn(cc *clientConn) {
|
||||
func (c *HostClient) CloseConn(cc *clientConn) {
|
||||
c.decConnsCount()
|
||||
cc.c.Close()
|
||||
releaseClientConn(cc)
|
||||
@@ -1780,7 +1780,7 @@ func releaseClientConn(cc *clientConn) {
|
||||
|
||||
var clientConnPool sync.Pool
|
||||
|
||||
func (c *HostClient) releaseConn(cc *clientConn) {
|
||||
func (c *HostClient) ReleaseConn(cc *clientConn) {
|
||||
cc.lastUseTime = time.Now()
|
||||
if c.MaxConnWaitTimeout <= 0 {
|
||||
c.connsLock.Lock()
|
||||
@@ -1818,7 +1818,7 @@ func (c *HostClient) releaseConn(cc *clientConn) {
|
||||
}
|
||||
}
|
||||
|
||||
func (c *HostClient) acquireWriter(conn net.Conn) *bufio.Writer {
|
||||
func (c *HostClient) AcquireWriter(conn net.Conn) *bufio.Writer {
|
||||
var v any
|
||||
if c.clientWriterPool != nil {
|
||||
v = c.clientWriterPool.Get()
|
||||
@@ -1845,7 +1845,7 @@ func (c *HostClient) acquireWriter(conn net.Conn) *bufio.Writer {
|
||||
return bw
|
||||
}
|
||||
|
||||
func (c *HostClient) releaseWriter(bw *bufio.Writer) {
|
||||
func (c *HostClient) ReleaseWriter(bw *bufio.Writer) {
|
||||
if c.clientWriterPool != nil {
|
||||
c.clientWriterPool.Put(bw)
|
||||
} else {
|
||||
@@ -1853,7 +1853,7 @@ func (c *HostClient) releaseWriter(bw *bufio.Writer) {
|
||||
}
|
||||
}
|
||||
|
||||
func (c *HostClient) acquireReader(conn net.Conn) *bufio.Reader {
|
||||
func (c *HostClient) AcquireReader(conn net.Conn) *bufio.Reader {
|
||||
var v any
|
||||
if c.clientReaderPool != nil {
|
||||
v = c.clientReaderPool.Get()
|
||||
@@ -1880,7 +1880,7 @@ func (c *HostClient) acquireReader(conn net.Conn) *bufio.Reader {
|
||||
return br
|
||||
}
|
||||
|
||||
func (c *HostClient) releaseReader(br *bufio.Reader) {
|
||||
func (c *HostClient) ReleaseReader(br *bufio.Reader) {
|
||||
if c.clientReaderPool != nil {
|
||||
c.clientReaderPool.Put(br)
|
||||
} else {
|
||||
@@ -2145,7 +2145,7 @@ func (w *wantConn) cancel(c *HostClient, err error) {
|
||||
w.mu.Unlock()
|
||||
|
||||
if conn != nil {
|
||||
c.releaseConn(conn)
|
||||
c.ReleaseConn(conn)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2826,7 +2826,7 @@ func (c *pipelineConnClient) writer(conn net.Conn, stopCh <-chan struct{}) error
|
||||
continue
|
||||
}
|
||||
|
||||
w.resp.parseNetConn(conn)
|
||||
w.resp.ParseNetConn(conn)
|
||||
|
||||
if writeTimeout > 0 {
|
||||
// Set Deadline every time, since golang has fixed the performance issue
|
||||
@@ -2973,13 +2973,13 @@ func (t *transport) RoundTrip(hc *HostClient, req *Request, resp *Response) (ret
|
||||
deadline = time.Now().Add(req.timeout)
|
||||
}
|
||||
|
||||
cc, err := hc.acquireConn(req.timeout, req.ConnectionClose())
|
||||
cc, err := hc.AcquireConn(req.timeout, req.ConnectionClose())
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
conn := cc.c
|
||||
|
||||
resp.parseNetConn(conn)
|
||||
resp.ParseNetConn(conn)
|
||||
|
||||
writeDeadline := deadline
|
||||
if hc.WriteTimeout > 0 {
|
||||
@@ -2990,7 +2990,7 @@ func (t *transport) RoundTrip(hc *HostClient, req *Request, resp *Response) (ret
|
||||
}
|
||||
|
||||
if err = conn.SetWriteDeadline(writeDeadline); err != nil {
|
||||
hc.closeConn(cc)
|
||||
hc.CloseConn(cc)
|
||||
return true, err
|
||||
}
|
||||
|
||||
@@ -3000,7 +3000,7 @@ func (t *transport) RoundTrip(hc *HostClient, req *Request, resp *Response) (ret
|
||||
resetConnection = true
|
||||
}
|
||||
|
||||
bw := hc.acquireWriter(conn)
|
||||
bw := hc.AcquireWriter(conn)
|
||||
err = req.Write(bw)
|
||||
|
||||
if resetConnection {
|
||||
@@ -3010,7 +3010,7 @@ func (t *transport) RoundTrip(hc *HostClient, req *Request, resp *Response) (ret
|
||||
if err == nil {
|
||||
err = bw.Flush()
|
||||
}
|
||||
hc.releaseWriter(bw)
|
||||
hc.ReleaseWriter(bw)
|
||||
|
||||
// Return ErrTimeout on any timeout.
|
||||
if x, ok := err.(interface{ Timeout() bool }); ok && x.Timeout() {
|
||||
@@ -3018,7 +3018,7 @@ func (t *transport) RoundTrip(hc *HostClient, req *Request, resp *Response) (ret
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
hc.closeConn(cc)
|
||||
hc.CloseConn(cc)
|
||||
return true, err
|
||||
}
|
||||
|
||||
@@ -3031,7 +3031,7 @@ func (t *transport) RoundTrip(hc *HostClient, req *Request, resp *Response) (ret
|
||||
}
|
||||
|
||||
if err = conn.SetReadDeadline(readDeadline); err != nil {
|
||||
hc.closeConn(cc)
|
||||
hc.CloseConn(cc)
|
||||
return true, err
|
||||
}
|
||||
|
||||
@@ -3042,11 +3042,11 @@ func (t *transport) RoundTrip(hc *HostClient, req *Request, resp *Response) (ret
|
||||
resp.Header.DisableNormalizing()
|
||||
}
|
||||
|
||||
br := hc.acquireReader(conn)
|
||||
br := hc.AcquireReader(conn)
|
||||
err = resp.ReadLimitBody(br, hc.MaxResponseBodySize)
|
||||
if err != nil {
|
||||
hc.releaseReader(br)
|
||||
hc.closeConn(cc)
|
||||
hc.ReleaseReader(br)
|
||||
hc.CloseConn(cc)
|
||||
// Don't retry in case of ErrBodyTooLarge since we will just get the same again.
|
||||
needRetry := err != ErrBodyTooLarge
|
||||
return needRetry, err
|
||||
@@ -3056,25 +3056,25 @@ func (t *transport) RoundTrip(hc *HostClient, req *Request, resp *Response) (ret
|
||||
if customStreamBody && resp.bodyStream != nil {
|
||||
rbs := resp.bodyStream
|
||||
resp.bodyStream = newCloseReaderWithError(rbs, func(wErr error) error {
|
||||
hc.releaseReader(br)
|
||||
hc.ReleaseReader(br)
|
||||
if r, ok := rbs.(*requestStream); ok {
|
||||
releaseRequestStream(r)
|
||||
}
|
||||
if closeConn || resp.ConnectionClose() || wErr != nil {
|
||||
hc.closeConn(cc)
|
||||
hc.CloseConn(cc)
|
||||
} else {
|
||||
hc.releaseConn(cc)
|
||||
hc.ReleaseConn(cc)
|
||||
}
|
||||
return nil
|
||||
})
|
||||
return false, nil
|
||||
}
|
||||
hc.releaseReader(br)
|
||||
hc.ReleaseReader(br)
|
||||
|
||||
if closeConn {
|
||||
hc.closeConn(cc)
|
||||
hc.CloseConn(cc)
|
||||
} else {
|
||||
hc.releaseConn(cc)
|
||||
hc.ReleaseConn(cc)
|
||||
}
|
||||
return false, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user