]> git.maquefel.me Git - brevno-suite/hugo/commitdiff
Fix order when reading custom headers in resources.GetRemote
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Mon, 16 Jan 2023 10:00:55 +0000 (11:00 +0100)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Mon, 16 Jan 2023 13:44:15 +0000 (14:44 +0100)
Fixes #10616

resources/resource_factories/create/remote.go
resources/resource_factories/create/remote_test.go

index 51199dc935b07925f220528728450a063ec27950..fa5533d7b26e6106c63f05668271848fdb34253e 100644 (file)
@@ -91,15 +91,10 @@ func (c *Client) FromRemote(uri string, optionsm map[string]any) (resource.Resou
                        return nil, err
                }
 
-               req, err := http.NewRequest(options.Method, uri, options.BodyReader())
+               req, err := options.NewRequest(uri)
                if err != nil {
                        return nil, fmt.Errorf("failed to create request for resource %s: %w", uri, err)
                }
-               addDefaultHeaders(req)
-
-               if options.Headers != nil {
-                       addUserProvidedHeaders(options.Headers, req)
-               }
 
                res, err := c.httpClient.Do(req)
                if err != nil {
@@ -207,12 +202,7 @@ func calculateResourceID(uri string, optionsm map[string]any) string {
        return helpers.HashString(uri, optionsm)
 }
 
-func addDefaultHeaders(req *http.Request, accepts ...string) {
-       for _, accept := range accepts {
-               if !hasHeaderValue(req.Header, "Accept", accept) {
-                       req.Header.Add("Accept", accept)
-               }
-       }
+func addDefaultHeaders(req *http.Request) {
        if !hasHeaderKey(req.Header, "User-Agent") {
                req.Header.Add("User-Agent", "Hugo Static Site Generator")
        }
@@ -264,6 +254,23 @@ func (o fromRemoteOptions) BodyReader() io.Reader {
        return bytes.NewBuffer(o.Body)
 }
 
+func (o fromRemoteOptions) NewRequest(url string) (*http.Request, error) {
+       req, err := http.NewRequest(o.Method, url, o.BodyReader())
+       if err != nil {
+               return nil, err
+       }
+
+       // First add any user provided headers.
+       if o.Headers != nil {
+               addUserProvidedHeaders(o.Headers, req)
+       }
+
+       // Then add default headers not provided by the user.
+       addDefaultHeaders(req)
+
+       return req, nil
+}
+
 func decodeRemoteOptions(optionsm map[string]any) (fromRemoteOptions, error) {
        options := fromRemoteOptions{
                Method: "GET",
index c2a3b7b32752b890c8003ca4be9350674e126fe7..a443a063394cfaff4005b5400d4e111f5270df66 100644 (file)
@@ -20,6 +20,8 @@ import (
 )
 
 func TestDecodeRemoteOptions(t *testing.T) {
+       t.Parallel()
+
        c := qt.New(t)
 
        for _, test := range []struct {
@@ -81,10 +83,43 @@ func TestDecodeRemoteOptions(t *testing.T) {
                })
 
        }
+}
+
+func TestOptionsNewRequest(t *testing.T) {
+       t.Parallel()
+
+       c := qt.New(t)
+
+       opts := fromRemoteOptions{
+               Method: "GET",
+               Body:   []byte("foo"),
+       }
+
+       req, err := opts.NewRequest("https://example.com/api")
+
+       c.Assert(err, qt.IsNil)
+       c.Assert(req.Method, qt.Equals, "GET")
+       c.Assert(req.Header["User-Agent"], qt.DeepEquals, []string{"Hugo Static Site Generator"})
+
+       opts = fromRemoteOptions{
+               Method: "GET",
+               Body:   []byte("foo"),
+               Headers: map[string]any{
+                       "User-Agent": "foo",
+               },
+       }
+
+       req, err = opts.NewRequest("https://example.com/api")
+
+       c.Assert(err, qt.IsNil)
+       c.Assert(req.Method, qt.Equals, "GET")
+       c.Assert(req.Header["User-Agent"], qt.DeepEquals, []string{"foo"})
 
 }
 
 func TestCalculateResourceID(t *testing.T) {
+       t.Parallel()
+
        c := qt.New(t)
 
        c.Assert(calculateResourceID("foo", nil), qt.Equals, "5917621528921068675")