\chapter{RFC~822 Library}\label{cha:rfc822}
%
The \ex{rfc822} structure provides rudimentary support for parsing
headers according to RFC 822 \textit{Standard for the format of ARPA
  Internet text messages}.  These headers show up in SMTP messages,
HTTP headers, etc.

\defun{read-rfc822-field} {[port] [read-line]} {name body}
\begin{desc}
  
  Read one field from the port, and return two values:

  \begin{description}
  \item[\var{name}] This is a symbol describing the RFC 822 field
    name, such as \ex{subject} or \ex{to}.  The symbol consists of all
    lower-case letters.\footnote{In fact, it \ex{read-rfc822-field}
      uses the preferred case for symbols of the underlying Scheme
      implementation which, in the case of scsh, happens to be lower-case.}
  \item[\var{body}] This is list of strings which are the field's
    body, e.g.  Each list element is one line from the field's body,
    so if the field spreads out over three lines, then the body is a
    list of three strings. The terminating \ex{cr}/\ex{lf}'s are
    trimmed from each string.  Note that header bodies frequently contain
    space after the colon like this:
    %
\begin{verbatim}
Subject: RFC 822 can format itself in the ARPA
\end{verbatim}
    %
    In this case, \var{body} will be
\begin{verbatim}
(" RFC 822 can format itself in the ARPA")
\end{verbatim}
  \end{description}
  %
  When there are no more fields---EOF or a blank line has terminated
  the header section---then \ex{read-rfc822-field} returns [\sharpf\ \sharpf].

  \var{Port} is an optional input port to read from---it defaults to
  the value of \ex{(current-input-port)}.
  
  \var{Read-line} is an optional parameter specifying a procedure of
  one argument (the input port) used to read the raw header lines.
  The default used by \ex{read-rfc822-field} terminates lines with
  either \ex{cr}/\ex{lf} or just \ex{lf}, and it trims the terminator
  from the line.  This procedure should trim the terminator of the
  line, so an empty line is returned as an empty string.
  
  The procedure raises an error if the syntax of the read field (the
  line returned by the read-line-function) is illegal according to
  RFC~822.
\end{desc}

\defun{read-rfc822-headers} {[port] [read-line]} {association-list}
\begin{desc}
  This procedure reads in and parses a section of text that looks like
  the header portion of an RFC~822 message.  It returns an association
  list mapping a field name (a symbol such as 'date or 'subject) to a
  list of field bodies----one for each occurence of the field in the
  header. So if there are five \ex{Received-by} fields in the header,
  the alist maps \ex{received-by} to a five-element list. Each body is
  in turn represented by a list of strings----one for each line of the
  field.  So a field spread across three lines would produce a
  three-element body.
  
  \var{Port} and \var{read-line} are as with \ex{read-rfc822-field}.
\end{desc}

\defun{rejoin-header-lines} {alist [seperator]}  {association list}
\begin{desc}
  
  Takes a field \var{alist} such as is returned by
  \ex{read-rfc822-headers} and returns an equivalent association list.
  Each body (\str list) in the input \var{alist} is joined into a
  single list in the output alist. \var{separator} is the string used
  to join these elements together; it defaults to a single space, but
  can usefully be ``\verb|\n|'' (linefeed) or ``\verb|\r\n|''
  (carriage-return/line-feed).
  
  To rejoin a single body list, use scsh's \ex{join-strings}
  procedure.
\end{desc}
%
For the following definitions' examples, let's use this set of of
RFC~822 headers:
\begin{alltt}
     From: shivers
     To: ziggy,
       newts
     To: gjs, tk
\end{alltt}
%

\defun{get-header-all} {headers name} {string list list}
\begin{desc}
  Returns all entries or \sharpf, e.g.\
  \codex{(get-header-all hdrs 'to)}
  returns
  \codex{'((" ziggy," "  newts") (" gjs, tk"))}
\end{desc}

\defun{get-header-lines} {headers name} {string list}
\begin{desc}
  Returns all lines of the first entry or \sharpf, e.g.\
  \codex{(get-header-lines hdrs 'to)}
  returns
  \codex{(" ziggy," "  newts")}
\end{desc}

\defun{get-header} {headers name [separator]} {string}
\begin{desc}
  Returns the first entry with the lines joined together by seperator
  (newline by default), e.g.\
  \codex{(get-header hdrs 'to)}
  returns
\begin{alltt}
" ziggy,
  newts"
\end{alltt}
%
  Note, that \ex{newts} is led by two spaces.
\end{desc}

%%% Local Variables: 
%%% mode: latex
%%% TeX-master: "man"
%%% End: 
