<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<META NAME="Generator" CONTENT="MS Exchange Server version 6.5.7652.24">
<TITLE>RE: [Web-SIG] Multiple message-header fields handling</TITLE>
</HEAD>
<BODY>
<!-- Converted from text/plain format -->

<P><FONT SIZE=2>Manlio Perillo wrote:<BR>
&gt; The HTTP 1.1 protocol (section 4.2) says that:<BR>
&gt; &quot;&quot;&quot;Multiple message-header fields with the same field-name MAY be<BR>
&gt; present in a message if and only if the entire field-value for that<BR>
&gt; header field is defined as a comma-separated list [i.e., #(values)].&quot;&quot;&quot;<BR>
&gt;<BR>
&gt; This can happen, as an example, with the Cookie header.<BR>
&gt;<BR>
&gt; My question is: how should this be handled in WSGI?<BR>
&gt;<BR>
&gt; As an example Nginx stores all the headers in a associative array,<BR>
&gt; where, of course, only the &quot;last seen&quot; headers appears.<BR>
&gt;<BR>
&gt; However common multiple message-headers are stored in the request struct.<BR>
&gt;<BR>
&gt; Since the WSGI environment is a dictionary with keys and values of type<BR>
&gt; str, should an implementation:<BR>
&gt; &quot;&quot;&quot;combine the multiple header fields into one &quot;field-name: field-value&quot;<BR>
&gt; pair, without changing the semantics of the message, by appending each<BR>
&gt; subsequent field-value to the first, each separated by a comma.&quot;&quot;&quot;<BR>
&gt; ?<BR>
<BR>
Yes, it should. As you note, it's part of the HTTP spec that such headers<BR>
can be combined without changing the semantics. Here's a list of the<BR>
headers that need to be folded:<BR>
<BR>
comma_separated_headers = ['ACCEPT', 'ACCEPT-CHARSET', 'ACCEPT-ENCODING',<BR>
&nbsp;&nbsp;&nbsp; 'ACCEPT-LANGUAGE', 'ACCEPT-RANGES', 'ALLOW', 'CACHE-CONTROL',<BR>
&nbsp;&nbsp;&nbsp; 'CONNECTION', 'CONTENT-ENCODING', 'CONTENT-LANGUAGE', 'EXPECT',<BR>
&nbsp;&nbsp;&nbsp; 'IF-MATCH', 'IF-NONE-MATCH', 'PRAGMA', 'PROXY-AUTHENTICATE', 'TE',<BR>
&nbsp;&nbsp;&nbsp; 'TRAILER', 'TRANSFER-ENCODING', 'UPGRADE', 'VARY', 'VIA', 'WARNING',<BR>
&nbsp;&nbsp;&nbsp; 'WWW-AUTHENTICATE']<BR>
<BR>
The only tricky one is Cookie, because e.g. Konqueror sends them on<BR>
multiple lines, but they're not foldable.<BR>
<BR>
See <A HREF="http://kristol.org/cookie/errata.html">http://kristol.org/cookie/errata.html</A><BR>
<BR>
&gt; Ngins does not do this (and I don't know what Apache does).<BR>
&gt;<BR>
&gt;<BR>
&gt; Another question: when an header has an empty field value, what should<BR>
&gt; be set in the environment: an empty string or None?<BR>
<BR>
An empty string, or omit them entirely:<BR>
<BR>
&quot;&quot;&quot;The following variables must be present, unless their value would<BR>
be an empty string, in which case they may be omitted, except as<BR>
otherwise noted below...<BR>
<BR>
HTTP_ Variables<BR>
&quot;&quot;&quot;.<BR>
<BR>
<BR>
Robert Brewer<BR>
fumanchu@aminus.org</FONT>
</P>

</BODY>
</HTML>