This module provides two new functions, "header" and "unheader", which provide general-purpose RFC 822
header construction and parsing. They do not provide any intelligent defaults of HTTP-specific methods.
They are simply aimed at providing an easy means to address the mechanics of header parsing.
The output style is designed to mimic "CGI.pm" and "HTTP::Headers", so that users familiar with these
interfaces will feel at home with these functions. As shown above, the "headers" function automatically
does the following:
1. uc's the first letter of each tag token and lc's the
rest, also converting _'s to -'s automatically
2. Adds a colon separating each tag and its value, and
exactly one newline after each one
3. Combines list elements into a comma-delimited
string
Note that a list is always joined into a comma-delimited string. To insert multiple separate headers,
simply call "header" with multiple args:
push @out, header(accept => 'text/html',
accept => 'text/plain');
This would create multiple "Accept:" lines.
Note that unlike "CGI.pm", the "header" function provided here does not provide any intelligent defaults.
If called as:
@out_headers = header;
It will return an empty list. This allows "header" to be more general pupose, so it can provide SMTP and
other headers as well. You can also use it as a generic text formatting tool, hence the reason it's under
the "Text::" hierarchy.
The "unheader" function works in exactly the opposite direction from "header", pulling apart headers and
returning a list. "unheader":
1. lc's the entire tag name, converting -'s to _'s
2. Separates each tag based on the colon delimiter,
chomping newlines.
3. Returns a list of tag/value pairs for easy assignment
to a hash
So, assuming the @HEADERS array shown up top:
%myheaders = unheader(@HEADERS);
The hash %myheaders would have the following values:
%myheaders = (
content_type => 'text/html',
author => 'Nathan Wiger',
last_modified => 'Wed Sep 27 13:31:06 PDT 2000',
accept => 'text/html, text/plain'
);
Note that all keys are converted to lowercase, and their values have their newlines stripped. However,
note that comma-separated fields are not split up on input. This cannot be done reliably because some
fields, such as the HTTP "Date:" header, can contain commas even though they are not lists. Inferring
this type of structure would require knowledge of content, and these functions are specifically designed
to be content-independent.
The "unheader" function will respect line wrapping, as seen in SMTP headers. It will simply join the
lines and return the value, so that:
%mail = unheader("To: Nathan Wiger <nate@sun.com>,
perl5-porters@perl.org");
Would return:
$mail{to} = "Nathan Wiger <nate@sun.com>, perl5-porters@perl.org"
Notice that multiple spaces between the comma separator have been condensed to a single space. Since the
"header" and "unheader" functions are direct inverses, this call:
@out = header unheader @in;
Will result in @out being exactly equivalent to @in.