public static string Read(Stream stream, byte[] delimiterBytes) { var dataString = string.Empty; var byteBag = new List <byte>(); do { var boyerMoore = new BoyerMoore(delimiterBytes); var startIndex = stream.Position; var buffer4 = new byte[1024 * 1024]; var count = stream.Read(buffer4, 0, buffer4.Length); if (count >= delimiterBytes.Length) { var searchIndex = boyerMoore.IndexOf(buffer4.Take(count).ToArray()); if (searchIndex == -1) { byteBag.AddRange(buffer4.Take(count - (delimiterBytes.Length - 1))); stream.Seek(1 - delimiterBytes.Length, SeekOrigin.Current); } else { if (byteBag.Count > 0) { dataString = Encoding.UTF8.GetString(byteBag.ToArray()); byteBag.Clear(); } dataString += Encoding.UTF8.GetString(buffer4.Take(searchIndex).ToArray()); stream.Seek(startIndex + searchIndex + delimiterBytes.Length, SeekOrigin.Begin); break; } } }while (stream.Position < stream.Length); return(dataString); }
public static void ProcessStream(HttpRequest httpRequest, Stream stream, string boundaryString, string session) { var headerBytes = Encoding.UTF8.GetBytes("--" + boundaryString + Environment.NewLine); var trailerBytes = Encoding.UTF8.GetBytes(Environment.NewLine + boundaryString + "--" + Environment.NewLine); var boundaryBytes = Encoding.UTF8.GetBytes(Environment.NewLine + "--" + boundaryString + Environment.NewLine); var delimiterBytes = Encoding.UTF8.GetBytes(Environment.NewLine + "--" + boundaryString); stream.Seek(headerBytes.Length, SeekOrigin.Begin); using (var binaryReader = new BinaryReader(stream)) { var contentLength = stream.Length; while (stream.Position < contentLength - trailerBytes.Length) { var dataString = DelimiterHelper.Read(stream); if (dataString.StartsWith("Content-Disposition: form-data;")) { var dataSegments = dataString.Split(';'); if (dataSegments.Length > 1) { var name = string.Empty; var stringPair = dataSegments[1].Split('='); if (stringPair.Length == 2 && string.Compare(stringPair[0], "name") != 0) { name = stringPair[1]; } if (dataSegments.Length > 2) { stringPair = dataSegments[2].Split('='); if (stringPair.Length == 2 && string.Compare(stringPair[0], "filename") != 0) { var httpFile = new HttpFile(); httpFile.Name = name; httpFile.FileName = stringPair[1].Trim('"'); dataString = DelimiterHelper.Read(stream); if (dataString.StartsWith("Content-Type:")) { httpFile.ContentType = dataString.Substring("Content-Type:".Length + 1); httpRequest.Files.Add(httpFile); } //read binary data; if (DelimiterHelper.Next(stream)) { var startIndex = stream.Position; var boyerMoore = new BoyerMoore(boundaryBytes); do { var buffer2 = binaryReader.ReadBytes(1024 * 1024); var searchIndex = boyerMoore.IndexOf(buffer2); if (searchIndex == -1) { stream.Seek(1 - boundaryBytes.Length, SeekOrigin.Current); } else { if (searchIndex > 0) { var memoryMappedFile = MemoryMappedFile.OpenExisting(session); httpFile.Stream = memoryMappedFile.CreateViewStream(startIndex, searchIndex); } stream.Seek(startIndex + searchIndex + boundaryBytes.Length, SeekOrigin.Begin); break; } } while (stream.Position < contentLength - trailerBytes.Length); } } } else if (dataSegments.Length == 2) { if (dataSegments[1].Trim().StartsWith("name=\"")) { name = dataSegments[1].TrimEnd('"').Substring(" name=\"".Length); if (DelimiterHelper.Next(stream)) { httpRequest.Form[name] = DelimiterHelper.Read(stream, delimiterBytes); stream.Seek(2, SeekOrigin.Current); } } } } } } } }