Пример #1
0
        private async Task <string> DetectBoundaryKey(RebufferableStreamReader reader)
        {
            var line = await reader.ReadLineAsync();

            var boundary = string.Concat(line.Skip(2));

            reader.Rebuffer(encoding.GetBytes("--" + boundary + "\r\n"));
            return(boundary);
        }
Пример #2
0
        public MultiPartFormDataParser(Stream stream, Encoding e, string boundaryKey = null,
                                       int binaryBufferSize = DEFAULT_BUFFER_LENGTH)
        {
            encoding = e ?? Encoding.UTF8;
            reader   = new RebufferableStreamReader(stream, encoding);

            BinaryBufferSize = binaryBufferSize;
            Files            = new List <FilePart>();
            Parameters       = new Dictionary <string, string>();
        }
        public async Task ReadLineWhenReaderNoBuffer()
        {
            using (var ms = new MemoryStream(Encoding.Default.GetBytes(readerTestString)))
            {
                RebufferableStreamReader reader = new RebufferableStreamReader(ms, Encoding.Default);
                string line = await reader.ReadLineAsync();

                string nextLine = await reader.ReadLineAsync();

                Assert.AreEqual(line, "ni hao wo shi zhanghao");
                Assert.AreEqual(nextLine, "this is test!");
            }
        }
Пример #4
0
        private async Task ParseParameterPartAsync(RebufferableStreamReader reader, Dictionary <string, string> partHeaders)
        {
            StringBuilder value = new StringBuilder();
            string        line  = await reader.ReadLineAsync();

            while (line != endBoundary && line != boundary)
            {
                value.Append(line);
                line = await reader.ReadLineAsync();
            }

            if (line == endBoundary)
            {
                this.readEndBoundary = true;
            }
            Parameters[partHeaders["name"]] = value.ToString();
        }
        public async Task ReadLineWhenReaderHaveBufferAndNoLineInBuffer()
        {
            using (var ms = new MemoryStream(Encoding.Default.GetBytes(readerTestString)))
            {
                RebufferableStreamReader reader = new RebufferableStreamReader(ms, Encoding.Default);
                reader.Rebuffer(Encoding.Default.GetBytes(noLineBufferTestString));

                var line = await reader.ReadLineAsync();

                var secondLine = await reader.ReadLineAsync();

                var thirdLine = await reader.ReadLineAsync();

                Assert.AreEqual(line, noLineBufferTestString + "ni hao wo shi zhanghao");
                Assert.AreEqual(secondLine, "this is test!");
                Assert.IsTrue(string.IsNullOrEmpty(thirdLine));
            }
        }
        public async Task ReadLineWhenLineInBuffer()
        {
            using (var ms = new MemoryStream(Encoding.Default.GetBytes(readerTestString)))
            {
                RebufferableStreamReader reader = new RebufferableStreamReader(ms, Encoding.Default);
                reader.Rebuffer(Encoding.Default.GetBytes(lineBufferTestString));

                var line = await reader.ReadLineAsync();

                var secondLine = await reader.ReadLineAsync();

                var thirdLine = await reader.ReadLineAsync();

                Assert.AreEqual(line, "hahaha");
                Assert.AreEqual(secondLine, "hehe" + "ni hao wo shi zhanghao");
                Assert.AreEqual(thirdLine, "this is test!");

                reader.Rebuffer(Encoding.Default.GetBytes("hello world"));
                var fourLine = await reader.ReadLineAsync();

                Assert.AreEqual(fourLine, "hello world");
            }
        }
Пример #7
0
        private async Task ParseFilePartAsync(RebufferableStreamReader reader, Dictionary <string, string> partHeaders)
        {
            //先使用内存存储吧,遇到大文件肯定是不行的
            MemoryStream ms         = new MemoryStream();
            var          curBuffer  = new byte[this.BinaryBufferSize];
            var          prevBuffer = new byte[this.BinaryBufferSize];

            int curLength  = 0;
            int prevLength = await reader.ReadAsync(prevBuffer, 0, prevBuffer.Length);

            int endPos = -1;

            do
            {
                curLength = await reader.ReadAsync(curBuffer, 0, curBuffer.Length);

                var fullBuffer = new Byte[prevLength + curLength];
                Buffer.BlockCopy(prevBuffer, 0, fullBuffer, 0, prevLength);
                Buffer.BlockCopy(curBuffer, 0, fullBuffer, prevLength, curLength);

                int endBoundaryPos = SubsenquenceFinder.Search(fullBuffer, endBoundaryBytes);
                int boundaryPos    = SubsenquenceFinder.Search(fullBuffer, boundaryBytes);

                if (endBoundaryPos >= 0 && boundaryPos >= 0)
                {
                    if (boundaryPos < endBoundaryPos)
                    {
                        endPos = boundaryPos;
                    }
                    else
                    {
                        endPos = endBoundaryPos;
                        this.readEndBoundary = true;
                    }
                }
                else if (boundaryPos >= 0 && endBoundaryPos < 0)
                {
                    endPos = boundaryPos;
                }
                else if (endBoundaryPos >= 0 && boundaryPos < 0)
                {
                    endPos = endBoundaryPos;
                    this.readEndBoundary = true;
                }

                if (endPos != -1)
                {
                    //这里endPos减2的原因是去除CRLF
                    ms.Write(fullBuffer, 0, endPos - 2);
                    var rebuffer = new byte[fullBuffer.Length - endPos];
                    Buffer.BlockCopy(fullBuffer, endPos, rebuffer, 0, rebuffer.Length);
                    reader.Rebuffer(rebuffer);
                    ms.Flush();
                    ms.Position = 0;
                    FilePart filePart = new FilePart()
                    {
                        Filename = partHeaders["filename"],
                        Name     = partHeaders["name"],
                        Data     = ms
                    };

                    this.Files.Add(filePart);
                    return;
                }

                ms.Write(prevBuffer, 0, prevLength);
                ms.Flush();
                prevBuffer = curBuffer;
                prevLength = curLength;
            }while (prevLength > 0);

            if (endPos == -1)
            {
                ms.Close();
                throw new HttpRequestParseException("http报文实体格式错误");
            }
        }