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); }
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); } }