{"record":{"id":"62a689d5b2f0f7bb","repo":"iOfficeAI/OfficeCLI","slug":"only-base64-encoded-data-uris-are-supported","errorCode":null,"errorMessage":"Only base64-encoded data URIs are supported","messagePattern":"Only base64-encoded data URIs are supported","errorType":"exception","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"src/officecli/Core/FileSource.cs","lineNumber":138,"sourceCode":"        {\n            var mime = response.Content.Headers.ContentType?.MediaType;\n            ext = MimeToExtension(mime);\n        }\n\n        return (new MemoryStream(bytes), ext);\n    }\n\n    private static (MemoryStream, string) ResolveDataUri(string dataUri)\n    {\n        var commaIdx = dataUri.IndexOf(',');\n        if (commaIdx < 0)\n            throw new ArgumentException(\"Invalid data URI: missing comma separator\");\n\n        var header = dataUri[..commaIdx];\n        var data = dataUri[(commaIdx + 1)..];\n\n        if (!header.Contains(\"base64\", StringComparison.OrdinalIgnoreCase))\n            throw new ArgumentException(\"Only base64-encoded data URIs are supported\");\n\n        var mimeStart = header.IndexOf(':') + 1;\n        var mimeEnd = header.IndexOf(';');\n        var mime = mimeEnd > mimeStart ? header[mimeStart..mimeEnd] : header[mimeStart..];\n\n        var ext = MimeToExtension(mime);\n        return (new MemoryStream(Convert.FromBase64String(data)), ext);\n    }\n\n    private static string MimeToExtension(string? mime)\n    {\n        if (string.IsNullOrEmpty(mime)) return \"\";\n        return mime.ToLowerInvariant() switch\n        {\n            // Video\n            \"video/mp4\" => \".mp4\",\n            \"video/quicktime\" => \".mov\",\n            \"video/x-msvideo\" or \"video/avi\" => \".avi\",","sourceCodeStart":120,"sourceCodeEnd":156,"githubUrl":"https://github.com/iOfficeAI/OfficeCLI/blob/1ced45e900782c5083ed550ddf328ee974e425e7/src/officecli/Core/FileSource.cs#L120-L156","documentation":"Thrown by FileSource.ResolveDataUri when the data URI header (the part before the comma) does not contain 'base64'. The resolver only supports base64-encoded data URIs; raw/URL-encoded payloads are rejected.","triggerScenarios":"Calling FileSource.Resolve with a 'data:' URI whose header lacks the ';base64' marker, e.g. 'data:image/png,XYZ' (URL-encoded). The header is checked case-insensitively for 'base64'.","commonSituations":"Pasting a URL-encoded (non-base64) data URI from a browser/tool; generating a data URI without requesting base64 output; assuming raw text payloads are accepted.","solutions":["Encode the payload as base64 and include ';base64' in the header.","Use a helper that produces base64 data URIs (e.g. Convert.ToBase64String then prefix).","If the file is local, pass the filesystem path instead of a data URI."],"exampleFix":"// before\nFileSource.Resolve(\"data:image/png,%89PNG...\"); // URL-encoded, not base64\n// after\nFileSource.Resolve($\"data:image/png;base64,{Convert.ToBase64String(bytes)}\");","handlingStrategy":"validation","validationCode":"static string ToBase64DataUri(byte[] bytes, string mime = \"application/octet-stream\")\n    => $\"data:{mime};base64,{Convert.ToBase64String(bytes)}\";","typeGuard":"static bool IsBase64DataUri(string s)\n    => s.StartsWith(\"data:\", StringComparison.OrdinalIgnoreCase)\n       && s.AsSpan(0, s.IndexOf(',')).Contains(\";base64\", StringComparison.OrdinalIgnoreCase);","tryCatchPattern":"try { var r = FileSource.Resolve(dataUri); }\ncatch (ArgumentException ex) when (ex.Message.Contains(\"base64-encoded\"))\n{ /* re-encode payload as base64 */ }","preventionTips":["Always emit ';base64' in data-URI headers.","Use a builder helper rather than hand-formatting."],"tags":["file-source","data-uri","base64","validation"],"backgroundTag":null,"analyzedSha":"1ced45e900782c5083ed550ddf328ee974e425e7","analyzedAt":"2026-08-13T13:01:07.193Z","schemaVersion":2},"datasetVersion":"2026-08-13T14:17:21.547Z"}