From: Philippe Antoine Date: Thu, 18 Feb 2021 09:40:22 +0000 (+0100) Subject: Adds http range test over multiple flows X-Git-Tag: suricata-6.0.4~45 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2524312f97bfe88eb273e49894c4d06f90627581;p=thirdparty%2Fsuricata-verify.git Adds http range test over multiple flows --- diff --git a/tests/http-range-multiflows/README.md b/tests/http-range-multiflows/README.md new file mode 100644 index 000000000..0ffdee43f --- /dev/null +++ b/tests/http-range-multiflows/README.md @@ -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 index 000000000..e2d01c8bc --- /dev/null +++ b/tests/http-range-multiflows/client.go @@ -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 index 000000000..438ae8ae1 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 index 000000000..9686cd92f --- /dev/null +++ b/tests/http-range-multiflows/test.yaml @@ -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