bool RunTestData(byte[] data)
        {
            m_Log.InfoFormat("Testing {0} bytes of data", data.Length);
            byte[] encoded;
            var    decoded = new byte[data.Length];

            using (var ms = new MemoryStream())
            {
                using (var write = new HttpWriteChunkedBodyStream(ms))
                {
                    write.Write(data, 0, data.Length);
                }
                encoded = ms.ToArray();
            }

            using (var ms = new MemoryStream(encoded))
            {
                using (var read = new HttpReadChunkedBodyStream(ms))
                {
                    int rcvdbytes = read.Read(decoded, 0, data.Length);
                    if (data.Length != rcvdbytes)
                    {
                        m_Log.ErrorFormat("chunked stream does not contain all input bytes ({0}!={1})", data.Length, rcvdbytes);
                        return(false);
                    }
                    var t = new byte[1];
                    if (read.Read(t, 0, 1) != 0)
                    {
                        m_Log.Error("chunked stream does not end with last byte");
                        return(false);
                    }
                }
            }

            int i;

            for (i = 0; i < data.Length; ++i)
            {
                if (data[i] != decoded[i])
                {
                    m_Log.ErrorFormat("Compare error at byte position {0}", i);
                    return(false);
                }
            }
            return(true);
        }
Example #2
0
        private static Stream GetResponseBodyStream(IDictionary <string, string> headers, Uri uri, string[] splits, string method, AbstractHttpStream s)
        {
            string value;
            string compressedresult = string.Empty;

            if (headers.TryGetValue("content-encoding", out value) || headers.TryGetValue("x-content-encoding", out value))
            {
                /* Content-Encoding */
                /* x-gzip is deprecated but better feel safe about having that */
                if (value == "gzip" || value == "x-gzip")
                {
                    compressedresult = "gzip";
                }
                else if (value == "deflate")
                {
                    compressedresult = "deflate";
                }
                else
                {
                    throw new NotSupportedException("Unsupport content-encoding");
                }
            }

            if (splits[0] == "HTTP/1.0")
            {
                s.IsReusable = false;
            }

            if (headers.TryGetValue("connection", out value))
            {
                value = value.Trim().ToLower();
                if (value == "keep-alive")
                {
                    s.IsReusable = true;
                }
                else if (value == "close")
                {
                    s.IsReusable = false;
                }
            }

            if (method == "HEAD")
            {
                /* HEAD does not have any response data */
                return(new ResponseBodyStream(s, 0, uri.Scheme, uri.Host, uri.Port));
            }
            else if (headers.TryGetValue("content-length", out value))
            {
                long contentLength;
                if (!long.TryParse(value, out contentLength))
                {
                    throw new BadHttpResponseException("Unparseable length in response");
                }
                Stream bs = new ResponseBodyStream(s, contentLength, uri.Scheme, uri.Host, uri.Port);
                if (headers.TryGetValue("transfer-encoding", out value) && value == "chunked")
                {
                    bs = new HttpReadChunkedBodyStream(bs);
                }
                if (compressedresult.Length != 0)
                {
                    if (compressedresult == "gzip")
                    {
                        bs = new GZipStream(bs, CompressionMode.Decompress);
                    }
                    else if (compressedresult == "deflate")
                    {
                        bs = new DeflateStream(bs, CompressionMode.Decompress);
                    }
                }
                return(bs);
            }
            else
            {
                Stream bs = s;
                if (headers.TryGetValue("transfer-encoding", out value) && value == "chunked")
                {
                    bs = new BodyResponseChunkedStream(s, uri.Scheme, uri.Host, uri.Port);
                }
                else
                {
                    s.IsReusable = false;
                }
                if (compressedresult.Length != 0)
                {
                    if (compressedresult == "gzip")
                    {
                        bs = new GZipStream(bs, CompressionMode.Decompress);
                    }
                    else if (compressedresult == "deflate")
                    {
                        bs = new DeflateStream(bs, CompressionMode.Decompress);
                    }
                }
                return(bs);
            }
        }