From b487c81865ce91be0d4beb4d692f3796cb726a2a Mon Sep 17 00:00:00 2001 From: Simon Ding Date: Tue, 13 Aug 2024 11:05:46 +0800 Subject: [PATCH] feat: cache errored request --- pkg/torznab/cache.go | 2 +- pkg/torznab/torznab.go | 33 +++++++++++++++++++++------------ 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/pkg/torznab/cache.go b/pkg/torznab/cache.go index 1fd724c..266ae43 100644 --- a/pkg/torznab/cache.go +++ b/pkg/torznab/cache.go @@ -5,4 +5,4 @@ import ( "time" ) -var cc = cache.NewCache[string, Response](time.Minute * 30) +var cc = cache.NewCache[string, *Response](time.Minute * 30) diff --git a/pkg/torznab/torznab.go b/pkg/torznab/torznab.go index dd90564..aca9a53 100644 --- a/pkg/torznab/torznab.go +++ b/pkg/torznab/torznab.go @@ -135,19 +135,10 @@ func Search(indexer *db.TorznabInfo, keyWord string) ([]Result, error) { cacheRes, ok := cc.Get(key) if !ok { - resp, err := http.DefaultClient.Do(req) + res, err := doRequest(req) if err != nil { - return nil, errors.Wrap(err, "do http") - } - defer resp.Body.Close() - data, err := io.ReadAll(resp.Body) - if err != nil { - return nil, errors.Wrap(err, "read http body") - } - var res Response - err = xml.Unmarshal(data, &res) - if err != nil { - return nil, errors.Wrapf(err, "xml unmarshal data: %v", string(data)) + cc.Set(key, &Response{}) + return nil, errors.Wrap(err, "do http request") } cacheRes = res cc.Set(key, cacheRes) @@ -155,6 +146,24 @@ func Search(indexer *db.TorznabInfo, keyWord string) ([]Result, error) { return cacheRes.ToResults(indexer), nil } +func doRequest(req *http.Request) (*Response, error) { + resp, err := http.DefaultClient.Do(req) + if err != nil { + return nil, errors.Wrap(err, "do http") + } + defer resp.Body.Close() + data, err := io.ReadAll(resp.Body) + if err != nil { + return nil, errors.Wrap(err, "read http body") + } + var res Response + err = xml.Unmarshal(data, &res) + if err != nil { + return nil, errors.Wrapf(err, "xml unmarshal data: %v", string(data)) + } + return &res, nil +} + type Result struct { Name string `json:"name"` Link string `json:"link"`