public void MultipleClientTransferTest()
        {
            int clientBufferCtr = 0;

            List<byte[]> clientMessages = new List<byte[]>();
            clientMessages.Add( new byte[] { 0x01, 0x01} );
            clientMessages.Add(new byte[] { 0x02, 0x02 });
            clientMessages.Add(new byte[] { 0x03, 0x03 });

            Mock<INetworkFacade> client = new Mock<INetworkFacade>();
            Mock<INetworkFacade> server = new Mock<INetworkFacade>();

            client.Setup(m => m.BeginReceive(It.IsAny<Action<bool, byte[], INetworkFacade>>()))
                .Callback((Action<bool, byte[], INetworkFacade> callback) => callback(true, clientMessages[clientBufferCtr++], client.Object));

            server.Setup( m => m.BeginSend( clientMessages[0], It.IsAny<Action<bool, INetworkFacade>>() ) )
                .Callback( ( byte[] d1, Action<bool, INetworkFacade> callback ) => callback( true, server.Object ) );

            server.Setup(m => m.BeginSend(clientMessages[1], It.IsAny<Action<bool, INetworkFacade>>()))
                .Callback((byte[] d1, Action<bool, INetworkFacade> callback) => callback(true, server.Object));

            // Send "false" back to the client to indicate that the server closed the connection
            server.Setup(m => m.BeginSend(clientMessages[2], It.IsAny<Action<bool, INetworkFacade>>()))
                .Callback((byte[] d1, Action<bool, INetworkFacade> callback) => callback(false, server.Object));

            SslTunnel tunnel = new SslTunnel();
            tunnel.EstablishTunnel(client.Object, server.Object, "1.1");

            var data = Encoding.UTF8.GetBytes(
                "HTTP/1.1 200 Connection established\r\n" +
                "Proxy-agent: Gallatin-Proxy/1.1\r\n\r\n");

            client.Verify(m => m.BeginSend(data, It.IsAny<Action<bool, INetworkFacade>>()));

            server.Verify(m => m.BeginSend(clientMessages[0], It.IsAny<Action<bool, INetworkFacade>>()));
            server.Verify(m => m.BeginSend(clientMessages[1], It.IsAny<Action<bool, INetworkFacade>>()));
            server.Verify(m => m.BeginSend(clientMessages[2], It.IsAny<Action<bool, INetworkFacade>>()));
        }
        public void MultipleTransferTest()
        {
            int clientBufferCtr = 0;
            int serverBufferCtr = 0;

            var data = Encoding.UTF8.GetBytes(
                "HTTP/1.1 200 Connection established\r\n" +
                "Proxy-agent: Gallatin-Proxy/1.1\r\n\r\n");

            List<byte[]> clientMessages = new List<byte[]>();
            clientMessages.Add(new byte[] { 0x00, 0x00 });
            clientMessages.Add(new byte[] { 0x01, 0x01 });
            clientMessages.Add(new byte[] { 0x02, 0x02 });
            clientMessages.Add(new byte[] { 0x03, 0x03 });

            List<byte[]> serverMessages = new List<byte[]>();
            serverMessages.Add(new byte[] { 0x04, 0x04 });
            serverMessages.Add(new byte[] { 0x05, 0x05 });
            serverMessages.Add(new byte[] { 0x06, 0x06 });
            serverMessages.Add(new byte[] { 0x07, 0x07 });

            Mock<INetworkFacade> client = new Mock<INetworkFacade>();
            Mock<INetworkFacade> server = new Mock<INetworkFacade>();

            // Mock data received from the client and server. This will get called multiple times and increment through the buffers.
            // Since the begin receive methods have no state (BeginEnd have received buffer) we cannot tie an invocation
            // in a series in the sequence.
            client.Setup(m => m.BeginReceive(It.IsAny<Action<bool, byte[], INetworkFacade>>()))
                .Callback((Action<bool, byte[], INetworkFacade> callback) => callback(true, clientMessages[clientBufferCtr++], client.Object));
            server.Setup(m => m.BeginReceive(It.IsAny<Action<bool, byte[], INetworkFacade>>()))
                .Callback((Action<bool, byte[], INetworkFacade> callback) => callback(true, serverMessages[serverBufferCtr++], server.Object));

            // Mock the data sends as data is routed between the two endpoints
            client.Setup(m => m.BeginSend(data, It.IsAny<Action<bool, INetworkFacade>>()))
                .Callback((byte[] d1, Action<bool, INetworkFacade> callback) => callback(true, client.Object));     // Note: ack proxy header send

            client.Setup(m => m.BeginSend(serverMessages[0], It.IsAny<Action<bool, INetworkFacade>>()))
                .Callback((byte[] d1, Action<bool, INetworkFacade> callback) => callback(true, client.Object));

            client.Setup(m => m.BeginSend(serverMessages[1], It.IsAny<Action<bool, INetworkFacade>>()))
                .Callback((byte[] d1, Action<bool, INetworkFacade> callback) => callback(true, client.Object));

            client.Setup(m => m.BeginSend(serverMessages[2], It.IsAny<Action<bool, INetworkFacade>>()))
                .Callback((byte[] d1, Action<bool, INetworkFacade> callback) => callback(false, client.Object));    //Note: false - termination condition

            server.Setup(m => m.BeginSend(clientMessages[0], It.IsAny<Action<bool, INetworkFacade>>()))
                .Callback((byte[] d1, Action<bool, INetworkFacade> callback) => callback(true, server.Object));

            server.Setup(m => m.BeginSend(clientMessages[1], It.IsAny<Action<bool, INetworkFacade>>()))
                .Callback((byte[] d1, Action<bool, INetworkFacade> callback) => callback(true, server.Object));

            server.Setup(m => m.BeginSend(clientMessages[2], It.IsAny<Action<bool, INetworkFacade>>()))
                .Callback((byte[] d1, Action<bool, INetworkFacade> callback) => callback(true, server.Object));

            // Run the class under test
            SslTunnel tunnel = new SslTunnel();
            tunnel.EstablishTunnel(client.Object, server.Object, "1.1");

            server.Verify(m => m.BeginSend(clientMessages[0], It.IsAny<Action<bool, INetworkFacade>>()));
            server.Verify(m => m.BeginSend(clientMessages[1], It.IsAny<Action<bool, INetworkFacade>>()));
            server.Verify(m => m.BeginSend(clientMessages[2], It.IsAny<Action<bool, INetworkFacade>>()));

            client.Verify(m => m.BeginSend(data, It.IsAny<Action<bool, INetworkFacade>>()));
            client.Verify(m => m.BeginSend(serverMessages[0], It.IsAny<Action<bool, INetworkFacade>>()));
            client.Verify(m => m.BeginSend(serverMessages[1], It.IsAny<Action<bool, INetworkFacade>>()));
            client.Verify(m => m.BeginSend(serverMessages[2], It.IsAny<Action<bool, INetworkFacade>>()));
        }
 private void HttpsTunnelClosed( object sender, EventArgs args )
 {
     ServiceLog.Logger.Info( "{0} HTTPS tunnel closed. Resetting session.", Id );
     _sslTunnel.TunnelClosed -= HttpsTunnelClosed;
     _sslTunnel = null;
     Reset();
 }
        public void TransferTest()
        {
            Mock<INetworkFacade> client = new Mock<INetworkFacade>();
            Mock<INetworkFacade> server = new Mock<INetworkFacade>();

            byte[] firstDataFromClient = new byte[] { 0x01, 0x02 };

            client.Setup(m => m.BeginReceive(It.IsAny<Action<bool, byte[], INetworkFacade>>()))
                .Callback( (Action<bool, byte[], INetworkFacade> callback) => callback(true, firstDataFromClient, client.Object));

            SslTunnel tunnel = new SslTunnel();
            tunnel.EstablishTunnel(client.Object, server.Object, "1.1");

            var data = Encoding.UTF8.GetBytes(
                "HTTP/1.1 200 Connection established\r\n" +
                "Proxy-agent: Gallatin-Proxy/1.1\r\n\r\n" );

            client.Verify( m => m.BeginSend( data, It.IsAny<Action<bool,INetworkFacade>>() ) );

            server.Verify(m => m.BeginSend(firstDataFromClient, It.IsAny<Action<bool, INetworkFacade>>()));
        }
 private void HttpsServerConnect( bool success, INetworkFacade server )
 {
     try
     {
         if ( success )
         {
             _sslTunnel = new SslTunnel();
             _sslTunnel.TunnelClosed += HttpsTunnelClosed;
             _sslTunnel.EstablishTunnel( _clientConnection, server, _lastRequest.Version );
         }
         else
         {
             ServiceLog.Logger.Warning( "{0} Unable to connect to remote HTTPS host", Id );
         }
     }
     catch ( Exception ex )
     {
         ServiceLog.Logger.Exception( string.Format( "{0} Unhandled exception in HTTPS session.", Id ), ex );
         Reset();
     }
 }