From 62ffdc83ef52d5b05ccacb399890ae68bf679ce7 Mon Sep 17 00:00:00 2001 From: celogeek <65178+celogeek@users.noreply.github.com> Date: Tue, 28 Dec 2021 17:21:04 +0100 Subject: [PATCH] post: retry 3 times before cancel --- internal/piwigo/post.go | 85 ++++++++++++++++++++++------------------- 1 file changed, 45 insertions(+), 40 deletions(-) diff --git a/internal/piwigo/post.go b/internal/piwigo/post.go index 94fa4ec..30e1840 100644 --- a/internal/piwigo/post.go +++ b/internal/piwigo/post.go @@ -1,10 +1,9 @@ package piwigo import ( - "bytes" "encoding/json" "fmt" - "io" + "io/ioutil" "net/http" "net/url" "os" @@ -36,60 +35,66 @@ func (p *Piwigo) Post(method string, form *url.Values, resp interface{}) error { encodedForm = form.Encode() } - req, err := http.NewRequest("POST", Url, strings.NewReader(encodedForm)) - if err != nil { - return err - } - - req.Header.Set("Content-Type", "application/x-www-form-urlencoded") - if p.Token != "" { - req.AddCookie(&http.Cookie{Name: "pwg_id", Value: p.Token, HttpOnly: true}) - } - - r, err := http.DefaultClient.Do(req) - if err != nil { - return err - } - - defer r.Body.Close() - Result := PiwigoResult{ Result: resp, } - if os.Getenv("DEBUG") == "1" { - newBody := &bytes.Buffer{} - tee := io.TeeReader(r.Body, newBody) + var raw []byte + for i := 0; i < 3; i++ { + req, err := http.NewRequest("POST", Url, strings.NewReader(encodedForm)) + if err != nil { + return err + } + + req.Header.Set("Content-Type", "application/x-www-form-urlencoded") + if p.Token != "" { + req.AddCookie(&http.Cookie{Name: "pwg_id", Value: p.Token, HttpOnly: true}) + } + + r, err := http.DefaultClient.Do(req) + if err != nil { + continue + } + + raw, err := ioutil.ReadAll(r.Body) + r.Body.Close() + if err != nil { + continue + } + + err = json.Unmarshal(raw, &Result) + if err != nil { + continue + } + + for _, c := range r.Cookies() { + if c.Name == "pwg_id" { + p.Token = c.Value + break + } + } + + break + } + + if err != nil { + return err + } + + if os.Getenv("DEBUG") == "1" { var RawResult interface{} - err = json.NewDecoder(tee).Decode(&RawResult) + err = json.Unmarshal(raw, RawResult) if err != nil { return err } DumpResponse(RawResult) - - err = json.NewDecoder(newBody).Decode(&Result) - if err != nil { - return err - } - } else { - err = json.NewDecoder(r.Body).Decode(&Result) - if err != nil { - return err - } } if Result.Stat != "ok" { return fmt.Errorf("[Error %d] %s", Result.Err, Result.ErrMessage) } - for _, c := range r.Cookies() { - if c.Name == "pwg_id" { - p.Token = c.Value - break - } - } - return nil }