@code{(require 'html-form)} @defvar *html:output-port* Procedure names starting with @samp{html:} send their output to the port @var{*html:output-port*}. @var{*html:output-port*} is initially the current output port. @end defvar @defun make-atval txt Returns a string with character substitutions appropriate to send @var{txt} as an @dfn{attribute-value}. @cindex attribute-value @end defun @defun make-plain txt Returns a string with character substitutions appropriate to send @var{txt} as an @dfn{plain-text}. @cindex plain-text @end defun @defun html:start-page title backlink @dots{} Outputs headers for an HTML page named @var{title}. @end defun @defun html:end-page Outputs HTML codes to end a page. @end defun @defun html:pre line1 line @dots{} Writes (using @code{html:printf}) the strings @var{line1}, @var{lines} as @dfn{PRE}formmated plain text (rendered in fixed-width font). @cindex PRE Newlines are inserted between @var{line1}, @var{lines}. HTML tags (@samp{}) within @var{lines} will be visible verbatim. @end defun @defun html:comment line1 line @dots{} Writes (using @code{html:printf}) the strings @var{line1} as HTML comments. @end defun @section HTML Tables @defun html:start-table caption @end defun @defun html:end-table @end defun @defun html:heading columns Outputs a heading row for the currently-started table. @end defun @defun html:href-heading columns urls Outputs a heading row with column-names @var{columns} linked to URLs @var{urls}. @end defun @defun make-row-converter k foreigns The positive integer @var{k} is the primary-key-limit (number of primary-keys) of the table. @var{foreigns} is a list of the filenames of foreign-key field pages and #f for non foreign-key fields. @code{make-row-converter} returns a procedure taking a row for its single argument. This returned procedure prints the table row to @var{*html:output-port*}. @end defun @defun table-name->filename table-name Returns the symbol @var{table-name} converted to a filename. @end defun @defun table->html caption db table-name match-key1 @dots{} Writes HTML for @var{db} table @var{table-name} to @var{*html:output-port*}. The optional @var{match-key1} @dots{} arguments restrict actions to a subset of the table. @xref{Table Operations, match-key}. @end defun @defun table->page db table-name index-filename Writes a complete HTML page to @var{*html:output-port*}. The string @var{index-filename} names the page which refers to this one. @end defun @defun catalog->html db caption Writes HTML for the catalog table of @var{db} to @var{*html:output-port*}. @end defun @defun catalog->page db caption Writes a complete HTML page for the catalog of @var{db} to @var{*html:output-port*}. @end defun @section HTML Forms @defun html:start-form method action The symbol @var{method} is either @code{get}, @code{head}, @code{post}, @code{put}, or @code{delete}. @code{html:start-form} prints the header for an HTML @dfn{form}. @cindex form @end defun @defun html:end-form pname submit-label @code{html:end-form} prints the footer for an HTML @dfn{form}. The string @var{submit-label} @cindex form appears on the button which submits the form. @end defun @defun command->html rdb command-table command method action The symbol @var{command-table} names a command table in the @var{rdb} relational database. @code{command->html} writes an HTML-2.0 @dfn{form} for command @var{command} to the @cindex form current-output-port. The @samp{SUBMIT} button, which is labeled @var{command}, invokes the URI @var{action} with method @var{method} with a hidden attribute @code{*command*} bound to the command symbol submitted. An action may invoke a CGI script (@samp{http://www.my-site.edu/cgi-bin/search.cgi}) or HTTP daemon (@samp{http://www.my-site.edu:8001}). This example demonstrates how to create a HTML-form for the @samp{build} command. @example (require (in-vicinity (implementation-vicinity) "build.scm")) (call-with-output-file "buildscm.html" (lambda (port) (fluid-let ((*html:output-port* port)) (html:start-page 'commands) (command->html build '*commands* 'build 'post (or "/cgi-bin/build.cgi" "http://localhost:8081/buildscm")) html:end-page))) @end example @end defun @c node HTTP and CGI service, Printing Scheme, HTML Forms, Textual Conversion Packages @section HTTP and CGI service @code{(require 'html-form)} @defun cgi:serve-command rdb command-table Reads a @samp{"POST"} or @samp{"GET"} query from @code{(current-input-port)} and executes the encoded command from @var{command-table} in relational-database @var{rdb}. This example puts up a plain-text page in response to a CGI query. @example (display "Content-Type: text/plain") (newline) (newline) (require 'html-form) (load (in-vicinity (implementation-vicinity) "build.scm")) (cgi:serve-command build '*commands*) @end example @end defun @defun serve-urlencoded-command rdb command-table urlencoded Reads attribute-value pairs from @var{urlencoded}, converts them to parameters and invokes the @var{rdb} command named by the parameter @code{*command*}. @end defun @defun http:serve-query input-port output-port serve-proc reads the @dfn{query-string} from @var{input-port}. If this is a valid @cindex query-string @samp{"POST"} or @samp{"GET"} query, then @code{http:serve-query} calls @var{serve-proc} with two arguments, the query-string and the header-alist. Otherwise, @code{http:serve-query} replies (to @var{output-port}) with appropriate HTML describing the problem. @end defun This example services HTTP queries from port 8081: @example (define socket (make-stream-socket AF_INET 0)) (socket:bind socket 8081) (socket:listen socket 10) (dynamic-wind (lambda () #f) (lambda () (do ((port (socket:accept socket) (socket:accept socket))) (#f) (dynamic-wind (lambda () #f) (lambda () (fluid-let ((*html:output-port* port)) (http:serve-query port port (lambda (query-string header) (http:send-header '(("Content-Type" . "text/plain"))) (with-output-to-port port (lambda () (serve-urlencoded-command build '*commands* query-string))))))) (lambda () (close-port port))))) (lambda () (close-port socket))) @end example @defun http:read-request-line port Reads the first non-blank line from @var{port} and, if successful, returns a list of three itmes from the request-line: @enumerate 0 @item Method Either one of the symbols @code{options}, @code{get}, @code{head}, @code{post}, @code{put}, @code{delete}, or @code{trace}; Or a string. @item Request-URI A string. At the minimum, it will be the string @samp{"/"}. @item HTTP-Version A string. For example, @samp{HTTP/1.0}. @end enumerate @end defun @defun cgi:read-query-string Reads the @dfn{query-string} from @code{(current-input-port)}. @cindex query-string @code{cgi:read-query-string} reads a @samp{"POST"} or @samp{"GET"} queries, depending on the value of @code{(getenv "REQUEST_METHOD")}. @end defun