diff options
author | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2022-03-24 10:12:51 +0300 |
---|---|---|
committer | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2022-03-25 18:40:36 +0300 |
commit | 9202117ba08286975c723130db60a1c69ff249a0 (patch) | |
tree | 2b5bc26059e47045edaa4bb5ddeb89f4da6a68cd /resources | |
parent | a6fa290f67a858e813480cd19bd5e8e1088771d2 (diff) |
resources: Add more details to .Err
This commit adds a .Data object (a map with `Body`, `StatusCode` etc.) to the .Err returned from `resources.GetRemote`, which means you can now do:
```
{{ with .Err }}
{{ range $k, $v := .Data }}
{{ end }}
{{ end }}
```
Fixes #9708
Diffstat (limited to 'resources')
-rw-r--r-- | resources/errorResource.go | 52 | ||||
-rw-r--r-- | resources/page/page_nop.go | 2 | ||||
-rw-r--r-- | resources/page/testhelpers_test.go | 2 | ||||
-rw-r--r-- | resources/resource.go | 2 | ||||
-rw-r--r-- | resources/resource/resourcetypes.go | 31 | ||||
-rw-r--r-- | resources/resource_factories/create/remote.go | 48 | ||||
-rw-r--r-- | resources/transform.go | 2 |
7 files changed, 101 insertions, 38 deletions
diff --git a/resources/errorResource.go b/resources/errorResource.go index 70f05d3f7..50f0be371 100644 --- a/resources/errorResource.go +++ b/resources/errorResource.go @@ -19,9 +19,7 @@ import ( "github.com/gohugoio/hugo/common/hugio" "github.com/gohugoio/hugo/common/maps" "github.com/gohugoio/hugo/media" - "github.com/gohugoio/hugo/resources/images/exif" - "github.com/gohugoio/hugo/resources/resource" ) @@ -40,94 +38,94 @@ var ( ) // NewErrorResource wraps err in a Resource where all but the Err method will panic. -func NewErrorResource(err error) resource.Resource { - return &errorResource{error: err} +func NewErrorResource(err resource.ResourceError) resource.Resource { + return &errorResource{ResourceError: err} } type errorResource struct { - error + resource.ResourceError } -func (e *errorResource) Err() error { - return e.error +func (e *errorResource) Err() resource.ResourceError { + return e.ResourceError } func (e *errorResource) ReadSeekCloser() (hugio.ReadSeekCloser, error) { - panic(e.error) + panic(e.ResourceError) } func (e *errorResource) Content() (any, error) { - panic(e.error) + panic(e.ResourceError) } func (e *errorResource) ResourceType() string { - panic(e.error) + panic(e.ResourceError) } func (e *errorResource) MediaType() media.Type { - panic(e.error) + panic(e.ResourceError) } func (e *errorResource) Permalink() string { - panic(e.error) + panic(e.ResourceError) } func (e *errorResource) RelPermalink() string { - panic(e.error) + panic(e.ResourceError) } func (e *errorResource) Name() string { - panic(e.error) + panic(e.ResourceError) } func (e *errorResource) Title() string { - panic(e.error) + panic(e.ResourceError) } func (e *errorResource) Params() maps.Params { - panic(e.error) + panic(e.ResourceError) } func (e *errorResource) Data() any { - panic(e.error) + panic(e.ResourceError) } func (e *errorResource) Height() int { - panic(e.error) + panic(e.ResourceError) } func (e *errorResource) Width() int { - panic(e.error) + panic(e.ResourceError) } func (e *errorResource) Crop(spec string) (resource.Image, error) { - panic(e.error) + panic(e.ResourceError) } func (e *errorResource) Fill(spec string) (resource.Image, error) { - panic(e.error) + panic(e.ResourceError) } func (e *errorResource) Fit(spec string) (resource.Image, error) { - panic(e.error) + panic(e.ResourceError) } func (e *errorResource) Resize(spec string) (resource.Image, error) { - panic(e.error) + panic(e.ResourceError) } func (e *errorResource) Filter(filters ...any) (resource.Image, error) { - panic(e.error) + panic(e.ResourceError) } func (e *errorResource) Exif() *exif.Exif { - panic(e.error) + panic(e.ResourceError) } func (e *errorResource) DecodeImage() (image.Image, error) { - panic(e.error) + panic(e.ResourceError) } func (e *errorResource) Transform(...ResourceTransformation) (ResourceTransformer, error) { - panic(e.error) + panic(e.ResourceError) } diff --git a/resources/page/page_nop.go b/resources/page/page_nop.go index 67b8b8d4b..cdc5fd8b1 100644 --- a/resources/page/page_nop.go +++ b/resources/page/page_nop.go @@ -48,7 +48,7 @@ var ( // PageNop implements Page, but does nothing. type nopPage int -func (p *nopPage) Err() error { +func (p *nopPage) Err() resource.ResourceError { return nil } diff --git a/resources/page/testhelpers_test.go b/resources/page/testhelpers_test.go index 675866799..3f6accdac 100644 --- a/resources/page/testhelpers_test.go +++ b/resources/page/testhelpers_test.go @@ -120,7 +120,7 @@ type testPage struct { sectionEntries []string } -func (p *testPage) Err() error { +func (p *testPage) Err() resource.ResourceError { return nil } diff --git a/resources/resource.go b/resources/resource.go index dd3a4730a..77cc11dde 100644 --- a/resources/resource.go +++ b/resources/resource.go @@ -233,7 +233,7 @@ func (l *genericResource) Content() (any, error) { return l.content, nil } -func (r *genericResource) Err() error { +func (r *genericResource) Err() resource.ResourceError { return nil } diff --git a/resources/resource/resourcetypes.go b/resources/resource/resourcetypes.go index 259706e2d..ae076ed9a 100644 --- a/resources/resource/resourcetypes.go +++ b/resources/resource/resourcetypes.go @@ -24,6 +24,11 @@ import ( "github.com/gohugoio/hugo/common/hugio" ) +var ( + _ ResourceDataProvider = (*resourceError)(nil) + _ ResourceError = (*resourceError)(nil) +) + // Cloner is an internal template and not meant for use in the templates. It // may change without notice. type Cloner interface { @@ -37,9 +42,33 @@ type OriginProvider interface { GetFieldString(pattern string) (string, bool) } +// NewResourceError creates a new ResourceError. +func NewResourceError(err error, data any) ResourceError { + return &resourceError{ + error: err, + data: data, + } +} + +type resourceError struct { + error + data any +} + +// The data associated with this error. +func (e *resourceError) Data() any { + return e.data +} + +// ResourceError is the error return from .Err in Resource in error situations. +type ResourceError interface { + error + ResourceDataProvider +} + // ErrProvider provides an Err. type ErrProvider interface { - Err() error + Err() ResourceError } // Resource represents a linkable resource, i.e. a content page, image etc. diff --git a/resources/resource_factories/create/remote.go b/resources/resource_factories/create/remote.go index 0beb87195..56bd99cb1 100644 --- a/resources/resource_factories/create/remote.go +++ b/resources/resource_factories/create/remote.go @@ -36,6 +36,41 @@ import ( "github.com/pkg/errors" ) +type HTTPError struct { + error + Data map[string]any + + StatusCode int + Body string +} + +func toHTTPError(err error, res *http.Response) *HTTPError { + if err == nil { + panic("err is nil") + } + if res == nil { + return &HTTPError{ + error: err, + Data: map[string]any{}, + } + } + + var body []byte + body, _ = ioutil.ReadAll(res.Body) + + return &HTTPError{ + error: err, + Data: map[string]any{ + "StatusCode": res.StatusCode, + "Status": res.Status, + "Body": string(body), + "TransferEncoding": res.TransferEncoding, + "ContentLength": res.ContentLength, + "ContentType": res.Header.Get("Content-Type"), + }, + } +} + // 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, optionsm map[string]any) (resource.Resource, error) { @@ -70,15 +105,16 @@ func (c *Client) FromRemote(uri string, optionsm map[string]any) (resource.Resou return nil, err } + httpResponse, err := httputil.DumpResponse(res, true) + if err != nil { + return nil, toHTTPError(err, res) + } + if res.StatusCode != http.StatusNotFound { if res.StatusCode < 200 || res.StatusCode > 299 { - return nil, errors.Errorf("failed to fetch remote resource: %s", http.StatusText(res.StatusCode)) - } - } + return nil, toHTTPError(errors.Errorf("failed to fetch remote resource: %s", http.StatusText(res.StatusCode)), res) - httpResponse, err := httputil.DumpResponse(res, true) - if err != nil { - return nil, err + } } return hugio.ToReadCloser(bytes.NewReader(httpResponse)), nil diff --git a/resources/transform.go b/resources/transform.go index cbf77363c..9b69ee37a 100644 --- a/resources/transform.go +++ b/resources/transform.go @@ -167,7 +167,7 @@ func (r *resourceAdapter) Content() (any, error) { return r.target.Content() } -func (r *resourceAdapter) Err() error { +func (r *resourceAdapter) Err() resource.ResourceError { return nil } |