diff --git a/gateway/gateway.go b/gateway/gateway.go index 86d2db8fb..00f983ca5 100644 --- a/gateway/gateway.go +++ b/gateway/gateway.go @@ -66,6 +66,18 @@ type GetRange struct { type GetResponse struct { bytes files.File directoryMetadata *directoryMetadata + closeFn func() error +} + +func (g *GetResponse) Close() error { + if g.closeFn == nil { + return nil + } + return g.closeFn() +} + +func (g *GetResponse) SetCloser(closeFn func() error) { + g.closeFn = closeFn } type directoryMetadata struct { diff --git a/gateway/handler_defaults.go b/gateway/handler_defaults.go index 205ac6064..2c53208e6 100644 --- a/gateway/handler_defaults.go +++ b/gateway/handler_defaults.go @@ -71,6 +71,7 @@ func (i *handler) serveDefaults(ctx context.Context, w http.ResponseWriter, r *h } } } + defer getResp.Close() if getResp.bytes != nil { bytesResponse = getResp.bytes defer bytesResponse.Close() diff --git a/gateway/handler_unixfs__redirects.go b/gateway/handler_unixfs__redirects.go index 3747d85d6..f241855e9 100644 --- a/gateway/handler_unixfs__redirects.go +++ b/gateway/handler_unixfs__redirects.go @@ -160,6 +160,7 @@ func (i *handler) getRedirectRules(r *http.Request, redirectsPath ImmutablePath) } return false, nil, err } + defer redirectsFileGetResp.Close() if redirectsFileGetResp.bytes == nil { return false, nil, fmt.Errorf(" _redirects is not a file") @@ -186,6 +187,7 @@ func (i *handler) serve4xx(w http.ResponseWriter, r *http.Request, content4xxPat if err != nil { return err } + defer getresp.Close() if getresp.bytes == nil { return fmt.Errorf("could not convert node for %d page to file", status) @@ -266,6 +268,7 @@ func (i *handler) searchUpTreeFor404(r *http.Request, imPath ImmutablePath) (fil if err != nil { continue } + defer getResp.Close() if getResp.bytes == nil { return nil, "", fmt.Errorf("found a pretty 404 but it was not a file") } diff --git a/gateway/handler_unixfs_dir.go b/gateway/handler_unixfs_dir.go index 6c5317246..5916f64ab 100644 --- a/gateway/handler_unixfs_dir.go +++ b/gateway/handler_unixfs_dir.go @@ -83,6 +83,7 @@ func (i *handler) serveDirectory(ctx context.Context, w http.ResponseWriter, r * var getResp *GetResponse _, getResp, err = i.api.Get(ctx, imIndexPath) if err == nil { + defer getResp.Close() if getResp.bytes == nil { webError(w, fmt.Errorf("%q could not be read: %w", imIndexPath, files.ErrNotReader), http.StatusUnprocessableEntity) return false