Skip to content

Commit f1a6426

Browse files
committed
fix(qb): Configure HTTP client with connection pooling and fix resource leaks in qBittorrent client. (#898)
1 parent 5f25679 commit f1a6426

File tree

1 file changed

+26
-6
lines changed

1 file changed

+26
-6
lines changed

pkg/qbittorrent/client.go

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"net/http"
99
"net/http/cookiejar"
1010
"net/url"
11+
"time"
1112

1213
"github.com/OpenListTeam/OpenList/v4/pkg/utils"
1314
)
@@ -35,9 +36,21 @@ func New(webuiUrl string) (Client, error) {
3536
if err != nil {
3637
return nil, err
3738
}
39+
40+
transport := &http.Transport{
41+
MaxIdleConns: 10,
42+
MaxIdleConnsPerHost: 2,
43+
IdleConnTimeout: 30 * time.Second,
44+
DisableKeepAlives: false, // Enable connection reuse
45+
}
46+
3847
var c = &client{
39-
url: u,
40-
client: http.Client{Jar: jar},
48+
url: u,
49+
client: http.Client{
50+
Jar: jar,
51+
Transport: transport,
52+
Timeout: 30 * time.Second, // Set overall timeout
53+
},
4154
}
4255

4356
err = c.checkAuthorization()
@@ -69,6 +82,7 @@ func (c *client) authorized() bool {
6982
if err != nil {
7083
return false
7184
}
85+
defer resp.Body.Close()
7286
return resp.StatusCode == 200 // the status code will be 403 if not authorized
7387
}
7488

@@ -82,6 +96,7 @@ func (c *client) login() error {
8296
if err != nil {
8397
return err
8498
}
99+
defer resp.Body.Close()
85100

86101
// check result
87102
body := make([]byte, 2)
@@ -157,6 +172,7 @@ func (c *client) AddFromLink(link string, savePath string, id string) error {
157172
if err != nil {
158173
return err
159174
}
175+
defer resp.Body.Close()
160176

161177
// check result
162178
body := make([]byte, 2)
@@ -271,6 +287,7 @@ func (c *client) GetInfo(id string) (TorrentInfo, error) {
271287
if err != nil {
272288
return TorrentInfo{}, err
273289
}
290+
defer response.Body.Close()
274291

275292
body, err := io.ReadAll(response.Body)
276293
if err != nil {
@@ -316,6 +333,7 @@ func (c *client) GetFiles(id string) ([]FileInfo, error) {
316333
if err != nil {
317334
return []FileInfo{}, err
318335
}
336+
defer response.Body.Close()
319337

320338
body, err := io.ReadAll(response.Body)
321339
if err != nil {
@@ -345,21 +363,23 @@ func (c *client) Delete(id string, deleteFiles bool) error {
345363
} else {
346364
v.Set("deleteFiles", "false")
347365
}
348-
response, err := c.post("/api/v2/torrents/delete", v)
366+
deleteResp, err := c.post("/api/v2/torrents/delete", v)
349367
if err != nil {
350368
return err
351369
}
352-
if response.StatusCode != 200 {
370+
defer deleteResp.Body.Close()
371+
if deleteResp.StatusCode != 200 {
353372
return errors.New("failed to delete qbittorrent task")
354373
}
355374

356375
v = url.Values{}
357376
v.Set("tags", "openlist-"+id)
358-
response, err = c.post("/api/v2/torrents/deleteTags", v)
377+
deleteTagsResp, err := c.post("/api/v2/torrents/deleteTags", v)
359378
if err != nil {
360379
return err
361380
}
362-
if response.StatusCode != 200 {
381+
defer deleteTagsResp.Body.Close()
382+
if deleteTagsResp.StatusCode != 200 {
363383
return errors.New("failed to delete qbittorrent tag")
364384
}
365385
return nil

0 commit comments

Comments
 (0)