--- /dev/null
+#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";;