public void Issue10054_ZeroRead()
        {
            // "HelloWorld" as UTF8/DeflateStream(...,CompressionMode.Compress)
            var buffer = new byte[] { 243, 72, 205, 201, 201, 15, 207, 47, 202, 73, 1, 0 };
            var mem    = new MemoryStream(buffer);
            var chu    = new ChunkedReader(mem);
            var def    = new DeflateStream(chu, CompressionMode.Decompress);

            var buffer2 = new byte[4096];
            int read2   = 0;

            chu.limit = 3;
            read2    += def.Read(buffer2, read2, buffer2.Length - read2);
            chu.limit = 100;
            read2    += def.Read(buffer2, read2, buffer2.Length - read2);

            var res = Encoding.UTF8.GetString(buffer2, 0, read2);

            Assert.AreEqual("HelloWorld", res);
        }
示例#2
0
        public void InitResponse()
        {
            SendHeaders();

            byte[] databuffer = new byte[65536];

            int readlen = 0;

            int dclrf = -1;

            while (dclrf == -1 && readlen < databuffer.Length)
            {
                int rc = _sock.Receive(databuffer, readlen, databuffer.Length - readlen, SocketFlags.None);
                if (rc == 0)
                {
                    throw (new Exception("ErrorFindDoubleCLRF"));
                }
                readlen += rc;
                dclrf    = IndexOfDoubleCRLF(databuffer, 0, readlen);
            }
            if (dclrf == -1)
            {
                throw (new Exception("ErrorFindDoubleCLRF"));
            }

            string[] lines          = Encoding.UTF8.GetString(databuffer, 0, dclrf).Split(new string[] { "\r\n" }, StringSplitOptions.None);
            string[] firstlineparts = lines[0].Split(new char[] { ' ' }, 3);
            if (firstlineparts[0] != "HTTP/1.1" && firstlineparts[0] != "HTTP/1.0")
            {
                throw (new Exception("InvalidHttpVersion:" + firstlineparts[0]));
            }

            StatusCode = int.Parse(firstlineparts[1]);
            if (firstlineparts.Length > 2)
            {
                StatusDesc = firstlineparts[2];
            }

            for (int li = 1; li < lines.Length; li++)
            {
                string header = lines[li];
                int    pos    = header.IndexOf(':');
                if (pos == -1)
                {
                    throw (new Exception("ErrorParsingHeaders"));
                }
                string name  = header.Substring(0, pos).Trim();
                string value = header.Substring(pos + 1).Trim();
                _resheaders.Add(new KeyValuePair <string, string>(name, value));
                if (name == "Content-Encoding" && value == "chunked")
                {
                    _chunked = true;
                }
                if (name == "Content-Length")
                {
                    _contentlen = long.Parse(value);
                }
                if (name == "Connection" && value.Equals("keep-alive", StringComparison.OrdinalIgnoreCase))
                {
                    _keepalive = true;
                }
            }

            if (_chunked)
            {
                _reader = new ChunkedReader();
            }
            else
            {
                _reader = new ContentReader(_contentlen);
            }

            _reader._sock         = _sock;
            _reader._buffer       = databuffer;
            _reader._bufferindex  = dclrf + 4;
            _reader._bufferlength = readlen - dclrf - 4;
        }