From 6a579ebac3a81df61f22988e3eb55f7cb35ce523 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Mon, 16 Jan 2023 12:44:39 +0100 Subject: [PATCH] Add fill HTTP Response info into .Data in resources.GetRemote See #10604 --- docs/content/en/hugo-pipes/introduction.md | 14 ++++++++++++++ resources/resource.go | 2 ++ .../resource_factories/create/integration_test.go | 7 +++++-- resources/resource_factories/create/remote.go | 2 ++ resources/resource_spec.go | 9 +++++++-- 5 files changed, 30 insertions(+), 4 deletions(-) diff --git a/docs/content/en/hugo-pipes/introduction.md b/docs/content/en/hugo-pipes/introduction.md index c16572e48..116523fd5 100755 --- a/docs/content/en/hugo-pipes/introduction.md +++ b/docs/content/en/hugo-pipes/introduction.md @@ -50,6 +50,20 @@ With `resources.GetRemote`, the first argument is a remote URL: `resources.Get` and `resources.GetRemote` return `nil` if the resource is not found. +{{< new-in "0.110.0" >}} You can get information about the HTTP Response using `.Data` in the returned `Resource`. This is especially useful for HEAD request without any body. The Data object contains: + +StatusCode +: The HTTP status code, e.g. 200 +Status +: The HTTP status text, e.g. "200 OK" +TransferEncoding +: The transfer encoding, e.g. "chunked" +ContentLength +: The content length, e.g. 1234 +ContentType +: The content type, e.g. "text/html" + + ## Copy a Resource {{< new-in "0.100.0" >}} diff --git a/resources/resource.go b/resources/resource.go index fd60fd4f6..0d7d1d85a 100644 --- a/resources/resource.go +++ b/resources/resource.go @@ -70,6 +70,8 @@ type ResourceSourceDescriptor struct { Fs afero.Fs + Data map[string]any + // Set when its known up front, else it's resolved from the target filename. MediaType media.Type diff --git a/resources/resource_factories/create/integration_test.go b/resources/resource_factories/create/integration_test.go index e3a41d335..2d9a700d3 100644 --- a/resources/resource_factories/create/integration_test.go +++ b/resources/resource_factories/create/integration_test.go @@ -35,7 +35,7 @@ func TestGetResourceHead(t *testing.T) { {{ with .Err }} {{ errorf "Unable to get remote resource: %s" . }} {{ else }} - Head Content: {{ .Content }}. + Head Content: {{ .Content }}. Head Data: {{ .Data }} {{ end }} {{ else }} {{ errorf "Unable to get remote resource: %s" $url }} @@ -51,6 +51,9 @@ func TestGetResourceHead(t *testing.T) { b.Build() - b.AssertFileContent("public/index.html", "Head Content: .") + b.AssertFileContent("public/index.html", + "Head Content: .", + "Head Data: map[ContentLength:18210 ContentType:image/png Status:200 OK StatusCode:200 TransferEncoding:[]]", + ) } diff --git a/resources/resource_factories/create/remote.go b/resources/resource_factories/create/remote.go index 5216fff79..1ae5e095b 100644 --- a/resources/resource_factories/create/remote.go +++ b/resources/resource_factories/create/remote.go @@ -207,10 +207,12 @@ func (c *Client) FromRemote(uri string, optionsm map[string]any) (resource.Resou } resourceID = filename[:len(filename)-len(path.Ext(filename))] + "_" + resourceID + mediaType.FirstSuffix.FullSuffix + data := responseToData(res, false) return c.rs.New( resources.ResourceSourceDescriptor{ MediaType: mediaType, + Data: data, LazyPublish: true, OpenReadSeekCloser: func() (hugio.ReadSeekCloser, error) { return hugio.NewReadSeekerNoOpCloser(bytes.NewReader(body)), nil diff --git a/resources/resource_spec.go b/resources/resource_spec.go index 13920be7e..8ef693183 100644 --- a/resources/resource_spec.go +++ b/resources/resource_spec.go @@ -192,6 +192,7 @@ func (r *Spec) newGenericResource(sourceFs afero.Fs, sourceFilename, baseFilename, mediaType, + nil, ) } @@ -203,7 +204,9 @@ func (r *Spec) newGenericResourceWithBase( osFileInfo os.FileInfo, sourceFilename, baseFilename string, - mediaType media.Type) *genericResource { + mediaType media.Type, + data map[string]any, +) *genericResource { if osFileInfo != nil && osFileInfo.IsDir() { panic(fmt.Sprintf("dirs not supported resource types: %v", osFileInfo)) } @@ -244,6 +247,7 @@ func (r *Spec) newGenericResourceWithBase( name: baseFilename, title: baseFilename, resourceContent: &resourceContent{}, + data: data, } return g @@ -305,7 +309,8 @@ func (r *Spec) newResource(sourceFs afero.Fs, fd ResourceSourceDescriptor) (reso fi, sourceFilename, fd.RelTargetFilename, - mimeType) + mimeType, + fd.Data) if mimeType.MainType == "image" { imgFormat, ok := images.ImageFormatFromMediaSubType(mimeType.SubType)