{"record":{"id":"056d5d92ef7ed245","repo":"gohugoio/hugo","slug":"failed-to-resolve-media-type-for-remote-resource","errorCode":null,"errorMessage":"failed to resolve media type for remote resource %q","messagePattern":"failed to resolve media type for remote resource %q","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"resources/resource_factories/create/remote.go","lineNumber":349,"sourceCode":"\t\t\t\tif exts != nil {\n\t\t\t\t\textensionHints = exts\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Look for a file extension. If it's .txt, look for a more specific.\n\t\t\tif extensionHints == nil || extensionHints[0] == \".txt\" {\n\t\t\t\tif ext := path.Ext(filename); ext != \"\" {\n\t\t\t\t\textensionHints = []string{ext}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Now resolve the media type primarily using the content.\n\t\t\tmediaType = media.FromContent(c.rs.MediaTypes(), extensionHints, body)\n\n\t\t}\n\n\t\tif mediaType.IsZero() {\n\t\t\treturn nil, fmt.Errorf(\"failed to resolve media type for remote resource %q\", uri)\n\t\t}\n\n\t\tuserKey = filename[:len(filename)-len(path.Ext(filename))] + \"_\" + userKey + mediaType.FirstSuffix.FullSuffix\n\t\tdata := responseToData(res, false, options.ResponseHeaders)\n\n\t\treturn c.rs.NewResource(\n\t\t\tresources.ResourceSourceDescriptor{\n\t\t\t\tMediaType:     mediaType,\n\t\t\t\tData:          data,\n\t\t\t\tGroupIdentity: identity.StringIdentity(optionsKey),\n\t\t\t\tLazyPublish:   true,\n\t\t\t\tOpenReadSeekCloser: func() (hugio.ReadSeekCloser, error) {\n\t\t\t\t\treturn hugio.NewReadSeekerNoOpCloser(bytes.NewReader(body)), nil\n\t\t\t\t},\n\t\t\t\tTargetPath: userKey,\n\t\t\t})\n\t})\n}","sourceCodeStart":331,"sourceCodeEnd":367,"githubUrl":"https://github.com/gohugoio/hugo/blob/52c9bd7908b4d02d4d0ff8f82a888834d6ee10d2/resources/resource_factories/create/remote.go#L331-L367","documentation":"Returned by `Client.FromRemote` (remote.go:347-350) when, after exhausting every resolution path -- `Content-Type` header lookup in configured MediaTypes, `media.FromString`, file-extension hints, and content-based detection via `media.FromContent` -- the media type is still zero. Hugo refuses to create a Resource without a known media type because downstream pipelines (target path, suffix, transforms) all depend on it.","triggerScenarios":"Remote response has no `Content-Type` header, the URL has no recognizable file extension, and the body content is ambiguous or empty (so `media.FromContent` cannot classify). Also when the `Content-Type` is set but not in the allowed `security.http.mediaTypes` set and content sniffing also fails.","commonSituations":"Fetching JSON from an endpoint that returns no Content-Type and a body shorter than sniff thresholds; fetching binary blobs with generic `application/octet-stream` excluded by security policy; fetching from a server that returns 200 with empty body; misconfigured `mediaTypes` in hugo.toml so a valid type string isn't recognized; CDN stripping Content-Type.","solutions":["Add the `Content-Type` server-side, or have the endpoint return one.","Provide a URL with a clear file extension (e.g. append `?format=json` is not enough -- use a real path component).","Allow the relevant media type in `security.http.mediaTypes` config.","If the body is real but untyped, save it locally and create the resource with `resources.FromString`/`resources.Get` plus explicit `MediaType`.","Confirm the response is non-empty (an empty 200 body defeats content sniffing)."],"exampleFix":"// hugo.toml -- before\n[security.http.mediaTypes]\nallowed = []\n\n// after\n[security.http.mediaTypes]\nallowed = [\"application/json\"]","handlingStrategy":"validation","validationCode":"// Probe Content-Type before relying on the resource.\nimport (\n\t\"net/http\"\n)\nfunc probeContentType(url string) (string, error) {\n\tresp, err := http.Head(url)\n\tif err != nil { return \"\", err }\n\treturn resp.Header.Get(\"Content-Type\"), nil\n}","typeGuard":null,"tryCatchPattern":"// Fallback: fetch bytes, write locally, create typed resource.\nif r, err := resources.GetRemote(url); err != nil {\n\tif strings.Contains(err.Error(), \"failed to resolve media type\") {\n\t\tbody := fetchBytes(url)\n\t\treturn resources.FromString(\"fetched.bin\", string(body)), nil\n\t}\n}","preventionTips":["Ensure endpoints send `Content-Type`.","Whitelist needed types under `security.http.mediaTypes`.","Use URLs with explicit file extensions for untyped endpoints."],"tags":["resources","remote","media-type","security","config"],"backgroundTag":null,"analyzedSha":"52c9bd7908b4d02d4d0ff8f82a888834d6ee10d2","analyzedAt":"2026-08-09T21:49:36.660Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}