118 lines · 4.0 KB · Standard ML
RawDownload
(* mosml/examples/cgi/cgitest.sml   Retrieve and print all fields from a CGI request.    Peter Sestoft, 1997-05-07, 1999-04-20 *) open Mosmlcgi; fun output_string(s) =              TextIO.output(TextIO.stdOut,"Content-type: text/html\n\n" ^ s ^ "\n\n"); fun showOpt (info, value) =     case value of 	NONE   => print (info ^ " is not available\n<p>")      | SOME s => app print [info, " = ", s, "\n<p>"] fun prtseq (pr, sep) xs =     let fun h []      = ()	  | h [x]     = pr x	  | h (x::xr) = (pr x; print sep; h xr)    in h xs end fun showList (info, value) =     (print info; print " = ";      prtseq (fn s => print s, ",") value;      print "\n<p>") fun adminfo () =     (showList ("cgi_fieldnames", cgi_fieldnames);     showList ("cgi_partnames",  cgi_partnames);     app showOpt      [("cgi_server_software",   cgi_server_software),      ("cgi_server_name",       cgi_server_name),      ("cgi_gateway_interface", cgi_gateway_interface),      ("cgi_server_protocol",   cgi_server_protocol),      ("cgi_server_port",       cgi_server_port),      ("cgi_request_method",    cgi_request_method),      ("cgi_http_accept",       cgi_http_accept),      ("cgi_http_user_agent",   cgi_http_user_agent),      ("cgi_http_referer",      cgi_http_referer),      ("cgi_path_info",         cgi_path_info),      ("cgi_path_translated",   cgi_path_translated),      ("cgi_script_name",       cgi_script_name),      ("cgi_query_string",      cgi_query_string),      ("cgi_remote_host",       cgi_remote_host),      ("cgi_remote_addr",       cgi_remote_addr),      ("cgi_remote_user",       cgi_remote_user),      ("cgi_remote_ident",      cgi_remote_ident),      ("cgi_auth_type",         cgi_auth_type),      ("cgi_content_type",      cgi_content_type),      ("cgi_content_length",    cgi_content_length),      ("cgi_annotation_server", cgi_annotation_server),      ("cgi_http_cookie",       cgi_http_cookie),      ("cgi_http_forwarded",    cgi_http_forwarded),      ("cgi_http_host",         cgi_http_host),      ("cgi_http_proxy_connection", cgi_http_proxy_connection),      ("cgi_script_filename",   cgi_script_filename),      ("cgi_document_root",     cgi_document_root),      ("cgi_server_admin",      cgi_server_admin),      ("cgi_api_version",       cgi_api_version),      ("cgi_the_request",       cgi_the_request),      ("cgi_request_uri",       cgi_request_uri),      ("cgi_request_filename",  cgi_request_filename),      ("cgi_is_subreq",         cgi_is_subreq)])    fun showpart name =    let val part = valOf(cgi_part name)    in	print ("<H2>Part `" ^ name ^ "'</H2>\n");	app (fn field => showOpt (field, part_field_string part field))	    (part_fieldnames part);	showOpt("Content type", part_type part);	print "<P><PRE>"; print (part_data part); print "</PRE>"    end fun showfield field = showOpt (field, cgi_field_string field) fun savepart name =    let val part = valOf (cgi_part name)    in 	case part_field_string part "filename" of	    NONE          => ()	  | SOME filename => 		let open BinIO		    val tmpfile = "/tmp/" ^ filename		    val os = openOut tmpfile		in 		    output (os, Byte.stringToBytes (part_data part));		    closeOut os;		    print "<p>Saving file ";		    print tmpfile;		    print " (";		    print (Int.toString (size (part_data part)));		    print " bytes)"		end    end fun err s = TextIO.output(TextIO.stdErr, s); val _ =     (print "Content-type: text/html\n\n";     print "<HTML><P><BR CLEAR>";     (case cgi_partnames of	  [] => ()	| _  => (print "<H1>Parts and their contents</H1>";		 app showpart (* savepart *) cgi_partnames));     (case cgi_fieldnames of	  [] => ()	| _  => (print "<H1>CGI field names and their values</H1>";		 app showfield cgi_fieldnames));     print "<H1>Administrative information</h1>";     adminfo ();     print "<P><HR>This text was generated by the mosmlcgi \      \script testcgi.sml on ";     print (Date.toString(Date.fromTimeLocal(Time.now())));     print "</BODY></HTML>")    handle exn => err "An exception occurred"