private void CheckMessage(HttpMessage httpMessage, ExpectedMessageContainer.MessageTypes theMessageType)
        {
            try
            {
                log.DebugFormat("expectedMessageIndex {0}", expectedMessageIndex);

                if (expectedMessageIndex > expectedMessages.Count)
                {
                    throw new System.InvalidOperationException("expectedMessageIndex "
                                                               + expectedMessageIndex
                                                               + " > expectedMessages.Count"
                                                               + expectedMessages.Count);
                }

                ExpectedMessageContainer expectedMessage = expectedMessages[expectedMessageIndex];

                Assert.True(expectedMessage.messageType == theMessageType, "Message type does not match");

                // perform comparisons that are generic to all HttpMessages
                Assert.Equal(expectedMessage.message.HttpVersion, httpMessage.HttpVersion);

                // if we expected a zero length body then we expect that
                // the actual message has a null body since it was never set
                if (expectedMessage.message.Body.Length == 0)
                {
                    Assert.True(httpMessage.Body == null);
                }
                else
                {
                    Assert.Equal(expectedMessage.message.Body.Length, httpMessage.Body.Length);
                }

                if (theMessageType == ExpectedMessageContainer.MessageTypes.HttpRequest)
                {
                    HttpRequest expected = (HttpRequest)expectedMessage.message;
                    HttpRequest request  = (HttpRequest)httpMessage;

                    Assert.Equal(expected.Url, request.Url);
                    Assert.Equal(expected.Method, request.Method);
                }
                else
                {
                    HttpStatus expected = (HttpStatus)expectedMessage.message;
                    HttpStatus status   = (HttpStatus)httpMessage;

                    Assert.Equal(expected.StatusCode, status.StatusCode);
                }

                // move to the next message
                expectedMessageIndex++;

                log.Debug("message matched");
            } catch (System.Exception e)
            {
                // catch exceptions because the HttpSessionMonitor code will drop them

                log.Error("caught exception", e);
                Assert.True(false);
            }
        }
        public void TestHttpPipelining()
        {
            log4net.Config.XmlConfigurator.Configure(LogManager.GetRepository(Assembly.GetCallingAssembly()));

            string captureFilename      = "../../../captureFiles/http_pipelined_session.pcap";
            var    tcpConnectionManager = new TcpConnectionManager();

            tcpConnectionManager.OnConnectionFound += HandleTcpConnectionManagerOnConnectionFound;

            // open the offline file
            var dev = new CaptureFileReaderDevice(captureFilename);

            dev.Open();
            Assert.True(dev != null, "failed to open " + captureFilename);

            // setup the expected events
            ExpectedMessageContainer expectedMessage;
            HttpRequest request;
            HttpStatus  status;

            expectedMessages = new List <ExpectedMessageContainer>();

            // GET /
            expectedMessage             = new ExpectedMessageContainer();
            expectedMessage.messageType = HttpSessionWatcherTests.ExpectedMessageContainer.MessageTypes.HttpRequest;
            request                 = new HttpRequest();
            request.Url             = "/";
            request.Method          = HttpRequest.Methods.Get;
            request.HttpVersion     = HttpMessage.HttpVersions.Http11;
            request.Body            = new byte[0];
            expectedMessage.message = request;
            expectedMessages.Add(expectedMessage);

            // HTTP 1.1 OK
            expectedMessage             = new ExpectedMessageContainer();
            expectedMessage.messageType = HttpSessionWatcherTests.ExpectedMessageContainer.MessageTypes.HttpStatus;
            status                  = new HttpStatus();
            status.StatusCode       = HttpStatus.StatusCodes.OK_200;
            status.HttpVersion      = HttpMessage.HttpVersions.Http11;
            status.Body             = new byte[60985];
            expectedMessage.message = status;
            expectedMessages.Add(expectedMessage);

            // GET /dynjs/loader/DynJs2e30b68dfa7a63636c3ef66d7875e2f7
            expectedMessage             = new ExpectedMessageContainer();
            expectedMessage.messageType = HttpSessionWatcherTests.ExpectedMessageContainer.MessageTypes.HttpRequest;
            request                 = new HttpRequest();
            request.Url             = "/dynjs/loader/DynJs2e30b68dfa7a63636c3ef66d7875e2f7";
            request.Method          = HttpRequest.Methods.Get;
            request.HttpVersion     = HttpMessage.HttpVersions.Http11;
            request.Body            = new byte[0];
            expectedMessage.message = request;
            expectedMessages.Add(expectedMessage);

            // HTTP 1.1 OK
            expectedMessage             = new ExpectedMessageContainer();
            expectedMessage.messageType = HttpSessionWatcherTests.ExpectedMessageContainer.MessageTypes.HttpStatus;
            status                  = new HttpStatus();
            status.StatusCode       = HttpStatus.StatusCodes.OK_200;
            status.HttpVersion      = HttpMessage.HttpVersions.Http11;
            status.Body             = new byte[1123];
            expectedMessage.message = status;
            expectedMessages.Add(expectedMessage);

            // GET /img/menu-secondary.gif
            expectedMessage             = new ExpectedMessageContainer();
            expectedMessage.messageType = HttpSessionWatcherTests.ExpectedMessageContainer.MessageTypes.HttpRequest;
            request                 = new HttpRequest();
            request.Url             = "/img/menu-secondary.gif";
            request.Method          = HttpRequest.Methods.Get;
            request.HttpVersion     = HttpMessage.HttpVersions.Http11;
            request.Body            = new byte[0];
            expectedMessage.message = request;
            expectedMessages.Add(expectedMessage);

            // HTTP 1.1 OK
            expectedMessage             = new ExpectedMessageContainer();
            expectedMessage.messageType = HttpSessionWatcherTests.ExpectedMessageContainer.MessageTypes.HttpStatus;
            status                  = new HttpStatus();
            status.StatusCode       = HttpStatus.StatusCodes.OK_200;
            status.HttpVersion      = HttpMessage.HttpVersions.Http11;
            status.Body             = new byte[227];
            expectedMessage.message = status;
            expectedMessages.Add(expectedMessage);


            // here are the pipelined requests

            // GET /environment/Future_Battlegrounds_for_Habitat_Conservation/s.jpg
            expectedMessage             = new ExpectedMessageContainer();
            expectedMessage.messageType = HttpSessionWatcherTests.ExpectedMessageContainer.MessageTypes.HttpRequest;
            request                 = new HttpRequest();
            request.Url             = "/environment/Future_Battlegrounds_for_Habitat_Conservation/s.jpg";
            request.Method          = HttpRequest.Methods.Get;
            request.HttpVersion     = HttpMessage.HttpVersions.Http11;
            request.Body            = new byte[0];
            expectedMessage.message = request;
            expectedMessages.Add(expectedMessage);

            // GET /users/smitas/s.png
            expectedMessage             = new ExpectedMessageContainer();
            expectedMessage.messageType = HttpSessionWatcherTests.ExpectedMessageContainer.MessageTypes.HttpRequest;
            request                 = new HttpRequest();
            request.Url             = "/users/smitas/s.png";
            request.Method          = HttpRequest.Methods.Get;
            request.HttpVersion     = HttpMessage.HttpVersions.Http11;
            request.Body            = new byte[0];
            expectedMessage.message = request;
            expectedMessages.Add(expectedMessage);

            // GET /users/Bukowsky/s.png
            expectedMessage             = new ExpectedMessageContainer();
            expectedMessage.messageType = HttpSessionWatcherTests.ExpectedMessageContainer.MessageTypes.HttpRequest;
            request                 = new HttpRequest();
            request.Url             = "/users/Bukowsky/s.png";
            request.Method          = HttpRequest.Methods.Get;
            request.HttpVersion     = HttpMessage.HttpVersions.Http11;
            request.Body            = new byte[0];
            expectedMessage.message = request;
            expectedMessages.Add(expectedMessage);

            // GET /users/d2002/s.png
            expectedMessage             = new ExpectedMessageContainer();
            expectedMessage.messageType = HttpSessionWatcherTests.ExpectedMessageContainer.MessageTypes.HttpRequest;
            request                 = new HttpRequest();
            request.Url             = "/users/d2002/s.png";
            request.Method          = HttpRequest.Methods.Get;
            request.HttpVersion     = HttpMessage.HttpVersions.Http11;
            request.Body            = new byte[0];
            expectedMessage.message = request;
            expectedMessages.Add(expectedMessage);

            // GET /img/tab-line.gif
            expectedMessage             = new ExpectedMessageContainer();
            expectedMessage.messageType = HttpSessionWatcherTests.ExpectedMessageContainer.MessageTypes.HttpRequest;
            request                 = new HttpRequest();
            request.Url             = "/img/tab-line.gif";
            request.Method          = HttpRequest.Methods.Get;
            request.HttpVersion     = HttpMessage.HttpVersions.Http11;
            request.Body            = new byte[0];
            expectedMessage.message = request;
            expectedMessages.Add(expectedMessage);

            // GET /img/admin-dialogg.gif
            expectedMessage             = new ExpectedMessageContainer();
            expectedMessage.messageType = HttpSessionWatcherTests.ExpectedMessageContainer.MessageTypes.HttpRequest;
            request                 = new HttpRequest();
            request.Url             = "/img/admin-dialogg.gif";
            request.Method          = HttpRequest.Methods.Get;
            request.HttpVersion     = HttpMessage.HttpVersions.Http11;
            request.Body            = new byte[0];
            expectedMessage.message = request;
            expectedMessages.Add(expectedMessage);

            // HTTP 1.1 OK
            expectedMessage             = new ExpectedMessageContainer();
            expectedMessage.messageType = HttpSessionWatcherTests.ExpectedMessageContainer.MessageTypes.HttpStatus;
            status                  = new HttpStatus();
            status.StatusCode       = HttpStatus.StatusCodes.OK_200;
            status.HttpVersion      = HttpMessage.HttpVersions.Http11;
            status.Body             = new byte[1300];
            expectedMessage.message = status;
            expectedMessages.Add(expectedMessage);

            // GET /pets_animals/Maradona_of_the_Jungle/t.jpg
            expectedMessage             = new ExpectedMessageContainer();
            expectedMessage.messageType = HttpSessionWatcherTests.ExpectedMessageContainer.MessageTypes.HttpRequest;
            request                 = new HttpRequest();
            request.Url             = "/pets_animals/Maradona_of_the_Jungle/t.jpg";
            request.Method          = HttpRequest.Methods.Get;
            request.HttpVersion     = HttpMessage.HttpVersions.Http11;
            request.Body            = new byte[0];
            expectedMessage.message = request;
            expectedMessages.Add(expectedMessage);

            ProcessPackets(dev, tcpConnectionManager);
        }
        public void TestHttpPostSession()
        {
            log4net.Config.XmlConfigurator.Configure(LogManager.GetRepository(Assembly.GetCallingAssembly()));

            string captureFilename      = "../../../captureFiles/http_post_gziped_contents.pcap";
            var    tcpConnectionManager = new TcpConnectionManager();

            tcpConnectionManager.OnConnectionFound += HandleTcpConnectionManagerOnConnectionFound;

            // open the offline file
            var dev = new CaptureFileReaderDevice(captureFilename);

            dev.Open();
            Assert.True(dev != null, "failed to open " + captureFilename);

            // setup the expected events
            ExpectedMessageContainer expectedMessage;
            HttpRequest request;
            HttpStatus  status;

            expectedMessages = new List <ExpectedMessageContainer>();

            // POST /ajax/chat/typ.php
            expectedMessage             = new ExpectedMessageContainer();
            expectedMessage.messageType = ExpectedMessageContainer.MessageTypes.HttpRequest;
            request                 = new HttpRequest();
            request.Url             = "/ajax/chat/typ.php";
            request.Method          = HttpRequest.Methods.Post;
            request.HttpVersion     = HttpMessage.HttpVersions.Http11;
            request.Body            = new byte[242];
            expectedMessage.message = request;
            expectedMessages.Add(expectedMessage);

            // HTTP 1.1 OK
            expectedMessage             = new ExpectedMessageContainer();
            expectedMessage.messageType = ExpectedMessageContainer.MessageTypes.HttpStatus;
            status                  = new HttpStatus();
            status.StatusCode       = HttpStatus.StatusCodes.OK_200;
            status.HttpVersion      = HttpMessage.HttpVersions.Http11;
            status.Body             = new byte[418];
            expectedMessage.message = status;
            expectedMessages.Add(expectedMessage);

            // POST /ajax/chat/send.php
            expectedMessage             = new ExpectedMessageContainer();
            expectedMessage.messageType = ExpectedMessageContainer.MessageTypes.HttpRequest;
            request                 = new HttpRequest();
            request.Url             = "/ajax/chat/send.php";
            request.Method          = HttpRequest.Methods.Post;
            request.HttpVersion     = HttpMessage.HttpVersions.Http11;
            request.Body            = new byte[390];
            expectedMessage.message = request;
            expectedMessages.Add(expectedMessage);

            // HTTP 1.1 OK
            expectedMessage             = new ExpectedMessageContainer();
            expectedMessage.messageType = ExpectedMessageContainer.MessageTypes.HttpStatus;
            status                  = new HttpStatus();
            status.StatusCode       = HttpStatus.StatusCodes.OK_200;
            status.HttpVersion      = HttpMessage.HttpVersions.Http11;
            status.Body             = new byte[1132];
            expectedMessage.message = status;
            expectedMessages.Add(expectedMessage);

            ProcessPackets(dev, tcpConnectionManager);
        }