Skip to content

Commit 2eb7b5f

Browse files
authored
fix: critical memory leak (nekomeowww#183)
Signed-off-by: Neko Ayaka <[email protected]>
1 parent 7e77369 commit 2eb7b5f

File tree

2 files changed

+31
-6
lines changed

2 files changed

+31
-6
lines changed

internal/models/smr/smr.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,20 +173,34 @@ func (m *Model) extractContentFromURL(ctx context.Context, urlString string) (*r
173173
resp, err := m.req.
174174
R().
175175
EnableDumpTo(dumpBuffer).
176+
DisableAutoReadResponse().
176177
SetContext(ctx).
177178
Get(parsedURL.String())
178179
if err != nil {
179180
return nil, fmt.Errorf("failed to get url %s, %w: %v", parsedURL.String(), ErrNetworkError, err)
180181
}
181182
if !resp.IsSuccessState() {
183+
errorBuf := new(bytes.Buffer)
184+
defer errorBuf.Reset()
185+
186+
_, err = io.Copy(errorBuf, resp.Body)
187+
if err != nil {
188+
fmt.Fprintf(errorBuf, "failed to read response body: %v", err)
189+
}
190+
191+
dumpBuffer.WriteString("\n")
192+
dumpBuffer.Write(errorBuf.Bytes())
193+
182194
return nil, fmt.Errorf("failed to get url %s, %w, status code: %d, dump: %s", parsedURL.String(), ErrRequestFailed, resp.StatusCode, dumpBuffer.String())
183195
}
184196
if !strings.Contains(resp.Header.Get("Content-Type"), "text/html") {
185197
return nil, fmt.Errorf("url fetched, but content-type not supported yet, %w, content-type: %s", ErrContentNotSupported, resp.Header.Get("Content-Type"))
186198
}
187199

188200
defer resp.Body.Close()
201+
189202
buffer := new(bytes.Buffer)
203+
defer buffer.Reset()
190204

191205
_, err = io.Copy(buffer, resp.Body)
192206
if err != nil {

pkg/linkprev/linkprev.go

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,7 @@ type Client struct {
2626

2727
func NewClient() *Client {
2828
return &Client{
29-
reqClient: req.
30-
C().
31-
SetUserAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1661.54").
32-
EnableDumpEachRequest(),
29+
reqClient: req.C().SetUserAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1661.54"),
3330
}
3431
}
3532

@@ -41,6 +38,8 @@ func (c *Client) Preview(ctx context.Context, urlStr string) (Meta, error) {
4138
return Meta{}, err
4239
}
4340

41+
defer body.Reset()
42+
4443
doc, err := goquery.NewDocumentFromReader(body)
4544
if err != nil {
4645
return Meta{}, fmt.Errorf("failed to parse response body with goquery: %v", err)
@@ -85,18 +84,30 @@ func (c *Client) alterRequestForTwitter(request *req.Request, urlStr string) *re
8584
return request.SetHeader("User-Agent", "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)")
8685
}
8786

88-
func (c *Client) request(r *req.Request, urlStr string) (io.Reader, error) {
87+
func (c *Client) request(r *req.Request, urlStr string) (*bytes.Buffer, error) {
8988
dumpBuffer := new(bytes.Buffer)
9089
defer dumpBuffer.Reset()
9190

9291
resp, err := r.
9392
EnableDumpTo(dumpBuffer).
93+
DisableAutoReadResponse().
9494
Get(urlStr)
9595
if err != nil {
9696
return nil, fmt.Errorf("failed to get a preview of url %s, %w: %v", urlStr, ErrNetworkError, err)
9797
}
9898
if !resp.IsSuccessState() {
99-
return nil, fmt.Errorf("failed to get url %s, %w, status code: %d, dump: %s", urlStr, ErrRequestFailed, resp.StatusCode, dumpBuffer.String())
99+
errorBuf := new(bytes.Buffer)
100+
defer errorBuf.Reset()
101+
102+
_, err = io.Copy(errorBuf, resp.Body)
103+
if err != nil {
104+
fmt.Fprintf(errorBuf, "failed to read response body: %v", err)
105+
}
106+
107+
dumpBuffer.WriteString("\n")
108+
dumpBuffer.Write(errorBuf.Bytes())
109+
110+
return nil, fmt.Errorf("failed to get url %s, %w, status code: %d, dump:\n%s", urlStr, ErrRequestFailed, resp.StatusCode, dumpBuffer.String())
100111
}
101112

102113
defer resp.Body.Close()

0 commit comments

Comments
 (0)