Skip to content

Commit

Permalink
record redirect
Browse files Browse the repository at this point in the history
  • Loading branch information
zyxkad committed Mar 3, 2024
1 parent c8a5327 commit e55266c
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 5 deletions.
2 changes: 1 addition & 1 deletion api.go
Original file line number Diff line number Diff line change
Expand Up @@ -429,7 +429,7 @@ func (cr *Cluster) apiV0LogIO(rw http.ResponseWriter, req *http.Request) {
for {
clear(data)
if err := conn.ReadJSON(&data); err != nil {
log.Errorf("[log.io]: Cannot read from peer:", err)
log.Errorf("[log.io]: Cannot read from peer: %v", err)
return
}
typ, ok := data["type"].(string)
Expand Down
11 changes: 7 additions & 4 deletions cluster.go
Original file line number Diff line number Diff line change
Expand Up @@ -1213,22 +1213,24 @@ func (cr *Cluster) fetchFileWithBuf(
return
}
if res.StatusCode != http.StatusOK {
err = utils.NewHTTPStatusErrorFromResponse(res)
err = ErrorFromRedirect(utils.NewHTTPStatusErrorFromResponse(res), res)
return
}
switch ce := strings.ToLower(res.Header.Get("Content-Encoding")); ce {
case "":
r = res.Body
case "gzip":
if r, err = gzip.NewReader(res.Body); err != nil {
err = ErrorFromRedirect(err, res)
return
}
case "deflate":
if r, err = zlib.NewReader(res.Body); err != nil {
err = ErrorFromRedirect(err, res)
return
}
default:
err = fmt.Errorf("Unexpected Content-Encoding %q", ce)
err = ErrorFromRedirect(fmt.Errorf("Unexpected Content-Encoding %q", ce), res)
return
}
if wrapper != nil {
Expand All @@ -1251,17 +1253,18 @@ func (cr *Cluster) fetchFileWithBuf(
stat, err2 := fd.Stat()
fd.Close()
if err != nil {
err = ErrorFromRedirect(err, res)
return
}
if err2 != nil {
err = err2
return
}
if t := stat.Size(); f.Size >= 0 && t != f.Size {
err = fmt.Errorf("File size wrong, got %d, expect %d", t, f.Size)
err = ErrorFromRedirect(fmt.Errorf("File size wrong, got %d, expect %d", t, f.Size), res)
return
} else if hs := hex.EncodeToString(hw.Sum(buf[:0])); hs != f.Hash {
err = fmt.Errorf("File hash not match, got %s, expect %s", hs, f.Hash)
err = ErrorFromRedirect(fmt.Errorf("File hash not match, got %s, expect %s", hs, f.Hash), res)
return
}
return
Expand Down
43 changes: 43 additions & 0 deletions util.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,11 @@ import (
"fmt"
"io"
"math/rand"
"net/http"
"net/url"
"os"
"path/filepath"
"slices"
"strconv"
"strings"
"sync"
Expand Down Expand Up @@ -327,3 +329,44 @@ func loadOrCreateHmacKey(dataDir string) (key []byte, err error) {
}
return
}

type RedirectError struct {
Redirects []*url.URL
Err error
}

func ErrorFromRedirect(err error, resp *http.Response) *RedirectError {
redirects := make([]*url.URL, 0, 4)
for resp.Request != nil {
redirects = append(redirects, resp.Request.URL)
resp = resp.Request.Response
}
if len(redirects) > 1 {
slices.Reverse(redirects)
} else {
redirects = nil
}
return &RedirectError{
Redirects: redirects,
Err: err,
}
}

func (e *RedirectError) Error() string {
if len(e.Redirects) == 0 {
return e.Err.Error()
}
var b strings.Builder
b.WriteString("Redirect from:\n\t")
for _, r := range e.Redirects {
b.WriteString("- ")
b.WriteString(r.String())
b.WriteString("\n\t")
}
b.WriteString(e.Err.Error())
return b.String()
}

func (e *RedirectError) Unwrap() error {
return e.Err
}

0 comments on commit e55266c

Please sign in to comment.