1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
|
NAME
Text::Header - RFC 822/2068 `header' and `unheader' functions
SYNOPSIS
use Text::Header; # header and unheader exported
# Construct headers similar to CGI.pm and HTTP::Headers
@HEADERS = header(content_type => 'text/html',
author => 'Nathan Wiger',
last_modified => $date,
accept => [qw(text/html text/plain)]);
# The above produces the array:
@HEADERS = ("Content-Type: text/html\n",
"Author: Nathan Wiger\n",
"Last-Modified: Wed Sep 27 13:31:06 PDT 2000\n",
"Accept: text/html, text/plain\n");
# Can also construct SMTP headers to format mail
@mail_headers = header(from => 'Nathan Wiger <nate@sun.com>',
to => 'perl5-porters@perl.org');
print $MAIL @mail_headers, "\nKeep up the great work!\n";
# The above would print this to the $MAIL handle:
From: Nathan Wiger <nate@sun.com>
To: perl5-porters@perl.org
Keep up the great work!
DESCRIPTION
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'.
REFERENCES
This is designed as both a Perl 5 module and also a Perl 6 prototype.
Please see the Perl 6 proposal at http://dev.perl.org/rfc/333.html
This module is designed to be fully compliant with the internet
standards RFC 822 (SMTP Headers) and RFC 2068 (HTTP Headers).
AUTHOR
Copyright (c) 2000 Nathan Wiger <nate@sun.com>. All Rights Reserved.
This module is free software; you may copy this under the terms of the
GNU General Public License, or the Artistic License, copies of which
should have accompanied your Perl kit.
|