Note: This is taken from the Chicken Wiki, where a more recent version could be available.
The stream-cgi egg is useful for creating applications that run under Common Gateway Interface.
This egg has the following limitations, which will likely be removed in the future:
You might find the html-stream egg useful.
The following is a trivial CGI application. You can call it using ?name=alejo as its QUERY_STRING.
(use stream-cgi html-stream) (cgi-main (lambda (get post cookies) (stream-append (string->stream "Content-type: text/html\n\n") (let ((name (get 'name))) (if (null? name) (html-stream (html (body (p "Hello, stranger!")))) (html-stream (html (body (p "Hello, " (b (car name)))))))))))
The CGI egg for Chicken Scheme is in the public domain and may be reproduced or copied without permission from its author. Citation of the source is appreciated.
This egg depends on the following:
[procedure] (cgi-main proc)
Initializes internal structures, calls the proc procedure and, after it returns, cleans things up.
proc is passed three argument: procedures that can used to obtain information received by the CGI from, respectively:
The functions passed to proc receive one argument, a symbol, and return a list with all its associated values as found on the inputs. If no values are found, the empty list is returned. The values are returned as srfi-40 streams of characters; values shorter than a given threshold are kept in memory while others are stored in temporary files. This allows the library to use a constant amount of memory, regardless of the size of the contents received through HTTP.
The functions passed to proc can not be called after proc returns. This is because they may depend on files that get removed when proc returns.
proc must return a srfi-40 stream with the contents to send to the browser, including HTTP headers; the actual headers in the HTTP response are generated by your web server.
Temporary files are created by the library by means of (create-temporary-file "chicken-cgi-input"). You probably want to make sure that the TMPDIR, TEMP or TMP environment variables are set to a meaningful directory, such as /tmp, where the user your application runs as (usually nobody) has write permissions.