void ServerSocketConnected(ref SelectControl selectControl, Socket serverSocket, Buf safeBuffer) { try { if (!clientSocket.Connected) { clientSocket.Close(); // Should already removed from selectControl if (!selectControl.ConnectionError && serverSocket.Connected) { if (AppLayerProxy.Logger != null) { AppLayerProxy.Logger.WriteLine("{0} > {1} Server Connected but Client Disconnected...Closing Server", clientLogString, serverLogString); } try { serverSocket.Shutdown(SocketShutdown.Both); } catch (Exception) { } } else { if (AppLayerProxy.Logger != null) { AppLayerProxy.Logger.WriteLine("{0} > {1} Client disconnected before server could connect", clientLogString, serverLogString); } } selectControl.DisposeAndRemoveConnectSocket(serverSocket); } else if (selectControl.ConnectionError) { if (AppLayerProxy.Logger != null) { if (AppLayerProxy.ForwardProxy == null) { AppLayerProxy.Logger.WriteLine("{0} > {1} Failed to connect to server..Closing Client", clientLogString, serverLogString); } else { AppLayerProxy.Logger.WriteLine("{0} > {1} Failed to connect to proxy server '{2}'..Closing Client", clientLogString, serverLogString, AppLayerProxy.ForwardProxy.host.CreateTargetString()); } } clientSocket.ShutdownAndDispose(); // Should already removed from selectControl selectControl.DisposeAndRemoveConnectSocket(serverSocket); } else if (!serverSocket.Connected) { // Ignore. Only do something if we are connected or get a ConnectionError } else { if (AppLayerProxy.Logger != null) { AppLayerProxy.Logger.WriteLine("{0} > {1} Connected to Server", clientLogString, serverLogString); } if (isConnect) { if (clientBuffer == null) { FinishConnection(null, 0, 0); } else { uint extraChars = clientBuffer.contentLength - headersLength; FinishConnection(clientBuffer.bytes, headersLength, extraChars); } } else { // A NonConnect will always have buffered data to send FinishConnection(clientBuffer.bytes, 0, clientBuffer.contentLength); } TcpBridge bridge = new TcpBridge(clientLogString, clientSocket, serverLogString, serverSocket); selectControl.AddReceiveSocket(clientSocket, bridge.ReceiveHandler); selectControl.UpdateConnectorToReceiver(serverSocket, bridge.ReceiveHandler); } } catch (Exception e) { if (AppLayerProxy.ErrorLogger != null) { AppLayerProxy.ErrorLogger.WriteLine("{0} > {1} Failed to finish connection: {2}", clientLogString, serverLogString, e.Message); } selectControl.ShutdownIfConnectedDisposeAndRemoveReceiveSocket(clientSocket); selectControl.ShutdownIfConnectedDisposeAndRemoveReceiveSocket(serverSocket); selectControl.DisposeAndRemoveConnectSocket(serverSocket); } }