An implementation of RFC 2388 in Common Lisp
Pull request Compare This branch is 4 commits behind jdz:master.
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.

This package contains an implementation of RFC 2388, which is used to process form data posted with HTTP POST method using enctype "multipart/form-data".

The main functions of interest are PARSE-MIME and PARSE-HEADER.

Use PARSE-MIME to parse MIME content. It can be given either a string or a stream. It returns a list of MIME parts. The second argument must be a boundary, which is a string that seperates MIME parts. See below how to obtain it.

PARSE-HEADER is used by PARSE-MIME internally, but you can use it to parse headers yourself. For instance, when data is posted to server using POST method, a header describing the content type is sent as well. Usually its content is application/x-www-form-urlencoded or something similar. But users may set it to multipart/form-data, with additional parameter named "boundary". This is how one would usually parse the posted data:

(let* ((header (parse-header <request-content-type> :value))
       (boundary (or (assoc "boundary" (header-parameters header)
                            :test #'string-equal)
                     (error "Form data is missing a boundary: ~S"
  (parse-mime <request-posted-content> boundary))

The :VALUE keyword parameter to PARSE-HEADER means that parsing should begin with header value, not name (because header name is "content-type" and the web server has already seperated them, at least in this scenario).