summaryrefslogtreecommitdiffstats
path: root/google_appengine/lib/webob/webob/headerdict.py
diff options
context:
space:
mode:
Diffstat (limited to 'google_appengine/lib/webob/webob/headerdict.py')
-rwxr-xr-xgoogle_appengine/lib/webob/webob/headerdict.py110
1 files changed, 110 insertions, 0 deletions
diff --git a/google_appengine/lib/webob/webob/headerdict.py b/google_appengine/lib/webob/webob/headerdict.py
new file mode 100755
index 0000000..34b8378
--- /dev/null
+++ b/google_appengine/lib/webob/webob/headerdict.py
@@ -0,0 +1,110 @@
+"""
+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)
+