public connectionHandler(Socket socket, HttpServer server, bool secure) { Socket = socket; _requestId = Rnd.Next(); _requestStart = DateTime.UtcNow; _server = server; _secure = secure; _server.Log.Info(4, "{0:X8} Incoming connection from {1}".Fmt(_requestId, socket.RemoteEndPoint)); _buffer = new byte[1024]; _bufferDataOffset = 0; _bufferDataLength = 0; _headersSoFar = ""; lock (server._activeConnectionHandlers) server._activeConnectionHandlers.Add(this); var stream = new NetworkStream(socket, ownsSocket: true); if (_secure) { var secureStream = new SslStream(stream); _stream = secureStream; secureStream.BeginAuthenticateAsServer(new X509Certificate2(server.Options.CertificatePath, server.Options.CertificatePassword), false, SslProtocols.Tls | SslProtocols.Tls11 | SslProtocols.Tls12, true, ar => { try { secureStream.EndAuthenticateAsServer(ar); } catch (Exception e) { Socket.Close(); cleanupIfDone(); if (_server.ResponseExceptionHandler != null) _server.ResponseExceptionHandler(null, e, null); return; } receiveMoreHeaderData(); }, null); } else { _stream = stream; receiveMoreHeaderData(); } }
void ProcessConnection(Socket listener, IAsyncResult ar) { Socket ns = listener.EndAccept (ar); ns.NoDelay = true; SslStream ssl = new SslStream (new NetworkStream (ns, true)); ssl.BeginAuthenticateAsServer (cert, (IAsyncResult ar2) => { try { ssl.EndAuthenticateAsServer (ar2); Protocol p = new Protocol (); p.OnMessage += (incoming) => { var hdr = incoming.Header; // TODO timeout handling if (hdr ["type"].AsString(null) != "request") { Logger.LogError ("received non-request"); incoming.Discard (); return; } if (!hdr.ContainsKey ("request_id")) { Logger.LogError ("Received request with no request_id"); incoming.Discard (); return; } var id = hdr ["request_id"]; reqh (incoming, (reply) => { reply.Header ["type"] = "reply"; reply.Header ["request_id"] = id; p.SendMessage (reply); }); }; p.OnClose += (error) => { Logger.LogInfo ("scamp connection closed: {0}", error); }; p.Start (ssl); } catch (Exception ex) { Logger.LogError ("connection server authenticate: {0}", ex); } }, null); }