From 6260455ba73e2f2bd16b068a72e98e48b037a179 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Thu, 9 Dec 2021 16:16:35 +0100 Subject: [PATCH] Make resource.Get return nil on 404 not found This is in line with the interface declaration and also how local lookups work. Fixes #9267 --- hugolib/resource_chain_test.go | 7 +++++++ resources/resource_factories/create/create.go | 13 +++++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/hugolib/resource_chain_test.go b/hugolib/resource_chain_test.go index 05e8a9d00..efd28a95d 100644 --- a/hugolib/resource_chain_test.go +++ b/hugolib/resource_chain_test.go @@ -413,11 +413,15 @@ CSS integrity Data first: {{ $cssFingerprinted1.Data.Integrity }} {{ $cssFingerp CSS integrity Data last: {{ $cssFingerprinted2.RelPermalink }} {{ $cssFingerprinted2.Data.Integrity }} {{ $rimg := resources.Get "%[1]s/sunset.jpg" }} +{{ $remotenotfound := resources.Get "%[1]s/notfound.jpg" }} +{{ $localnotfound := resources.Get "images/notfound.jpg" }} {{ $rfit := $rimg.Fit "200x200" }} {{ $rfit2 := $rfit.Fit "100x200" }} {{ $rimg = $rimg | fingerprint }} SUNSET REMOTE: {{ $rimg.Name }}|{{ $rimg.RelPermalink }}|{{ $rimg.Width }}|{{ len $rimg.Content }} FIT REMOTE: {{ $rfit.Name }}|{{ $rfit.RelPermalink }}|{{ $rfit.Width }} +REMOTE NOT FOUND: {{ if $remotenotfound }}FAILED{{ else}}OK{{ end }} +LOCAL NOT FOUND: {{ if $localnotfound }}FAILED{{ else}}OK{{ end }} `, ts.URL)) @@ -448,6 +452,9 @@ CSS integrity Data last: /styles2.min.1cfc52986836405d37f9998a63fd6dd8608e8c410 SUNSET REMOTE: sunset_%[1]s.jpg|/sunset_%[1]s.a9bf1d944e19c0f382e0d8f51de690f7d0bc8fa97390c4242a86c3e5c0737e71.jpg|900|90587 FIT REMOTE: sunset_%[1]s.jpg|/sunset_%[1]s_hu59e56ffff1bc1d8d122b1403d34e039f_0_200x200_fit_q75_box.jpg|200 +REMOTE NOT FOUND: OK +LOCAL NOT FOUND: OK + `, helpers.HashString(ts.URL+"/sunset.jpg", map[string]interface{}{}))) diff --git a/resources/resource_factories/create/create.go b/resources/resource_factories/create/create.go index 2616af83e..dc03568ac 100644 --- a/resources/resource_factories/create/create.go +++ b/resources/resource_factories/create/create.go @@ -35,6 +35,7 @@ import ( "github.com/gohugoio/hugo/hugofs" "github.com/gohugoio/hugo/cache/filecache" + "github.com/gohugoio/hugo/common/herrors" "github.com/gohugoio/hugo/common/hugio" "github.com/gohugoio/hugo/common/maps" "github.com/gohugoio/hugo/common/types" @@ -154,6 +155,7 @@ func (c *Client) FromString(targetPath, content string) (resource.Resource, erro // FromRemote expects one or n-parts of a URL to a resource // If you provide multiple parts they will be joined together to the final URL. func (c *Client) FromRemote(uri string, options map[string]interface{}) (resource.Resource, error) { + defer herrors.Recover() rURL, err := url.Parse(uri) if err != nil { return nil, errors.Wrapf(err, "failed to parse URL for resource %s", uri) @@ -186,8 +188,10 @@ func (c *Client) FromRemote(uri string, options map[string]interface{}) (resourc return nil, err } - if res.StatusCode < 200 || res.StatusCode > 299 { - return nil, errors.Errorf("failed to retrieve remote resource: %s", http.StatusText(res.StatusCode)) + if res.StatusCode != http.StatusNotFound { + if res.StatusCode < 200 || res.StatusCode > 299 { + return nil, errors.Errorf("failed to retrieve remote resource: %s", http.StatusText(res.StatusCode)) + } } httpResponse, err := httputil.DumpResponse(res, true) @@ -207,6 +211,11 @@ func (c *Client) FromRemote(uri string, options map[string]interface{}) (resourc return nil, err } + if res.StatusCode == http.StatusNotFound { + // Not found. This matches how looksup for local resources work. + return nil, nil + } + body, err := ioutil.ReadAll(res.Body) if err != nil { return nil, errors.Wrapf(err, "failed to read remote resource %s", uri)