From 3f3716164903130f4cc2edfd28c908491b07090d Mon Sep 17 00:00:00 2001 From: Simon Cruanes Date: Mon, 2 Dec 2024 14:19:40 -0500 Subject: [PATCH] test: more tests for multipart form data --- tests/multipart_form/dune | 2 +- tests/multipart_form/t1.expected | 2 +- tests/multipart_form/t1.ml | 18 +++++--- tests/multipart_form/t2.expected | 12 ++++++ tests/multipart_form/t2.ml | 74 ++++++++++++++++++++++++++++++++ 5 files changed, 99 insertions(+), 9 deletions(-) create mode 100644 tests/multipart_form/t2.expected create mode 100644 tests/multipart_form/t2.ml diff --git a/tests/multipart_form/dune b/tests/multipart_form/dune index 3590e207..e45df39e 100644 --- a/tests/multipart_form/dune +++ b/tests/multipart_form/dune @@ -1,4 +1,4 @@ (tests - (names t1) + (names t1 t2) (libraries tiny_httpd tiny_httpd.multipart-form-data)) diff --git a/tests/multipart_form/t1.expected b/tests/multipart_form/t1.expected index 9591feee..97b413f8 100644 --- a/tests/multipart_form/t1.expected +++ b/tests/multipart_form/t1.expected @@ -20,6 +20,6 @@ delim chunk "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" delim delim -chunk "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" +chunk "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" delim chunk "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" diff --git a/tests/multipart_form/t1.ml b/tests/multipart_form/t1.ml index 221bde28..346803ed 100644 --- a/tests/multipart_form/t1.ml +++ b/tests/multipart_form/t1.ml @@ -25,7 +25,7 @@ let read_stream (st : MFD.st) : _ list = let test input_str = let st = - MFD.create ~buf_size:16 ~delim:"YOLO" (Iostream.In.of_string input_str) + MFD.create ~buf_size:16 ~boundary:"YOLO" (Iostream.In.of_string input_str) in let chunks = read_stream st in List.iter @@ -38,13 +38,17 @@ let test input_str = let () = pf "T1\n"; test - {|hello--YOLO - world - what is the meaning of--YOLOthis??--YOLOok ok ok--YOLO|}; + "hello\r\n\ + --YOLO\n\ + \ world\n\ + \ what is the meaning of\r\n\ + --YOLOthis??\r\n\ + --YOLOok ok ok\r\n\ + --YOLO"; pf "T2\n"; - test "--YOLO--YOLOah bon--YOLOaight--YOLO--YOLO"; + test "\r\n--YOLO\r\n--YOLOah bon\r\n--YOLOaight\r\n--YOLO\r\n--YOLO"; pf "T3\n"; test - (spf "--YOLO%s--YOLO--YOLO%s--YOLO%s" (String.make 400 'a') - (String.make 400 'b') (String.make 400 'c')); + (spf "\r\n--YOLO%s\r\n--YOLO\r\n--YOLO%s\r\n--YOLO%s" (String.make 400 'a') + (String.make 512 'b') (String.make 400 'c')); () diff --git a/tests/multipart_form/t2.expected b/tests/multipart_form/t2.expected new file mode 100644 index 00000000..9a1bd7dd --- /dev/null +++ b/tests/multipart_form/t2.expected @@ -0,0 +1,12 @@ +T1 +part ["some-super-cool":"header here";"ohlook":"here"] +chunk "and now for the b-o-d-y \240\159\145\143\n" +part ["more":"headers"] +chunk "and another body\r\n" +end of input +T1 +part ["some-super-cool":"header here";"ohlook":"here"] +chunk "and now for the bigger body:\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" +part ["more":"headers"] +chunk "and another body" +end of input diff --git a/tests/multipart_form/t2.ml b/tests/multipart_form/t2.ml new file mode 100644 index 00000000..955968b5 --- /dev/null +++ b/tests/multipart_form/t2.ml @@ -0,0 +1,74 @@ +module MFD = Tiny_httpd_multipart_form_data + +let spf = Printf.sprintf +let pf = Printf.printf + +let read_stream (st : MFD.st) : _ list = + let l = ref [] in + let buffer = Buffer.create 32 in + let rec loop () = + match MFD.next st with + | Part headers -> + if Buffer.length buffer > 0 then l := `Str (Buffer.contents buffer) :: !l; + Buffer.clear buffer; + l := `Part headers :: !l; + loop () + | Read sl -> + Buffer.add_subbytes buffer sl.bytes sl.off sl.len; + loop () + | End_of_input -> + if Buffer.length buffer > 0 then l := `Str (Buffer.contents buffer) :: !l; + l := `End_of_input :: !l; + List.rev !l + in + loop () + +let test input_str = + let st = + MFD.create ~buf_size:16 ~boundary:"YOLO" (Iostream.In.of_string input_str) + in + let chunks = read_stream st in + List.iter + (function + | `End_of_input -> pf "end of input\n" + | `Part hs -> + pf "part [%s]\n" + (String.concat ";" @@ List.map (fun (k, v) -> spf "%S:%S" k v) hs) + | `Str s -> pf "chunk %S\n" s) + chunks; + () + +let () = + pf "T1\n"; + test + "\r\n\ + --YOLO\r\n\ + some-super-cool: header here\r\n\ + ohlook: here\r\n\ + \r\n\ + and now for the b-o-d-y 👏\n\ + \r\n\ + --YOLO\r\n\ + more: headers\r\n\ + \r\n\ + and another body\r\n\ + \r\n\ + --YOLO--"; + pf "T1\n"; + test + (spf + "\r\n\ + --YOLO\r\n\ + some-super-cool: header here\r\n\ + ohlook: here\r\n\ + \r\n\ + and now for the bigger body:\n\ + %s\n\ + \r\n\ + --YOLO\r\n\ + more: headers\r\n\ + \r\n\ + and another body\r\n\ + --YOLO--" + (String.make 500 'a')); + ()