Пример #1
0
        public static BodyType?TryDetectFor(Head head, bool defaultNoBody)
        {
            // Reference: RFC 7320's 3.3.3
            TransferEncoding    encoding    = TransferEncoding.Binary;
            TransferCompression compression = TransferCompression.None;
            ulong?contentLen = null;

            if (head.Headers["Content-Length"] != null)
            {
                if (!ulong.TryParse(head.Headers["Content-Length"], out ulong len))
                {
                    return(null);
                }
                contentLen = len;
            }
            if (head.Headers["Transfer-Encoding"] == null)
            {
                if (contentLen == null && defaultNoBody)
                {
                    // 3.3.3.6
                    return(new BodyType(null, encoding = TransferEncoding.None, compression));
                }
                return(new BodyType(contentLen, encoding, compression));
            }
            string[] split = head.Headers["Transfer-Encoding"].Split(',');
            for (int i = 0; i < split.Length; i++)
            {
                switch (split[i].Trim())
                {
                case "chunked":
                    if (contentLen != null)
                    {
                        return(null);                        // 3.3.3.3
                    }
                    encoding = TransferEncoding.Chunked;
                    break;

                case "gzip":
                    if (compression != TransferCompression.None)
                    {
                        return(null);
                    }
                    compression = TransferCompression.Gzip;
                    break;

                case "deflate":
                    if (compression != TransferCompression.None)
                    {
                        return(null);
                    }
                    compression = TransferCompression.Deflate;
                    break;

                case "compress":
                    return(null);      // not implemented

                default: return(null); // unknown encoding
                }
            }
            return(new BodyType(contentLen, encoding, compression));
        }
Пример #2
0
 public BodyType(ulong?length, TransferEncoding encoding, TransferCompression compression) : this()
 {
     Length      = length;
     Encoding    = encoding;
     Compression = compression;
 }