]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/DEVEL/pxp/netstring/tests/test_cgi.ml
Initial revision
[helm.git] / helm / DEVEL / pxp / netstring / tests / test_cgi.ml
diff --git a/helm/DEVEL/pxp/netstring/tests/test_cgi.ml b/helm/DEVEL/pxp/netstring/tests/test_cgi.ml
new file mode 100644 (file)
index 0000000..43d9886
--- /dev/null
@@ -0,0 +1,423 @@
+#require "str";;
+#directory "..";;
+#load "netstring.cma";;
+
+
+open Cgi;;
+
+(**********************************************************************)
+(* dest_form_encoded_parameters                                       *)
+(**********************************************************************)
+
+let t001 f =
+  let r =
+    f
+      "blah blah
+--snip
+Content-Disposition: form-data; name=blupp
+
+This is a text
+--snip--
+blah blah"
+      "snip"
+  in
+  r = ["blupp", "text/plain", "This is a text"]
+;;
+
+
+let t002 f =
+  let r =
+    f
+      "blah blah
+--snip
+Content-Disposition: form-data; name=blupp
+
+This is a text
+--snip--
+blah blah"
+      "snip"
+  in
+  r = ["blupp", "text/plain", "This is a text"]
+;;
+
+
+let t003 f =
+  let r =
+    f
+      "--snip
+Content-Disposition: form-data; name=blupp
+
+This is a text
+--snip--"
+      "snip"
+  in
+  r = ["blupp", "text/plain", "This is a text"]
+;;
+
+
+let t004 f =
+  let r =
+    f
+      "--snip
+Content-Disposition: form-data; name=blupp
+
+This is a text
+
+--snip--"
+      "snip"
+  in
+  r = ["blupp", "text/plain", "This is a text\013\n"]
+;;
+
+
+let t005 f =
+  let r =
+    f
+      "--snip
+Content-Disposition: form-data; name=blupp
+
+This is a text
+
+--snip--"
+      "snip"
+  in
+  r = ["blupp", "text/plain", "This is a text\n"]
+;;
+
+
+let t006 f =
+  let r =
+    f
+      "blah blah
+--snip
+Content-Disposition: form-data;name= \"blupp\"
+
+This is a text
+--snip--
+blah blah"
+      "snip"
+  in
+  r = ["blupp", "text/plain", "This is a text"]
+;;
+
+
+let t007 f =
+  let r =
+    f
+      "blah blah
+--snip
+Content-Disposition: form-data;name= \"name=blupp\"
+
+This is a text
+--snip--
+blah blah"
+      "snip"
+  in
+  r = ["name=blupp", "text/plain", "This is a text"]
+;;
+
+
+let t008 f =
+  let r =
+    f
+      "blah blah
+--snip
+Content-Disposition: form-data; strange=\"name=blop\"; name= \"blupp\"
+
+This is a text
+--snip--
+blah blah"
+      "snip"
+  in
+  r = ["blupp", "text/plain", "This is a text"]
+;;
+
+
+let t009 f =
+  let r =
+    f
+      "blah blah
+--snip
+Content-Disposition: form-data; strange=\" name=blop \";  name=blupp
+
+This is a text
+--snip--
+blah blah"
+      "snip"
+  in
+  r = ["blupp", "text/plain", "This is a text"]
+;;
+
+
+let t010 f =
+  (* There is a space after "octet-stream"! *)
+  let r =
+    f
+      "--snip
+Content-Disposition: form-data; name=blupp
+Content-type:  application/octet-stream
+
+This is a text
+--snip--"
+      "snip"
+  in
+  r = ["blupp", "application/octet-stream", "This is a text"]
+;;
+
+
+let t011 f =
+  let r =
+    f
+      "blah blah
+--snip
+Content-Disposition: form-data; name=blupp
+
+This is a text
+--snip
+Content-Disposition: form-data; name=blipp
+
+Another line
+--snip-- blah
+blah blah"
+      "snip"
+  in
+  r = ["blupp", "text/plain", "This is a text";
+       "blipp", "text/plain", "Another line" ]
+;;
+
+
+let t012 f =
+  (* A real example *)
+   let r =
+     f
+"-----------------------------10843891265508332411092264958
+Content-Disposition: form-data; name=\"line\"
+
+aaa
+-----------------------------10843891265508332411092264958
+Content-Disposition: form-data; name=\"submit\"
+
+Submit
+-----------------------------10843891265508332411092264958--
+"
+      "---------------------------10843891265508332411092264958"
+   in
+   r = [ "line", "text/plain", "aaa";
+        "submit", "text/plain", "Submit";
+       ]
+;;
+
+
+(**********************************************************************)
+(* encode/decode                                                      *)
+(**********************************************************************)
+
+let t100() =
+  let s = String.create 256 in
+  for i = 0 to 255 do s.[i] <- Char.chr i done;
+  let r = encode s in
+  r = ("%00%01%02%03%04%05%06%07%08%09%0A%0B%0C%0D%0E%0F" ^
+       "%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F" ^
+       "+!%22%23$%25%26'()*%2B,-.%2F" ^
+       "0123456789%3A%3B%3C%3D%3E%3F" ^
+       "%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_" ^
+       "%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D%7E%7F" ^
+       "%80%81%82%83%84%85%86%87%88%89%8A%8B%8C%8D%8E%8F" ^
+       "%90%91%92%93%94%95%96%97%98%99%9A%9B%9C%9D%9E%9F" ^
+       "%A0%A1%A2%A3%A4%A5%A6%A7%A8%A9%AA%AB%AC%AD%AE%AF" ^
+       "%B0%B1%B2%B3%B4%B5%B6%B7%B8%B9%BA%BB%BC%BD%BE%BF" ^
+       "%C0%C1%C2%C3%C4%C5%C6%C7%C8%C9%CA%CB%CC%CD%CE%CF" ^
+       "%D0%D1%D2%D3%D4%D5%D6%D7%D8%D9%DA%DB%DC%DD%DE%DF" ^
+       "%E0%E1%E2%E3%E4%E5%E6%E7%E8%E9%EA%EB%EC%ED%EE%EF" ^
+       "%F0%F1%F2%F3%F4%F5%F6%F7%F8%F9%FA%FB%FC%FD%FE%FF")
+;;
+
+
+let t101() =
+  let r = String.create 256 in
+  for i = 0 to 255 do r.[i] <- Char.chr i done;
+  let s = decode
+           ("%00%01%02%03%04%05%06%07%08%09%0A%0B%0C%0D%0E%0F" ^
+            "%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F" ^
+            "+!%22%23$%25%26'()*%2B,-.%2F" ^
+            "0123456789%3A%3B%3C%3D%3E%3F" ^
+            "%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_" ^
+            "%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D%7E%7F" ^
+            "%80%81%82%83%84%85%86%87%88%89%8A%8B%8C%8D%8E%8F" ^
+            "%90%91%92%93%94%95%96%97%98%99%9A%9B%9C%9D%9E%9F" ^
+            "%A0%A1%A2%A3%A4%A5%A6%A7%A8%A9%AA%AB%AC%AD%AE%AF" ^
+            "%B0%B1%B2%B3%B4%B5%B6%B7%B8%B9%BA%BB%BC%BD%BE%BF" ^
+            "%C0%C1%C2%C3%C4%C5%C6%C7%C8%C9%CA%CB%CC%CD%CE%CF" ^
+            "%D0%D1%D2%D3%D4%D5%D6%D7%D8%D9%DA%DB%DC%DD%DE%DF" ^
+            "%E0%E1%E2%E3%E4%E5%E6%E7%E8%E9%EA%EB%EC%ED%EE%EF" ^
+            "%F0%F1%F2%F3%F4%F5%F6%F7%F8%F9%FA%FB%FC%FD%FE%FF") in
+  r = s
+;;
+
+
+let t102() =
+  let r = String.create 256 in
+  for i = 0 to 255 do r.[i] <- Char.chr i done;
+  let s = decode
+           ((String.lowercase
+               ("%00%01%02%03%04%05%06%07%08%09%0A%0B%0C%0D%0E%0F" ^
+                "%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F" ^
+                "+!%22%23$%25%26'()*%2B,-.%2F" ^
+                "0123456789%3A%3B%3C%3D%3E%3F")) ^
+            "%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_" ^
+            (String.lowercase
+               ("%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D%7E%7F" ^
+                "%80%81%82%83%84%85%86%87%88%89%8A%8B%8C%8D%8E%8F" ^
+                "%90%91%92%93%94%95%96%97%98%99%9A%9B%9C%9D%9E%9F" ^
+                "%A0%A1%A2%A3%A4%A5%A6%A7%A8%A9%AA%AB%AC%AD%AE%AF" ^
+                "%B0%B1%B2%B3%B4%B5%B6%B7%B8%B9%BA%BB%BC%BD%BE%BF" ^
+                "%C0%C1%C2%C3%C4%C5%C6%C7%C8%C9%CA%CB%CC%CD%CE%CF" ^
+                "%D0%D1%D2%D3%D4%D5%D6%D7%D8%D9%DA%DB%DC%DD%DE%DF" ^
+                "%E0%E1%E2%E3%E4%E5%E6%E7%E8%E9%EA%EB%EC%ED%EE%EF" ^
+                "%F0%F1%F2%F3%F4%F5%F6%F7%F8%F9%FA%FB%FC%FD%FE%FF"))) in
+  r = s
+;;
+
+(**********************************************************************)
+(* dest_url_encoded_parameters                                        *)
+(**********************************************************************)
+
+let t200() =
+  let r = dest_url_encoded_parameters "a=b&c=d" in
+  r = ["a", "b"; "c", "d" ]
+;;
+
+
+let t201() =
+  let r = dest_url_encoded_parameters "a=&c=d" in
+  r = ["a", ""; "c", "d" ]
+;;
+
+
+let t202() =
+  let r = dest_url_encoded_parameters "a=&c=" in
+  r = ["a", ""; "c", "" ]
+;;
+
+
+let t203() =
+  let r = dest_url_encoded_parameters "" in
+  r = []
+;;
+
+
+let t204() =
+  let r = dest_url_encoded_parameters "%41=%42" in
+  r = ["A", "B"]
+;;
+
+
+(**********************************************************************)
+
+let test f n =
+  if f() then
+    print_endline ("Test " ^ n ^ " ok")
+  else
+    print_endline ("Test " ^ n ^ " FAILED!!!!");
+  flush stdout
+;;
+
+
+let test_dest_form_encoded_parameters f n =
+  let dest s b =
+    let args = dest_form_encoded_parameters s b default_config in
+    List.map
+      (fun a -> arg_name a, arg_mimetype a, arg_value a)
+      args
+  in
+  if f dest then
+    print_endline ("Test dest_form_encoded_parameters " ^ n ^ " ok")
+  else
+    print_endline ("Test dest_form_encoded_parameters " ^ n ^ " FAILED!!!!");
+  flush stdout
+;;
+
+
+let fill_stream s =
+  (* Returns a channel that reads from string s.
+   * This requires forking.
+   *)
+  let rd, wr = Unix.pipe() in
+  let pid = Unix.fork() in
+  if pid = 0 then begin
+    Unix.close rd;
+    let out = Unix.out_channel_of_descr wr in
+    output_string out s;
+    close_out out;
+    exit(0);
+  end;
+  Unix.close wr;
+  Unix.in_channel_of_descr rd
+;;
+
+
+let test_dest_form_encoded_parameters_from_netstream f n =
+  let dest s b =
+    let fd = fill_stream s in
+    let bs = String.length b * 2 in
+    let stream = Netstream.create_from_channel fd None bs in
+    let args = dest_form_encoded_parameters_from_netstream
+                stream b default_config in
+
+(*
+    List.iter
+      (fun a ->
+        Printf.printf "name=%s mimetype=%s value=%s\n"
+          (arg_name a) (arg_mimetype a) (arg_value a))
+      args;
+*)
+    List.map
+      (fun a -> arg_name a, arg_mimetype a, arg_value a)
+      args
+  in
+  if f dest then
+    Printf.printf
+      "Test dest_form_encoded_parameters_from_netstream %s ok\n"
+      n
+  else
+    print_endline ("Test dest_form_encoded_parameters_from_netstream " ^ n ^ " FAILED!!!!");
+  flush stdout
+;;
+
+
+
+test_dest_form_encoded_parameters t001 "001";;
+test_dest_form_encoded_parameters t002 "002";;
+test_dest_form_encoded_parameters t003 "003";;
+test_dest_form_encoded_parameters t004 "004";;
+test_dest_form_encoded_parameters t005 "005";;
+test_dest_form_encoded_parameters t006 "006";;
+test_dest_form_encoded_parameters t007 "007";;
+test_dest_form_encoded_parameters t008 "008";;
+test_dest_form_encoded_parameters t009 "009";;
+test_dest_form_encoded_parameters t010 "010";;
+test_dest_form_encoded_parameters t011 "011";;
+test_dest_form_encoded_parameters t012 "012";;
+
+test_dest_form_encoded_parameters_from_netstream t001 "001";;
+test_dest_form_encoded_parameters_from_netstream t002 "002";;
+test_dest_form_encoded_parameters_from_netstream t003 "003";;
+test_dest_form_encoded_parameters_from_netstream t004 "004";;
+test_dest_form_encoded_parameters_from_netstream t005 "005";;
+test_dest_form_encoded_parameters_from_netstream t006 "006";;
+test_dest_form_encoded_parameters_from_netstream t007 "007";;
+test_dest_form_encoded_parameters_from_netstream t008 "008";;
+test_dest_form_encoded_parameters_from_netstream t009 "009";;
+test_dest_form_encoded_parameters_from_netstream t010 "010";;
+test_dest_form_encoded_parameters_from_netstream t011 "011";;
+test_dest_form_encoded_parameters_from_netstream t012 "012";;
+
+test t100 "100";;
+test t101 "101";;
+test t102 "102";;
+
+test t200 "200";;
+test t201 "201";;
+test t202 "202";;
+test t203 "203";;
+test t204 "204";;