/*
* NAME: rfc822.c
* DESCRIPTION: process RFC822-style headers
*/
inherit "/std/string";
private
mapping headers; /* field/value pairs of RFC822 headers */
private
string current_line; /* current logical header (being built) */
/*
* NAME: create()
* DESCRIPTION: initialize at creation
*/
static
void create(void)
{
headers = ([ ]);
current_line = "";
}
/*
* NAME: complete()
* DESCRIPTION: process a complete header
*/
private
void complete(void)
{
string field, value;
mixed stored;
if (sscanf(current_line, "%s:%s", field, value) != 2)
error("Invalid RFC822 header");
field = tolower(field);
value = strip_whitespace(value);
if (stored = headers[field])
{
if (arrayp(stored))
headers[field] = stored + ({ value });
else
headers[field] = ({ stored, value });
}
else
headers[field] = value;
current_line = "";
}
/*
* NAME: receive_line()
* DESCRIPTION: build headers from a line of input
*/
static
int receive_line(string line)
{
if (! strlen(line))
{
if (strlen(current_line))
complete();
return 0; /* end of headers */
}
if (line[0] == ' ' || line[0] == '\t')
{
current_line += line;
return 1;
}
if (strlen(current_line))
complete(); /* process complete header */
current_line = line;
return 1;
}
/*
* NAME: get_header()
* DESCRIPTION: return the raw value of a header
*/
static
string get_header(string field)
{ return headers[field]; }
/*
* NAME: get_headers()
* DESCRIPTION: return all headers
*/
static
mapping get_headers(void)
{ return headers; }