summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2023-01-16 12:44:39 +0100
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2023-01-16 14:44:15 +0100
commit6a579ebac3a81df61f22988e3eb55f7cb35ce523 (patch)
tree42eff3d1ab464a53cde88b619b0f6938bf71efed
parentf13531e608ac36cce9d679f6742a112cbab8afd1 (diff)
Add fill HTTP Response info into .Data in resources.GetRemote
See #10604
-rwxr-xr-xdocs/content/en/hugo-pipes/introduction.md14
-rw-r--r--resources/resource.go2
-rw-r--r--resources/resource_factories/create/integration_test.go7
-rw-r--r--resources/resource_factories/create/remote.go2
-rw-r--r--resources/resource_spec.go9
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)