Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/gohugoio/hugo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2022-03-24 10:12:51 +0300
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2022-03-25 18:40:36 +0300
commit9202117ba08286975c723130db60a1c69ff249a0 (patch)
tree2b5bc26059e47045edaa4bb5ddeb89f4da6a68cd /resources
parenta6fa290f67a858e813480cd19bd5e8e1088771d2 (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.go52
-rw-r--r--resources/page/page_nop.go2
-rw-r--r--resources/page/testhelpers_test.go2
-rw-r--r--resources/resource.go2
-rw-r--r--resources/resource/resourcetypes.go31
-rw-r--r--resources/resource_factories/create/remote.go48
-rw-r--r--resources/transform.go2
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
}