thirdparty/google_appengine/lib/webob/webob/headerdict.py
author Madhusudan.C.S <madhusudancs@gmail.com>
Sat, 03 Oct 2009 22:17:58 +0530
changeset 3002 2c5e9cd4ba4d
parent 109 620f9b141567
permissions -rwxr-xr-x
Fix the deadline counter to start counting only after Task claim is accepted. Deadline counter used to start when the task was claimed to be requested. This commit fixes that.

"""
Represents the response header list as a dictionary-like object.
"""

from webob.multidict import MultiDict
try:
    reversed
except NameError:
    from webob.util.reversed import reversed

class HeaderDict(MultiDict):

    """
    Like a MultiDict, this wraps a list.  Keys are normalized
    for case and whitespace.
    """

    def normalize(self, key):
        return str(key).lower().strip()

    def __getitem__(self, key):
        normalize = self.normalize
        key = normalize(key)
        for k, v in reversed(self._items):
            if normalize(k) == key:
                return v
        raise KeyError(key)

    def getall(self, key):
        normalize = self.normalize
        key = normalize(key)
        result = []
        for k, v in self._items:
            if normalize(k) == key:
                result.append(v)
        return result

    def mixed(self):
        result = {}
        multi = {}
        normalize = self.normalize
        for key, value in self.iteritems():
            key = normalize(key)
            if key in result:
                if key in multi:
                    result[key].append(value)
                else:
                    result[key] = [result[key], value]
                    multi[key] = None
            else:
                result[key] = value
        return result

    def dict_of_lists(self):
        result = {}
        normalize = self.normalize
        for key, value in self.iteritems():
            key = normalize(key)
            if key in result:
                result[key].append(value)
            else:
                result[key] = [value]
        return result

    def __delitem__(self, key):
        normalize = self.normalize
        key = normalize(key)
        items = self._items
        found = False
        for i in range(len(items)-1, -1, -1):
            if normalize(items[i][0]) == key:
                del items[i]
                found = True
        if not found:
            raise KeyError(key)

    def __contains__(self, key):
        normalize = self.normalize
        key = normalize(key)
        for k, v in self._items:
            if normalize(k) == key:
                return True
        return False

    has_key = __contains__

    def setdefault(self, key, default=None):
        normalize = self.normalize
        c_key = normalize(key)
        for k, v in self._items:
            if normalize(k) == c_key:
                return v
        self._items.append((key, default))
        return default

    def pop(self, key, *args):
        if len(args) > 1:
            raise TypeError, "pop expected at most 2 arguments, got "\
                              + repr(1 + len(args))
        key = self.normalize(key)
        for i in range(len(self._items)):
            if self.normalize(self._items[i][0]) == key:
                v = self._items[i][1]
                del self._items[i]
                return v
        if args:
            return args[0]
        else:
            raise KeyError(key)