コード例 #1
0
ファイル: HttpServer.cs プロジェクト: kodlar/r-i-m
        private void AcceptClient(TcpClient tcp)
        {
            string ip = tcp.Client.RemoteEndPoint.ToString().Split(':')[0];

            //check firewall
            if (Firewall != null && Firewall.Enabled && !Firewall.EntryAuthority(ip))
            {
                tcp.Close();
                return;
            }

            HttpResponse response = new HttpResponse();

            //ssl handshaking
            if (Options.UseSecureConnection)
            {
                SslStream sslStream = new SslStream(tcp.GetStream(), true);
                response.Stream = sslStream;
                try
                {
                    sslStream.AuthenticateAsServer(Certificate, false, true);
                }
                catch
                {
                    tcp.Close();
                    return;
                }
            }
            else
            {
                response.Stream = tcp.GetStream();
            }

            //create request
            string request_data = ReadRequest(response.Stream);

            if (request_data == null)
            {
                tcp.Close();
                return;
            }

            RequestReader reader  = new RequestReader();
            HttpRequest   request = reader.Read(request_data);

            request.IpAddress          = ip;
            request.IsSecureConnection = Options.UseSecureConnection;
            if (!string.IsNullOrEmpty(request.AcceptEncoding) && request.AcceptEncoding.Contains("gzip"))
            {
                response.ApplyGzip = true;
            }

            //handle request
            if (request.IsWebSocket)
            {
                ServerSocket client = SocketRequestHandler.HandshakeClient(this, request, tcp);
                client.Start();
            }
            else
            {
                if (RequestHandler == null)
                {
                    tcp.Close();
                    return;
                }

                RequestHandler.Request(this, request, response);
                ResponseWriter writer = new ResponseWriter();
                writer.Write(response);
                tcp.Close();
            }
        }