@@ -2,6 +2,7 @@ package httpUtils
22
33import (
44 "context"
5+ "io"
56 "log"
67 "net/http"
78 "net/http/httputil"
@@ -26,6 +27,17 @@ var httpClient = &http.Client{
2627}
2728
2829var proxyCache = sync.Map {} // map[string]*httputil.ReverseProxy
30+
31+ type cancelOnCloseReadCloser struct {
32+ io.ReadCloser
33+ cancel context.CancelFunc
34+ }
35+
36+ func (c * cancelOnCloseReadCloser ) Close () error {
37+ err := c .ReadCloser .Close ()
38+ c .cancel ()
39+ return err
40+ }
2941func getProxy (target * url.URL ) * httputil.ReverseProxy {
3042 key := target .Host
3143 if p , ok := proxyCache .Load (key ); ok {
@@ -66,10 +78,10 @@ func FowardRequest(w http.ResponseWriter, r *http.Request, destination string) {
6678
6779func CheckRequest (r * http.Request , node string ) (* http.Response , error ) {
6880 ctx , cancel := context .WithTimeout (r .Context (), 5 * time .Second )
69- defer cancel ()
7081
7182 new_target , err := url .Parse (node )
7283 if err != nil {
84+ cancel ()
7385 return nil , err
7486 }
7587
@@ -78,14 +90,17 @@ func CheckRequest(r *http.Request, node string) (*http.Response, error) {
7890
7991 req , err := http .NewRequestWithContext (ctx , r .Method , new_target .String (), r .Body )
8092 if err != nil {
93+ cancel ()
8194 return nil , err
8295 }
8396
8497 req .Header = r .Header .Clone ()
8598
8699 res , err := httpClient .Do (req )
87100 if err != nil {
101+ cancel ()
88102 return nil , err
89103 }
104+ res .Body = & cancelOnCloseReadCloser {ReadCloser : res .Body , cancel : cancel }
90105 return res , nil
91106}
0 commit comments