You are looking at historical revision 1108 of this page. It may differ significantly from its current revision.


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 stream-html)

  (lambda (get post cookies)
      (string->stream "Content-type: text/html\n\n")
      (let ((name (get 'name)))
        (if (null? name)
          (html-stream (html (body (p "Hello, stranger!"))))
              (body (p "Hello, " (b (car name)))))))))))


The stream-cgi egg was created by Alejandro Forero Cuervo <>.


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:

Creating a CGI application

[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:

  1. The QUERY_STRING (or <input> objects in HTML forms using method GET)
  2. The contents uploaded through HTTP post requests.
  3. HTTP cookies.

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.

Version history

Fixed bug in invocation of <code>hash-table-walk</code> [Thanks to Michal Dybizbanski]
Adapted to SRFI-69-compatible hash-tables
Simple bug fixes
First public release