コード例 #1
0
ファイル: HttpServer.cs プロジェクト: TonyZhu2015/Playground
        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);
        }
コード例 #2
0
ファイル: HttpServer.cs プロジェクト: TonyZhu2015/Playground
        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);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }