[Web-SIG] Multiple message-header fields handling

Alex Botero-Lowry alex at puddlejumper.foxybanana.com
Tue Oct 2 21:50:21 CEST 2007


On Tue, Oct 02, 2007 at 09:30:46PM +0200, Manlio Perillo wrote:
> The HTTP 1.1 protocol (section 4.2) says that:
> """Multiple message-header fields with the same field-name MAY be 
> present in a message if and only if the entire field-value for that 
> header field is defined as a comma-separated list [i.e., #(values)]."""
> 
> This can happen, as an example, with the Cookie header.
> 
> My question is: how should this be handled in WSGI?
> 
> As an example Nginx stores all the headers in a associative array, 
> where, of course, only the "last seen" headers appears.
> 
> However common multiple message-headers are stored in the request struct.
> 
Initially I used such a solution (cookies was a special property in the response
object), but I ended up just throwing together a custom dict that looks like:

class ResponseHeaders(dict):
        def __setitem__(self, item, val):
                if item in self:
                        iv = self[item]
                        if isinstance(iv, list):
                                iv.append(val)
                        else:
                                iv = [iv, val]
                        dict.__setitem__(self, item, iv)
                else:
                        dict.__setitem__(self, item, val)

        def replace(self, key, val):
                dict.__setitem__(self, key, val)

        def items(self):
                ret = []
                for k,v in dict.items(self):
                        if isinstance(v, list):
                                ret.extend([ (k, a) for a in v ])
                        else:
                                ret.append((k, v))
                return ret

        def iteritems(self):
                return iter(self.items())

It's really intended for passing the headers on to start_response, and for
getting the headers into it, rather then for reading from it, which is fine
99% of the time. I recently had to add replace since i had a situation where
I needed to overwrite a preset header, but other than that it serves me well.

Alex


More information about the Web-SIG mailing list