Пример #1
0
        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))));
        }
Пример #2
0
        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)));
                }
            }
        }