self._last_key = norm_name
if norm_name in self:
# bypass our override of __setitem__ since it modifies _as_list
- dict.__setitem__(self, norm_name, self[norm_name] + ',' + value)
+ dict.__setitem__(self, norm_name,
+ native_str(self[norm_name]) + ',' +
+ native_str(value))
self._as_list[norm_name].append(value)
else:
self[norm_name] = value
class MultiHeaderHandler(RequestHandler):
def get(self):
self.set_header("x-overwrite", "1")
- self.set_header("x-overwrite", 2)
+ self.set_header("X-Overwrite", 2)
self.add_header("x-multi", 3)
- self.add_header("x-multi", "4")
+ self.add_header("X-Multi", "4")
class RedirectHandler(RequestHandler):
def clear(self):
"""Resets all headers and content for this response."""
- # The performance cost of tornado.httputil.HTTPHeaders is significant
- # (slowing down a benchmark with a trivial handler by more than 10%),
- # and its case-normalization is not generally necessary for
- # headers we generate on the server side, so use a plain dict
- # and list instead.
- self._headers = {
- "Server": "TornadoServer/%s" % tornado.version,
- "Content-Type": "text/html; charset=UTF-8",
- "Date": datetime.datetime.utcnow().strftime(
- "%a, %d %b %Y %H:%M:%S GMT"),
- }
- self._list_headers = []
+ self._headers = httputil.HTTPHeaders({
+ "Server": "TornadoServer/%s" % tornado.version,
+ "Content-Type": "text/html; charset=UTF-8",
+ "Date": datetime.datetime.utcnow().strftime(
+ "%a, %d %b %Y %H:%M:%S GMT"),
+ })
self.set_default_headers()
if not self.request.supports_http_1_1():
if self.request.headers.get("Connection") == "Keep-Alive":
Unlike `set_header`, `add_header` may be called multiple times
to return multiple values for the same header.
"""
- self._list_headers.append((name, self._convert_header_value(value)))
+ self._headers.add(name, self._convert_header_value(value))
def clear_header(self, name):
"""Clears an outgoing header, undoing a previous `set_header` call.
lines = [utf8(self.request.version + " " +
str(self._status_code) +
" " + reason)]
- lines.extend([(utf8(n) + b": " + utf8(v)) for n, v in
- itertools.chain(self._headers.items(), self._list_headers)])
+ lines.extend([utf8(n) + b": " + utf8(v) for n, v in self._headers.get_all()])
+
if hasattr(self, "_new_cookie"):
for cookie in self._new_cookie.values():
lines.append(utf8("Set-Cookie: " + cookie.OutputString(None)))
assert handler._finished
reason = handler._reason
status = str(handler._status_code) + " " + reason
- headers = list(handler._headers.items()) + handler._list_headers
+ headers = list(handler._headers.get_all())
if hasattr(handler, "_new_cookie"):
for cookie in handler._new_cookie.values():
headers.append(("Set-Cookie", cookie.OutputString(None)))