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); }
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!"); } }
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"); } }
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报文实体格式错误"); } }