20 """Convenience function to format and return a key=value pair. |
20 """Convenience function to format and return a key=value pair. |
21 This will quote the value if needed or if quote is true. |
21 This will quote the value if needed or if quote is true. |
22 """ |
22 """ |
23 if value is not None and len(value) > 0: |
23 if value is not None and len(value) > 0: |
24 if quote or tspecials.search(value): |
24 if quote or tspecials.search(value): |
25 value = value.replace('\\', '\\\\').replace('"', r'\"') |
25 value = value.replace(b'\\', b'\\\\').replace(b'"', r'\"') |
26 return '%s="%s"' % (param, value) |
26 return b'%s="%s"' % (param, value) |
27 else: |
27 else: |
28 return '%s=%s' % (param, value) |
28 return b'%s=%s' % (param, value) |
29 else: |
29 else: |
30 return param |
30 return param |
31 |
31 |
32 |
32 |
33 class Headers(object): |
33 class Headers(object): |
34 """Manage a collection of HTTP response headers""" |
34 """Manage a collection of HTTP response headers""" |
35 |
35 |
36 def __init__(self, headers=None): |
36 def __init__(self, headers=None): |
37 headers = headers if headers is not None else [] |
37 headers = headers if headers is not None else [] |
38 if type(headers) is not list: |
38 if type(headers) is not list: |
39 raise TypeError("Headers must be a list of name/value tuples") |
39 raise TypeError(b"Headers must be a list of name/value tuples") |
40 self._headers = headers |
40 self._headers = headers |
41 if __debug__: |
41 if __debug__: |
42 for k, v in headers: |
42 for k, v in headers: |
43 self._convert_string_type(k) |
43 self._convert_string_type(k) |
44 self._convert_string_type(v) |
44 self._convert_string_type(v) |
132 return r"%s(%r)" % (self.__class__.__name__, self._headers) |
132 return r"%s(%r)" % (self.__class__.__name__, self._headers) |
133 |
133 |
134 def __str__(self): |
134 def __str__(self): |
135 """str() returns the formatted headers, complete with end line, |
135 """str() returns the formatted headers, complete with end line, |
136 suitable for direct HTTP transmission.""" |
136 suitable for direct HTTP transmission.""" |
137 return '\r\n'.join(["%s: %s" % kv for kv in self._headers] + ['', '']) |
137 return b'\r\n'.join( |
|
138 [b"%s: %s" % kv for kv in self._headers] + [b'', b''] |
|
139 ) |
138 |
140 |
139 def __bytes__(self): |
141 def __bytes__(self): |
140 return str(self).encode('iso-8859-1') |
142 return str(self).encode('iso-8859-1') |
141 |
143 |
142 def setdefault(self, name, value): |
144 def setdefault(self, name, value): |
172 _value = self._convert_string_type(_value) |
174 _value = self._convert_string_type(_value) |
173 parts.append(_value) |
175 parts.append(_value) |
174 for k, v in _params.items(): |
176 for k, v in _params.items(): |
175 k = self._convert_string_type(k) |
177 k = self._convert_string_type(k) |
176 if v is None: |
178 if v is None: |
177 parts.append(k.replace('_', '-')) |
179 parts.append(k.replace(b'_', b'-')) |
178 else: |
180 else: |
179 v = self._convert_string_type(v) |
181 v = self._convert_string_type(v) |
180 parts.append(_formatparam(k.replace('_', '-'), v)) |
182 parts.append(_formatparam(k.replace(b'_', b'-'), v)) |
181 self._headers.append( |
183 self._headers.append( |
182 (self._convert_string_type(_name), "; ".join(parts)) |
184 (self._convert_string_type(_name), b"; ".join(parts)) |
183 ) |
185 ) |