diff --git a/gateway/handler.go b/gateway/handler.go index 23b64b9c6..d6701db3e 100644 --- a/gateway/handler.go +++ b/gateway/handler.go @@ -560,11 +560,7 @@ func webRequestError(w http.ResponseWriter, err *requestError) { } func webError(w http.ResponseWriter, err error, defaultCode int) { - if isErrNoLink(err) { - webErrorWithCode(w, err, http.StatusNotFound) - } else if errors.Is(err, routing.ErrNotFound) || err == routing.ErrNotFound { - webErrorWithCode(w, err, http.StatusNotFound) - } else if ipld.IsNotFound(err) { + if isErrNotFound(err) { webErrorWithCode(w, err, http.StatusNotFound) } else if errors.Is(err, ErrGatewayTimeout) { webErrorWithCode(w, err, http.StatusGatewayTimeout) @@ -577,6 +573,13 @@ func webError(w http.ResponseWriter, err error, defaultCode int) { } } +func isErrNotFound(err error) bool { + return isErrNoLink(err) || + errors.Is(err, routing.ErrNotFound) || + err == routing.ErrNotFound || + ipld.IsNotFound(err) +} + // isErrNoLink checks if err is a resolver.ErrNoLink. resolver.ErrNoLink // does not implement a .Is interface and cannot be directly compared to. // Therefore, errors.Is always returns false with it. @@ -939,7 +942,7 @@ func (i *handler) setCommonHeaders(w http.ResponseWriter, r *http.Request, conte if rootCids, err := i.buildIpfsRootsHeader(contentPath.String(), r); err == nil { w.Header().Set("X-Ipfs-Roots", rootCids) } else { // this should never happen, as we resolved the contentPath already - err = fmt.Errorf("error while resolving X-Ipfs-Roots: %s", err) + err = fmt.Errorf("error while resolving X-Ipfs-Roots: %w", err) return newRequestError(err, http.StatusInternalServerError) } diff --git a/gateway/handler_codec.go b/gateway/handler_codec.go index 2341b5a22..ed02ab107 100644 --- a/gateway/handler_codec.go +++ b/gateway/handler_codec.go @@ -117,7 +117,7 @@ func (i *handler) serveCodec(ctx context.Context, w http.ResponseWriter, r *http toCodec, ok := contentTypeToCodec[requestedContentType] if !ok { // This is never supposed to happen unless function is called with wrong parameters. - err := fmt.Errorf("unsupported content type: %s", requestedContentType) + err := fmt.Errorf("unsupported content type: %q", requestedContentType) webError(w, err, http.StatusInternalServerError) return false } diff --git a/gateway/handler_tar.go b/gateway/handler_tar.go index b4a06b4ef..569c031d4 100644 --- a/gateway/handler_tar.go +++ b/gateway/handler_tar.go @@ -26,8 +26,8 @@ func (i *handler) serveTAR(ctx context.Context, w http.ResponseWriter, r *http.R // Get Unixfs file file, err := i.api.GetUnixFsNode(ctx, resolvedPath) if err != nil { - err = fmt.Errorf("error getting unixfs node for %s: %w", html.EscapeString(contentPath.String()), err) - webError(w, err, http.StatusBadRequest) + err = fmt.Errorf("error getting UnixFS node for %s: %w", html.EscapeString(contentPath.String()), err) + webError(w, err, http.StatusInternalServerError) return false } defer file.Close() diff --git a/gateway/handler_test.go b/gateway/handler_test.go index 727d24501..a99e99780 100644 --- a/gateway/handler_test.go +++ b/gateway/handler_test.go @@ -75,7 +75,7 @@ func TestGatewayTimeoutBubblingFromAPI(t *testing.T) { ts := newTestServer(t, api) t.Logf("test server url: %s", ts.URL) - req, err := http.NewRequest(http.MethodGet, ts.URL+"/ipns/ipfs.io", nil) + req, err := http.NewRequest(http.MethodGet, ts.URL+"/ipns/en.wikipedia-on-ipfs.org", nil) if err != nil { t.Fatal(err) } @@ -95,7 +95,7 @@ func TestBadGatewayBubblingFromAPI(t *testing.T) { ts := newTestServer(t, api) t.Logf("test server url: %s", ts.URL) - req, err := http.NewRequest(http.MethodGet, ts.URL+"/ipns/ipfs.io", nil) + req, err := http.NewRequest(http.MethodGet, ts.URL+"/ipns/en.wikipedia-on-ipfs.org", nil) if err != nil { t.Fatal(err) } diff --git a/gateway/handler_unixfs.go b/gateway/handler_unixfs.go index deefa9cb8..28a0677d3 100644 --- a/gateway/handler_unixfs.go +++ b/gateway/handler_unixfs.go @@ -20,8 +20,8 @@ func (i *handler) serveUnixFS(ctx context.Context, w http.ResponseWriter, r *htt // Handling UnixFS dr, err := i.api.GetUnixFsNode(ctx, resolvedPath) if err != nil { - err = fmt.Errorf("error while getting unixfs node: %w", err) - webError(w, err, http.StatusBadRequest) + err = fmt.Errorf("error while getting UnixFS node: %w", err) + webError(w, err, http.StatusInternalServerError) return false } defer dr.Close()