public static Base64ParserResult Parse(ReadOnlySpan <char> data, string fileName) { var commaPos = data.IndexOf(','); if (commaPos == -1) { throw new ArgumentException($"Invalid data payload for {fileName}"); } var headerEnumerator = data.Slice(0, commaPos).ToLower().Split(';'); headerEnumerator.MoveNext(); var ctPartEnumerator = headerEnumerator.Current.Split(':'); var ctPartLength = ctPartEnumerator.Last(out var ctPart); var contentType = ctPartLength > 1 ? ctPart : string.Empty; var isBase64 = false; var charsetToken = "charset".AsSpan(); var base64Token = "base64".AsSpan(); if (headerEnumerator.MoveNext()) { if (headerEnumerator.Current.StartsWith(charsetToken)) { var charsetPart = headerEnumerator.Current.Split('='); var charsetPartLen = charsetPart.Last(out _); //TODO Work with charset if (charsetPartLen == 2) { //TODO Charset now not using } else { throw new ArgumentException($"Invalid charset description for {fileName}"); } } else if (headerEnumerator.Current.SequenceEqual(base64Token)) { isBase64 = true; } if (!isBase64 && headerEnumerator.MoveNext()) { isBase64 = headerEnumerator.Current.SequenceEqual(base64Token); } } if (!isBase64) { throw new ArgumentException($"Invalid encoding type for {fileName}"); } return(new Base64ParserResult(contentType , bytes: Base64ConvertHelper.ConvertToBytes(data.Slice(commaPos + 1)))); }
public static IEnumerable <Upload> AsFileDescriptors(this IEnumerable <Base64FilePayload> files, IContentTypeTestUtility contentTypeTestUtility) { var number = 0U; foreach (var rawFile in files) { string contentType; var data = rawFile.RawData.AsSpan(); ReadOnlyMemory <byte> byteArr; if (data.StartsWith(Base64FilePayload.DataToken.AsSpan(), StringComparison.InvariantCultureIgnoreCase)) { (contentType, byteArr) = Base64Parser.Parse(data, rawFile.Name); } else { byteArr = Base64ConvertHelper.ConvertToBytes(data); contentType = string.Empty; } if (string.IsNullOrEmpty(contentType)) { contentType = contentTypeTestUtility.DetectContentType(byteArr.Slice(0, 4).Span); } if (contentTypeTestUtility.IsAllowed(contentType)) { yield return(new Upload( id: Guid.NewGuid(), previewId: Guid.NewGuid(), num: number++, name: rawFile.Name, contentType: contentType, streamAdapter: new ByteaStreamAdapter(byteArr))); } } }