示例#1
0
        public void HttpParsingMultipeRequestsTest()
        {
            const string HttpString = "GET /url1 HTTP/1.1\r\n" +
                                      "A: B\r\n" +
                                      "B: C\r\n" +
                                      "\r\n" +
                                      "GET /url2 HTTP/1.1\r\n" +
                                      "C: D\r\n" +
                                      "D: E\r\n" +
                                      "\r\n";

            Packet packet = BuildPacket(HttpString);
            var    https  = packet.Ethernet.IpV4.Tcp.HttpCollection;

            Assert.AreEqual(2, https.Count);
            foreach (HttpDatagram http in https)
            {
                Assert.IsTrue(http.IsRequest);
                Assert.IsFalse(http.IsResponse);
                Assert.AreEqual(HttpVersion.Version11, http.Version);
                Assert.AreEqual(Datagram.Empty, http.Body);
            }
            HttpRequestDatagram request = (HttpRequestDatagram)https[0];

            Assert.AreEqual(new HttpRequestMethod(HttpRequestKnownMethod.Get), request.Method);
            Assert.AreEqual("/url1", request.Uri);
            Assert.AreEqual(new HttpHeader(HttpField.CreateField("A", "B"), HttpField.CreateField("B", "C")), request.Header);

            request = (HttpRequestDatagram)https[1];
            Assert.AreEqual(new HttpRequestMethod(HttpRequestKnownMethod.Get), request.Method);
            Assert.AreEqual("/url2", request.Uri);
            Assert.AreEqual(new HttpHeader(HttpField.CreateField("C", "D"), HttpField.CreateField("D", "E")), request.Header);
        }
示例#2
0
        private static void TestHttpRequest(string httpString, string expectedMethodString = null, string expectedUri = null, HttpVersion expectedVersion = null, HttpHeader expectedHeader = null, string expectedBodyString = null)
        {
            Datagram          expectedBody   = expectedBodyString == null ? null : new Datagram(Encoding.ASCII.GetBytes(expectedBodyString));
            HttpRequestMethod expectedMethod = expectedMethodString == null ? null : new HttpRequestMethod(expectedMethodString);

            Packet packet = BuildPacket(httpString);

            // HTTP
            HttpDatagram http = packet.Ethernet.IpV4.Tcp.Http;

            Assert.IsTrue(http.IsRequest, "IsRequest " + httpString);
            Assert.IsFalse(http.IsResponse, "IsResponse " + httpString);
            Assert.AreEqual(expectedVersion, http.Version, "Version " + httpString);
            Assert.AreEqual(expectedHeader, http.Header, "Header " + httpString);
            if (expectedHeader != null)
            {
                Assert.AreEqual(expectedHeader.ToString(), http.Header.ToString(), "Header " + httpString);
            }

            HttpRequestDatagram request = (HttpRequestDatagram)http;

            Assert.AreEqual(expectedMethod, request.Method, "Method " + httpString);
            Assert.AreEqual(expectedUri, request.Uri, "Uri " + httpString);
            Assert.AreEqual(expectedBody, request.Body, "Body " + httpString);
        }
示例#3
0
        public void ReadDumpFile(string path)
        {
            // Opens device
            OfflinePacketDevice device = new OfflinePacketDevice(path);

            using (PacketCommunicator communicator = device.Open(0x10000, PacketDeviceOpenAttributes.Promiscuous, 1000))
            {
                //communicator.SetFilter("ip and tcp");
                //communicator.ReceivePackets(0, DispatcherHandler);

                Packet packet;
                communicator.ReceivePacket(out packet);

                while (packet != null)
                {
                    if (IsHttpRequest(packet))
                    {
                        HttpRequestDatagram request = packet?.Ethernet?.Ip?.Tcp?.Http as HttpRequestDatagram;
                        ParseHttpRequest(request);
                    }

                    // Gets next packet
                    communicator.ReceivePacket(out packet);
                }
            }
        }
示例#4
0
        private void ParseHttpRequest(HttpRequestDatagram request)
        {
            if (request.Uri == null || request.Header == null)
            {
                return;
            }

            FileRequest fileRequest;

            if (request.Uri.Contains('?'))
            {
                string[] pathQuery = request.Uri.Split('?');
                fileRequest = CreateRequest(request.Header["Host"].ValueString, pathQuery[0], pathQuery[1]);
            }
            else
            {
                fileRequest = CreateRequest(request.Header["Host"].ValueString, request.Uri, "");
            }

            // Downloads file
            string localPath = GetLocalPath(fileRequest, this.OutputDirectory);

            if (!File.Exists(localPath))
            {
                DownloadFile(fileRequest.FullRequest, localPath);
            }

            UpdateManifest();
        }
示例#5
0
        private void ProcessPacket(Packet packet)
        {
            if (packet == null || !IsHttpRequest(packet))
            {
                return;
            }

            HttpRequestDatagram request = packet?.Ethernet?.Ip?.Tcp?.Http as HttpRequestDatagram;

            ParseHttpRequest(request);
        }
示例#6
0
        private static bool IsBadHttp(HttpDatagram httpDatagram)
        {
            if (httpDatagram.IsResponse)
            {
                HttpResponseDatagram httpResponseDatagram = (HttpResponseDatagram)httpDatagram;
                if (httpResponseDatagram.StatusCode == null)
                {
                    Assert.IsNull(httpResponseDatagram.Header);
                    return(true);
                }
            }
            else
            {
                HttpRequestDatagram httpRequestDatagram = (HttpRequestDatagram)httpDatagram;
                if (httpRequestDatagram.Version == null)
                {
                    return(true);
                }
            }

            return(false);
        }
示例#7
0
        public void RandomHttpTest()
        {
            int seed = new Random().Next();

            Console.WriteLine("Seed: " + seed);
            Random random = new Random(seed);

            for (int i = 0; i != 200; ++i)
            {
                EthernetLayer ethernetLayer = random.NextEthernetLayer(EthernetType.None);
                IpV4Layer     ipV4Layer     = random.NextIpV4Layer(null);
                ipV4Layer.HeaderChecksum = null;
                Layer    ipLayer  = random.NextBool() ? (Layer)ipV4Layer : random.NextIpV6Layer(true);
                TcpLayer tcpLayer = random.NextTcpLayer();
                tcpLayer.Checksum = null;
                HttpLayer httpLayer = random.NextHttpLayer();

                Packet packet = PacketBuilder.Build(DateTime.Now, ethernetLayer, ipLayer, tcpLayer, httpLayer);
                Assert.IsTrue(packet.IsValid, "IsValid");

                HttpDatagram httpDatagram = packet.Ethernet.Ip.Tcp.Http;
                Assert.AreEqual(httpLayer.Version, httpDatagram.Version);
                if (httpLayer.Version != null)
                {
                    Assert.AreEqual(httpLayer.Version.GetHashCode(), httpDatagram.Version.GetHashCode());
                }
                if (httpLayer is HttpRequestLayer)
                {
                    Assert.IsTrue(httpDatagram.IsRequest);
                    Assert.IsTrue(httpLayer.IsRequest);
                    Assert.IsFalse(httpDatagram.IsResponse);
                    Assert.IsFalse(httpLayer.IsResponse);

                    HttpRequestLayer    httpRequestLayer    = (HttpRequestLayer)httpLayer;
                    HttpRequestDatagram httpRequestDatagram = (HttpRequestDatagram)httpDatagram;
                    Assert.AreEqual(httpRequestLayer.Method, httpRequestDatagram.Method);
                    if (httpRequestLayer.Method != null)
                    {
                        Assert.AreEqual(httpRequestLayer.Method.GetHashCode(), httpRequestDatagram.Method.GetHashCode());
                        Assert.AreEqual(httpRequestLayer.Method.KnownMethod, httpRequestDatagram.Method.KnownMethod);
                    }
                    Assert.AreEqual(httpRequestLayer.Uri, httpRequestDatagram.Uri);
                }
                else
                {
                    Assert.IsFalse(httpDatagram.IsRequest);
                    Assert.IsFalse(httpLayer.IsRequest);
                    Assert.IsTrue(httpDatagram.IsResponse);
                    Assert.IsTrue(httpLayer.IsResponse);

                    HttpResponseLayer    httpResponseLayer    = (HttpResponseLayer)httpLayer;
                    HttpResponseDatagram httpResponseDatagram = (HttpResponseDatagram)httpDatagram;
                    Assert.AreEqual(httpResponseLayer.StatusCode, httpResponseDatagram.StatusCode);
                    Assert.AreEqual(httpResponseLayer.ReasonPhrase, httpResponseDatagram.ReasonPhrase);
                }
                Assert.AreEqual(httpLayer.Header, httpDatagram.Header);
                if (httpLayer.Header != null)
                {
                    Assert.AreEqual(httpLayer.Header.GetHashCode(), httpDatagram.Header.GetHashCode());
                    if (!httpDatagram.IsRequest || ((HttpRequestDatagram)httpDatagram).Uri != "")
                    {
                        Assert.IsTrue(httpDatagram.IsValidStart, "IsValidStart");
                    }

                    foreach (var field in httpLayer.Header)
                    {
                        Assert.IsFalse(field.Equals("abc"));
                    }
                    foreach (var field in (IEnumerable)httpLayer.Header)
                    {
                        Assert.IsFalse(field.Equals("abc"));
                    }

                    MoreAssert.AreSequenceEqual(httpLayer.Header.Select(field => field.GetHashCode()), httpDatagram.Header.Select(field => field.GetHashCode()));

                    if (httpLayer.Header.ContentType != null)
                    {
                        var parameters = httpLayer.Header.ContentType.Parameters;
                        Assert.IsNotNull(((IEnumerable)parameters).GetEnumerator());
                        Assert.AreEqual <object>(parameters, httpDatagram.Header.ContentType.Parameters);
                        Assert.AreEqual(parameters.GetHashCode(), httpDatagram.Header.ContentType.Parameters.GetHashCode());
                        Assert.AreEqual(parameters.Count, httpDatagram.Header.ContentType.Parameters.Count);
                        int maxParameterNameLength = parameters.Any() ? parameters.Max(pair => pair.Key.Length) : 0;
                        Assert.IsNull(parameters[new string('a', maxParameterNameLength + 1)]);
                    }
                }
                Assert.AreEqual(httpLayer.Body, httpDatagram.Body);
                Assert.AreEqual(httpLayer, httpDatagram.ExtractLayer(), "HTTP Layer");
                Assert.AreEqual(httpLayer.Length, httpDatagram.Length);
            }
        }
示例#8
0
        private bool IsHttpRequest(Packet packet)
        {
            HttpRequestDatagram request = packet?.Ethernet?.Ip?.Tcp?.Http as HttpRequestDatagram;

            return(request != null);
        }