]> git.ipfire.org Git - thirdparty/suricata-verify.git/commitdiff
Adds http range test over multiple flows
authorPhilippe Antoine <contact@catenacyber.fr>
Thu, 18 Feb 2021 09:40:22 +0000 (10:40 +0100)
committerVictor Julien <victor@inliniac.net>
Mon, 27 Sep 2021 21:09:52 +0000 (23:09 +0200)
tests/http-range-multiflows/README.md [new file with mode: 0644]
tests/http-range-multiflows/client.go [new file with mode: 0644]
tests/http-range-multiflows/input.pcap [new file with mode: 0644]
tests/http-range-multiflows/test.yaml [new file with mode: 0644]

diff --git a/tests/http-range-multiflows/README.md b/tests/http-range-multiflows/README.md
new file mode 100644 (file)
index 0000000..0ffdee4
--- /dev/null
@@ -0,0 +1,9 @@
+# Description
+
+Test http file extraction over multiple flows with range header (unordered).
+
+# PCAP
+
+The pcap comes from running `go run client.go`
+The server running in the background is `python3 -m RangeHTTPServer`
+in directory mqtt-binary-message using https://github.com/danvk/RangeHTTPServer
diff --git a/tests/http-range-multiflows/client.go b/tests/http-range-multiflows/client.go
new file mode 100644 (file)
index 0000000..e2d01c8
--- /dev/null
@@ -0,0 +1,73 @@
+package main
+
+import (
+       "fmt"
+       "io"
+       "io/ioutil"
+       "net"
+       "net/http"
+       "strconv"
+       "strings"
+       "time"
+)
+
+type httpRange struct {
+       Start uint
+       End   uint
+}
+
+const step = 1000
+const url = "http://127.0.0.1:8000/mqtt5_pub_jpeg.pcap"
+
+func main() {
+
+       tr := &http.Transport{
+               //may not be needed
+               MaxIdleConns:        10,
+               MaxIdleConnsPerHost: 10,
+               MaxConnsPerHost:     10,
+               IdleConnTimeout:     30 * time.Second,
+               DisableKeepAlives:   false,
+               DialContext: (&net.Dialer{
+                       Timeout:   30 * time.Second,
+                       KeepAlive: 30 * time.Second,
+                       DualStack: true,
+               }).DialContext,
+       }
+       client := &http.Client{Transport: tr}
+       myranges := []httpRange{
+               {1000, 2000}, // out of order
+               {0, 1000},    // order + resume previous
+               {500, 1500},  // only overlap
+               {1500, 2500}, // overlap + new data
+               {5000, 6000}, // out of order
+               {2500, 3500}, // order but no resume
+               {4000, 5000}, // out of order insert in head
+               {8000, 9000}, // out or order insert at tail
+               {6000, 7000}, // out of order insert in the middle
+               {6400, 8000}, // insert with overlap
+               {3000, 4000}, // overlap + new data + resume multiple
+       }
+
+       filesize := 0
+
+       for i := range myranges {
+               req2, _ := http.NewRequest("GET", url, nil)
+               req2.Header.Set("Range", fmt.Sprintf("bytes=%d-%d", myranges[i].Start, myranges[i].End-1))
+               resp2, _ := client.Do(req2)
+               filesize, _ = strconv.Atoi(strings.Split(resp2.Header["Content-Range"][0], "/")[1])
+               io.Copy(ioutil.Discard, resp2.Body)
+               resp2.Body.Close()
+
+               fmt.Printf("download %#+v %#+v\n", myranges[i].Start, step)
+       }
+
+       for o := 8000; o < filesize; o += step {
+               req2, _ := http.NewRequest("GET", url, nil)
+               req2.Header.Set("Range", fmt.Sprintf("bytes=%d-%d", o, o+step-1))
+               resp2, _ := client.Do(req2)
+               io.Copy(ioutil.Discard, resp2.Body)
+               resp2.Body.Close()
+               fmt.Printf("download %#+v %#+v\n", o, step)
+       }
+}
diff --git a/tests/http-range-multiflows/input.pcap b/tests/http-range-multiflows/input.pcap
new file mode 100644 (file)
index 0000000..438ae8a
Binary files /dev/null and b/tests/http-range-multiflows/input.pcap differ
diff --git a/tests/http-range-multiflows/test.yaml b/tests/http-range-multiflows/test.yaml
new file mode 100644 (file)
index 0000000..9686cd9
--- /dev/null
@@ -0,0 +1,21 @@
+requires:
+  features:
+    - HAVE_LIBJANSSON
+  min-version: 7.0.0
+
+# disables checksum verification
+args:
+  - -k none
+# we want to check every packet in pcap order
+  - --set runmode=single
+# make one alloc fail and the test fail if we limit memcap
+#  - --set containers.urlrange.memcap=195000
+
+checks:
+
+  # Check that there is one file event with content range.
+  - filter:
+      count: 1
+      match:
+        event_type: fileinfo
+        fileinfo.size: 37323