summaryrefslogtreecommitdiffstats
path: root/resources
diff options
context:
space:
mode:
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2021-12-21 10:35:33 +0100
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2021-12-22 11:35:53 +0100
commit6779117f72e2d92f708cff2bfc004d2cfd7d068b (patch)
tree1c6f9243575e95756bf68942a8c40a835e76bbe0 /resources
parentce04011096456c77479fa98a6ceee242aeac7919 (diff)
media: Also consider extension in FromContent
As used in `resources.GetRemote`. This will now reject image files with text and text files with images.
Diffstat (limited to 'resources')
-rw-r--r--resources/resource_factories/create/remote.go29
1 files changed, 18 insertions, 11 deletions
diff --git a/resources/resource_factories/create/remote.go b/resources/resource_factories/create/remote.go
index f6d3f13dd..f127f8edc 100644
--- a/resources/resource_factories/create/remote.go
+++ b/resources/resource_factories/create/remote.go
@@ -110,21 +110,30 @@ func (c *Client) FromRemote(uri string, optionsm map[string]interface{}) (resour
}
}
- var extensionHint string
-
- if arr, _ := mime.ExtensionsByType(res.Header.Get("Content-Type")); len(arr) == 1 {
- extensionHint = arr[0]
+ var extensionHints []string
+
+ contentType := res.Header.Get("Content-Type")
+
+ // mime.ExtensionsByType gives a long list of extensions for text/plain,
+ // just use ".txt".
+ if strings.HasPrefix(contentType, "text/plain") {
+ extensionHints = []string{".txt"}
+ } else {
+ exts, _ := mime.ExtensionsByType(contentType)
+ if exts != nil {
+ extensionHints = exts
+ }
}
- // Look for a file extention
- if extensionHint == "" {
+ // Look for a file extention. If it's .txt, look for a more specific.
+ if extensionHints == nil || extensionHints[0] == ".txt" {
if ext := path.Ext(filename); ext != "" {
- extensionHint = ext
+ extensionHints = []string{ext}
}
}
// Now resolve the media type primarily using the content.
- mediaType := media.FromContent(c.rs.MediaTypes, extensionHint, body)
+ mediaType := media.FromContent(c.rs.MediaTypes, extensionHints, body)
if mediaType.IsZero() {
return nil, errors.Errorf("failed to resolve media type for remote resource %q", uri)
}
@@ -140,7 +149,6 @@ func (c *Client) FromRemote(uri string, optionsm map[string]interface{}) (resour
},
RelTargetFilename: filepath.Clean(resourceID),
})
-
}
func (c *Client) validateFromRemoteArgs(uri string, options fromRemoteOptions) error {
@@ -213,7 +221,7 @@ func (o fromRemoteOptions) BodyReader() io.Reader {
}
func decodeRemoteOptions(optionsm map[string]interface{}) (fromRemoteOptions, error) {
- var options = fromRemoteOptions{
+ options := fromRemoteOptions{
Method: "GET",
}
@@ -224,5 +232,4 @@ func decodeRemoteOptions(optionsm map[string]interface{}) (fromRemoteOptions, er
options.Method = strings.ToUpper(options.Method)
return options, nil
-
}