bertjwregeer: ```
# master before this branch
Benchmark : hello
Frameworks: pyramid
                ms     rps  tcalls  funcs
pyramid       9430   10604     144     73

# Fixes applied
(howareyou)alexandra:howareyou xistence$ howareyou -b hello -f pyramid
Benchmark : hello
Frameworks: pyramid
                ms     rps  tcalls  funcs
pyramid       8112   12327     123     72
```
bertjwregeer: ```
# WebOb 1.6.1
Benchmark : hello
Frameworks: pyramid
                ms     rps  tcalls  funcs
pyramid       5299   18870      74     58

# WebOb with this branch
Benchmark : hello
Frameworks: pyramid
                ms     rps  tcalls  funcs
pyramid       5051   19797      71     56
```
diff --git a/webob/descriptors.py b/webob/descriptors.py
index 5fd26eb..15867ce 100644
--- a/webob/descriptors.py
+++ b/webob/descriptors.py
@@ -146,10 +146,7 @@ def header_getter(header, rfc_section):
             r._headerlist.append((header, value))
 
     def fdel(r):
-        items = r._headerlist
-        for i in range(len(items)-1, -1, -1):
-            if items[i][0].lower() == key:
-                del items[i]
+        r._headerlist[:] = [(k, v) for (k, v) in r._headerlist if k.lower() != key]
 
     return property(fget, fset, fdel, doc)
 
diff --git a/webob/headers.py b/webob/headers.py
index e2f5e34..55385c8 100644
--- a/webob/headers.py
+++ b/webob/headers.py
@@ -21,11 +21,7 @@ class ResponseHeaders(MultiDict):
 
     def getall(self, key):
         key = key.lower()
-        result = []
-        for k, v in self._items:
-            if k.lower() == key:
-                result.append(v)
-        return result
+        return [v for (k, v) in self._items if k.lower() == key]
 
     def mixed(self):
         r = self.dict_of_lists()
@@ -42,10 +38,7 @@ class ResponseHeaders(MultiDict):
 
     def __setitem__(self, key, value):
         norm_key = key.lower()
-        items = self._items
-        for i in range(len(items)-1, -1, -1):
-            if items[i][0].lower() == norm_key:
-                del items[i]
+        self._items[:] = [(k, v) for (k, v) in self._items if k.lower() != norm_key]
         self._items.append((key, value))
 
     def __delitem__(self, key):
diff --git a/webob/response.py b/webob/response.py
index 607ac34..98a5699 100644
--- a/webob/response.py
+++ b/webob/response.py
@@ -212,8 +212,25 @@ class Response(object):
         else:
             self._headerlist = headerlist
 
-        # Set up the content_type
-        content_type = content_type or self.default_content_type
+        # Set the encoding for the Response to charset, so if a charset is
+        # passed but the Content-Type does not allow for a charset, we can
+        # still encode text_type body's.
+        # r = Response(
+        #   content_type='application/foo',
+        #   charset='UTF-8',
+        #   body=u'somebody')
+        # Should work without issues, and the header will be correctly set to
+        # Content-Type: application/foo with no charset on it.
+
+        encoding = None
+        if charset is not _marker:
+            encoding = charset
+
+        # Does the status code have a body or not?
+        code_has_body = (
+            self._status[0] != '1' and
+            self._status[:3] not in ('204', '205', '304')
+        )
 
         # We only set the content_type to the one passed to the constructor or
         # the default content type if there is none that exists AND there was
@@ -223,27 +240,59 @@ class Response(object):
         #
         # Also allow creation of a empty Response with just the status set to a
         # Response with empty body, such as Response(status='204 No Content')
-        # without the default content_type being set
-
-        if (
-            self.content_type is None and
-            headerlist is None and
-            _code_has_body(self.status_code)
-        ):
-            self.content_type = content_type
-
-        # Set up the charset
+        # without the default content_type being set (since empty bodies have
+        # no Content-Type)
         #
-        # In contrast with the above, if a charset is not set but there is a
-        # content_type we will set the default charset if the content_type
-        # allows for a charset.
+        # Check if content_type is set because default_content_type could be
+        # None, in which case there is no content_type, and thus we don't need
+        # to anything
 
-        if self.content_type:
-            if not self.charset and charset is not _marker:
-                self.charset = charset
-            elif not self.charset and self.default_charset:
-                if _content_type_has_charset(self.content_type):
-                    self.charset = self.default_charset
+        content_type = content_type or self.default_content_type
+
+        if headerlist is None and code_has_body and content_type:
+            # Set up the charset, if the content_type doesn't already have one
+
+            has_charset = 'charset=' in content_type
+
+            # If the Content-Type already has a charset, we don't set the user
+            # provided charset on the Content-Type, so we shouldn't use it as
+            # the encoding for text_type based body's.
+            if has_charset:
+                encoding = None
+
+            # Do not use the default_charset for the encoding because we
+            # want things like
+            # Response(content_type='image/jpeg',body=u'foo') to raise when
+            # trying to encode the body.
+
+            new_charset = encoding
+
+            if (
+                not has_charset and
+                charset is _marker and
+                self.default_charset
+            ):
+                new_charset = self.default_charset
+
+            # Optimize for the default_content_type as shipped by
+            # WebOb, becuase we know that 'text/html' has a charset,
+            # otherwise add a charset if the content_type has a charset.
+            #
+            # Even if the user supplied charset explicitly, we do not add
+            # it to the Content-Type unless it has has a charset, instead
+            # the user supplied charset is solely used for encoding the
+            # body if it is a text_type
+
+            if (
+                new_charset and
+                (
+                    content_type == 'text/html' or
+                    _content_type_has_charset(content_type)
+                )
+            ):
+                content_type += '; charset=' + new_charset
+
+            self._headerlist.append(('Content-Type', content_type))
 
         # Set up conditional response
         if conditional_response is None:
@@ -251,17 +300,30 @@ class Response(object):
         else:
             self.conditional_response = bool(conditional_response)
 
-        # Set up app_iter
-        if app_iter is None:
+        # Set up app_iter if the HTTP Status code has a body
+        if app_iter is None and code_has_body:
             if isinstance(body, text_type):
-                encoding = self.charset
+                # Fall back to trying self.charset if encoding is not set. In
+                # most cases encoding will be set to the default value.
+                encoding = encoding or self.charset
                 if encoding is None:
                     raise TypeError(
                         "You cannot set the body to a text value without a "
                         "charset")
                 body = body.encode(encoding)
             app_iter = [body]
-            self.headers['Content-Length'] = str(len(body))
+
+            if headerlist is not None:
+                self._headerlist[:] = [
+                    (k, v)
+                    for (k, v)
+                    in self._headerlist
+                    if k.lower() != 'content-length'
+                ]
+            self._headerlist.append(('Content-Length', str(len(body))))
+        elif app_iter is None or not code_has_body:
+            app_iter = [b'']
+
         self._app_iter = app_iter
 
         # Loop through all the remaining keyword arguments
@@ -439,7 +501,7 @@ class Response(object):
         The headers in a dictionary-like object
         """
         if self._headers is None:
-            self._headers = ResponseHeaders.view_list(self.headerlist)
+            self._headers = ResponseHeaders.view_list(self._headerlist)
         return self._headers
 
     def _headers__set(self, value):
@@ -1206,6 +1268,23 @@ class Response(object):
         if set_content_md5:
             self.content_md5 = md5_digest
 
+    @staticmethod
+    def _make_location_absolute(environ, value):
+        if SCHEME_RE.search(value):
+            return value
+
+        new_location = urlparse.urljoin(_request_uri(environ), value)
+        return new_location
+
+    def _abs_headerlist(self, environ):
+        # Build the headerlist, if we have a Location header, make it absolute
+        return [
+            (k, v) if k.lower() != 'location'
+            else (k, self._make_location_absolute(environ, v))
+            for (k, v)
+            in self._headerlist
+        ]
+
     #
     # __call__, conditional_response_app
     #
@@ -1216,27 +1295,15 @@ class Response(object):
         """
         if self.conditional_response:
             return self.conditional_response_app(environ, start_response)
+
         headerlist = self._abs_headerlist(environ)
+
         start_response(self.status, headerlist)
         if environ['REQUEST_METHOD'] == 'HEAD':
             # Special case here...
             return EmptyResponse(self._app_iter)
         return self._app_iter
 
-    def _abs_headerlist(self, environ):
-        """Returns a headerlist, with the Location header possibly
-        made absolute given the request environ.
-        """
-        headerlist = list(self.headerlist)
-        for i, (name, value) in enumerate(headerlist):
-            if name.lower() == 'location':
-                if SCHEME_RE.search(value):
-                    break
-                new_location = urlparse.urljoin(_request_uri(environ), value)
-                headerlist[i] = (name, new_location)
-                break
-        return headerlist
-
     _safe_methods = ('GET', 'HEAD')
 
     def conditional_response_app(self, environ, start_response):
@@ -1248,7 +1315,9 @@ class Response(object):
         * Range               (406 Partial Content; only on GET, HEAD)
         """
         req = BaseRequest(environ)
+
         headerlist = self._abs_headerlist(environ)
+
         method = environ.get('REQUEST_METHOD', 'GET')
         if method in self._safe_methods:
             status304 = False
@@ -1436,13 +1505,6 @@ class EmptyResponse(object):
 
     __next__ = next # py3
 
-def _code_has_body(status_code):
-    return (
-        (not (100 <= status_code < 199)) and
-        (status_code != 204) and
-        (status_code != 304)
-    )
-
 def _is_xml(content_type):
     return (
         content_type.startswith('application/xml') or

performance degradation on trunk
I thought I'd try Morepath with webob trunk. It's a lot slower than before. But I'll demonstrate with Pyramid,  as I don't want to confuse the issue by using development versions of Morepath. I use this benchmark:

https://github.com/faassen/howareyou

When I run Pyramid against webob 1.6.1:

```
$ howareyou -b hello -f pyramid
Benchmark : hello
Frameworks: pyramid
                ms     rps  tcalls  funcs
pyramid       4051   24687      74     58
```

When I run Pyramid against webob trunk:

```
Benchmark : hello
Frameworks: pyramid
                ms     rps  tcalls  funcs
pyramid       7410   13495     144     73
```

Here is the top profile functions with WebOb 1.6.1:

```
   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
   100000    0.661    0.000    3.921    0.000 router.py:66(handle_request)
   100000    0.427    0.000    0.646    0.000 response.py:87(__init__)
   100000    0.340    0.000    4.744    0.000 router.py:179(invoke_subrequest)
   100000    0.239    0.000    0.456    0.000 traversal.py:632(__call__)
   100000    0.238    0.000    0.285    0.000 response.py:1043(_abs_headerlist)
   300000    0.236    0.000    0.273    0.000 interface.py:518(__hash__)
   100000    0.219    0.000    5.828    0.000 run.py:46(<lambda>)
   100000    0.204    0.000    5.524    0.000 router.py:227(__call__)
   100000    0.170    0.000    0.767    0.000 urldispatch.py:80(__call__)
   200000    0.152    0.000    0.249    0.000 decorator.py:39(__get__)
```

With master:

```
   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
   100000    0.910    0.000    5.402    0.000 response.py:176(__init__)
   700000    0.731    0.000    0.883    0.000 headers.py:15(__getitem__)
   100000    0.688    0.000    8.905    0.000 router.py:66(handle_request)
   700000    0.586    0.000    1.469    0.000 _abcoll.py:379(get)
   300000    0.477    0.000    0.715    0.000 headers.py:43(__setitem__)
   300000    0.372    0.000    1.505    0.000 response.py:762(_content_type__get)
   100000    0.366    0.000    9.808    0.000 router.py:179(invoke_subrequest)
  1000000    0.302    0.000    0.511    0.000 response.py:432(_headers__get)
   100000    0.268    0.000    0.808    0.000 response.py:731(_charset__set)
   100000    0.254    0.000    0.801    0.000 response.py:796(_content_type__set)
```

Various response header manipulation code now shows up in the profile whereas before it did not.

What's interesting is that if I run the profiler against the development version of Morepath, I see almost the same webob stuff dominate the benchmarks in the same order, while usually the webob stuff is actually not in the top 10.

diff --git a/tests/test_request.py b/tests/test_request.py
index 524214d..9650702 100644
--- a/tests/test_request.py
+++ b/tests/test_request.py
@@ -3282,7 +3282,7 @@ class TestRequest_functional(object):
         assert res.status == '200 OK'
         from webob.headers import ResponseHeaders
         assert isinstance(res.headers, ResponseHeaders)
-        assert list(res.headers.items()) == [('Content-Type', 'text/plain; charset=UTF-8')]
+        assert list(res.headers.items()) == [('Content-Type', 'text/plain')]
         assert res.body == b'Hi!'
 
     def test_call_WSGI_app_204(self):
@@ -3329,7 +3329,7 @@ class TestRequest_functional(object):
         assert res.status == '200 OK'
         from webob.headers import ResponseHeaders
         assert isinstance(res.headers, ResponseHeaders)
-        assert list(res.headers.items()) == [('Content-Type', 'text/plain; charset=UTF-8')]
+        assert list(res.headers.items()) == [('Content-Type', 'text/plain')]
         assert res.body == b'Hi!'
 
     def equal_req(self, req, inp):
diff --git a/tests/test_response.py b/tests/test_response.py
index 867d433..fd4615a 100644
--- a/tests/test_response.py
+++ b/tests/test_response.py
@@ -18,7 +18,7 @@ def teardown_module(module):
 
 def simple_app(environ, start_response):
     start_response('200 OK', [
-        ('Content-Type', 'text/html; charset=utf8'),
+        ('Content-Type', 'text/html; charset=UTF-8'),
         ])
     return ['OK']
 
@@ -28,7 +28,7 @@ def test_response():
     assert res.status == '200 OK'
     assert res.status_code == 200
     assert res.body == "OK"
-    assert res.charset == 'utf8'
+    assert res.charset == "UTF-8"
     assert res.content_type == 'text/html'
     res.status = 404
     assert res.status == '404 Not Found'
@@ -158,7 +158,7 @@ def test_cookies():
     r2 = res.merge_cookies(simple_app)
     r2 = BaseRequest.blank('/').get_response(r2)
     assert r2.headerlist == [
-        ('Content-Type', 'text/html; charset=utf8'),
+        ('Content-Type', 'text/html; charset=UTF-8'),
         ('Set-Cookie', 'x=test; Path=/'),
         ]
 
@@ -476,19 +476,6 @@ def test_has_body():
     messing_with_privates._app_iter = None
     assert not messing_with_privates.has_body
 
-def test_content_type_in_headerlist():
-    # Couldn't manage to clone Response in order to modify class
-    # attributes safely. Shouldn't classes be fresh imported for every
-    # test?
-    default_content_type = Response.default_content_type
-    Response.default_content_type = None
-    try:
-        res = Response(headerlist=[('Content-Type', 'text/html')], charset='utf8')
-        assert res._headerlist
-        assert res.charset == 'utf8'
-    finally:
-        Response.default_content_type = default_content_type
-
 def test_str_crlf():
     res = Response('test')
     assert '\r\n' in str(res)
@@ -989,6 +976,7 @@ def test_cache_control_get():
 
 def test_location():
     res = Response()
+    res.status = '301'
     res.location = '/test.html'
     assert res.location == '/test.html'
     req = Request.blank('/')
@@ -1195,20 +1183,35 @@ def test_decode_content_gzip():
     res.decode_content()
     assert res.body == b'abc'
 
-def test__abs_headerlist_location_with_scheme():
-    res = Response()
-    res.content_encoding = 'gzip'
-    res.headerlist = [('Location', 'http:')]
-    result = res._abs_headerlist({})
-    assert result, [('Location' == 'http:')]
-
-def test__abs_headerlist_location_no_scheme():
-    res = Response()
-    res.content_encoding = 'gzip'
-    res.headerlist = [('Location', '/abc')]
-    result = res._abs_headerlist({'wsgi.url_scheme': 'http',
-                                  'HTTP_HOST': 'example.com:80'})
-    assert result == [('Location', 'http://example.com/abc')]
+def test__make_location_absolute_has_scheme_only():
+    result = Response._make_location_absolute(
+        {
+            'wsgi.url_scheme': 'http',
+            'HTTP_HOST': 'example.com:80'
+        },
+        'http:'
+    )
+    assert result == 'http:'
+
+def test__make_location_absolute_path():
+    result = Response._make_location_absolute(
+        {
+            'wsgi.url_scheme': 'http',
+            'HTTP_HOST': 'example.com:80'
+        },
+        '/abc'
+    )
+    assert result == 'http://example.com/abc'
+
+def test__make_location_absolute_already_absolute():
+    result = Response._make_location_absolute(
+        {
+            'wsgi.url_scheme': 'http',
+            'HTTP_HOST': 'example.com:80'
+        },
+        'https://funcptr.net/'
+    )
+    assert result == 'https://funcptr.net/'
 
 def test_response_set_body_file1():
     data = b'abc'
@@ -1241,3 +1244,72 @@ def test_cache_expires_set_zero_then_nonzero():
     assert not res.cache_control.no_store
     assert not res.cache_control.must_revalidate
     assert res.cache_control.max_age == 1
+
+def test_default_content_type():
+    class NoDefault(Response):
+        default_content_type = None
+
+    res = NoDefault()
+    assert res.content_type is None
+
+def test_default_charset():
+    class DefaultCharset(Response):
+        default_charset = 'UTF-16'
+
+    res = DefaultCharset()
+    assert res.content_type == 'text/html'
+    assert res.charset == 'UTF-16'
+    assert res.headers['Content-Type'] == 'text/html; charset=UTF-16'
+
+def test_header_list_no_defaults():
+    res = Response(headerlist=[])
+    assert res.headerlist == [('Content-Length', '0')]
+    assert res.content_type is None
+    assert res.charset is None
+    assert res.body == b''
+
+def test_204_has_no_body():
+    res = Response(status='204 No Content')
+    assert res.body == b''
+    assert res.content_length is None
+    assert res.headerlist == []
+
+def test_204_app_iter_set():
+    res = Response(status='204', app_iter=[b'test'])
+    assert res.body == b''
+    assert res.content_length is None
+    assert res.headerlist == []
+
+def test_explicit_charset():
+    res = Response(charset='UTF-16')
+    assert res.content_type == 'text/html'
+    assert res.charset == 'UTF-16'
+
+def test_set_content_type():
+    res = Response(content_type='application/json')
+    res.content_type = 'application/foo'
+    assert res.content_type == 'application/foo'
+
+def test_raises_no_charset():
+    with pytest.raises(TypeError):
+        Response(content_type='image/jpeg', body=text_(b'test'))
+
+def test_raises_none_charset():
+    with pytest.raises(TypeError):
+        Response(
+            content_type='image/jpeg',
+            body=text_(b'test'),
+            charset=None)
+
+def test_doesnt_raise_with_charset_content_type_has_no_charset():
+    res = Response(content_type='image/jpeg', body=text_(b'test'), charset='utf-8')
+    assert res.body == b'test'
+    assert res.content_type == 'image/jpeg'
+    assert res.charset is None
+
+def test_content_type_has_charset():
+    res = Response(content_type='application/foo; charset=UTF-8', body=text_(b'test'))
+    assert res.body == b'test'
+    assert res.content_type == 'application/foo'
+    assert res.charset == 'UTF-8'
+    assert res.headers['Content-Type'] == 'application/foo; charset=UTF-8'

pip install -e .[testing]
parse_log_pytest
pytest
pytest
3.9
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
coverage==7.8.0
exceptiongroup @ file:///croot/exceptiongroup_1706031385326/work
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
packaging @ file:///croot/packaging_1734472117206/work
pluggy @ file:///croot/pluggy_1733169602837/work
pytest @ file:///croot/pytest_1738938843180/work
pytest-cov==6.0.0
tomli @ file:///opt/conda/conda-bld/tomli_1657175507142/work
-e git+https://github.com/Pylons/webob.git@8bed3b0112df7b1de3755a37924979799749e5f2#egg=WebOb

name: webob
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - exceptiongroup=1.2.0=py39h06a4308_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - packaging=24.2=py39h06a4308_0
  - pip=25.0=py39h06a4308_0
  - pluggy=1.5.0=py39h06a4308_0
  - pytest=8.3.4=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tomli=2.0.1=py39h06a4308_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - coverage==7.8.0
      - pytest-cov==6.0.0
prefix: /opt/conda/envs/webob

tests/test_request.py::TestRequest_functional::test_call_WSGI_app tests/test_request.py::TestRequest_functional::test_get_response_catch_exc_info_true tests/test_response.py::test__make_location_absolute_has_scheme_only tests/test_response.py::test__make_location_absolute_path tests/test_response.py::test__make_location_absolute_already_absolute tests/test_response.py::test_204_has_no_body tests/test_response.py::test_204_app_iter_set tests/test_response.py::test_doesnt_raise_with_charset_content_type_has_no_charset
tests/test_response.py::test_response_file_body_tell
tests/test_request.py::TestRequestCommon::test_ctor_environ_getter_raises_WTF tests/test_request.py::TestRequestCommon::test_ctor_wo_environ_raises_WTF tests/test_request.py::TestRequestCommon::test_ctor_w_environ tests/test_request.py::TestRequestCommon::test_ctor_w_non_utf8_charset tests/test_request.py::TestRequestCommon::test_scheme tests/test_request.py::TestRequestCommon::test_body_file_getter tests/test_request.py::TestRequestCommon::test_body_file_getter_seekable tests/test_request.py::TestRequestCommon::test_body_file_getter_cache tests/test_request.py::TestRequestCommon::test_body_file_getter_unreadable tests/test_request.py::TestRequestCommon::test_body_file_setter_w_bytes tests/test_request.py::TestRequestCommon::test_body_file_setter_non_bytes tests/test_request.py::TestRequestCommon::test_body_file_deleter tests/test_request.py::TestRequestCommon::test_body_file_raw tests/test_request.py::TestRequestCommon::test_body_file_seekable_input_not_seekable tests/test_request.py::TestRequestCommon::test_body_file_seekable_input_is_seekable tests/test_request.py::TestRequestCommon::test_urlvars_getter_w_paste_key tests/test_request.py::TestRequestCommon::test_urlvars_getter_w_wsgiorg_key tests/test_request.py::TestRequestCommon::test_urlvars_getter_wo_keys tests/test_request.py::TestRequestCommon::test_urlvars_setter_w_paste_key tests/test_request.py::TestRequestCommon::test_urlvars_setter_w_wsgiorg_key tests/test_request.py::TestRequestCommon::test_urlvars_setter_wo_keys tests/test_request.py::TestRequestCommon::test_urlvars_deleter_w_paste_key tests/test_request.py::TestRequestCommon::test_urlvars_deleter_w_wsgiorg_key_non_empty_tuple tests/test_request.py::TestRequestCommon::test_urlvars_deleter_w_wsgiorg_key_empty_tuple tests/test_request.py::TestRequestCommon::test_urlvars_deleter_wo_keys tests/test_request.py::TestRequestCommon::test_urlargs_getter_w_paste_key tests/test_request.py::TestRequestCommon::test_urlargs_getter_w_wsgiorg_key tests/test_request.py::TestRequestCommon::test_urlargs_getter_wo_keys tests/test_request.py::TestRequestCommon::test_urlargs_setter_w_paste_key tests/test_request.py::TestRequestCommon::test_urlargs_setter_w_wsgiorg_key tests/test_request.py::TestRequestCommon::test_urlargs_setter_wo_keys tests/test_request.py::TestRequestCommon::test_urlargs_deleter_w_wsgiorg_key tests/test_request.py::TestRequestCommon::test_urlargs_deleter_w_wsgiorg_key_empty tests/test_request.py::TestRequestCommon::test_urlargs_deleter_wo_keys tests/test_request.py::TestRequestCommon::test_cookies_empty_environ tests/test_request.py::TestRequestCommon::test_cookies_is_mutable tests/test_request.py::TestRequestCommon::test_cookies_w_webob_parsed_cookies_matching_source tests/test_request.py::TestRequestCommon::test_cookies_w_webob_parsed_cookies_mismatched_source tests/test_request.py::TestRequestCommon::test_set_cookies tests/test_request.py::TestRequestCommon::test_body_getter tests/test_request.py::TestRequestCommon::test_body_setter_None tests/test_request.py::TestRequestCommon::test_body_setter_non_string_raises tests/test_request.py::TestRequestCommon::test_body_setter_value tests/test_request.py::TestRequestCommon::test_body_deleter_None tests/test_request.py::TestRequestCommon::test_json_body tests/test_request.py::TestRequestCommon::test_json_body_array tests/test_request.py::TestRequestCommon::test_text_body tests/test_request.py::TestRequestCommon::test__text_get_without_charset tests/test_request.py::TestRequestCommon::test__text_set_without_charset tests/test_request.py::TestRequestCommon::test_POST_not_POST_or_PUT tests/test_request.py::TestRequestCommon::test_POST_existing_cache_hit tests/test_request.py::TestRequestCommon::test_PUT_missing_content_type tests/test_request.py::TestRequestCommon::test_PATCH_missing_content_type tests/test_request.py::TestRequestCommon::test_POST_missing_content_type tests/test_request.py::TestRequestCommon::test_POST_json_no_content_type tests/test_request.py::TestRequestCommon::test_PUT_bad_content_type tests/test_request.py::TestRequestCommon::test_POST_multipart tests/test_request.py::TestRequestCommon::test_GET_reflects_query_string tests/test_request.py::TestRequestCommon::test_GET_updates_query_string tests/test_request.py::TestRequestCommon::test_cookies_wo_webob_parsed_cookies tests/test_request.py::TestRequestCommon::test_copy_get tests/test_request.py::TestRequestCommon::test_remove_conditional_headers_accept_encoding tests/test_request.py::TestRequestCommon::test_remove_conditional_headers_if_modified_since tests/test_request.py::TestRequestCommon::test_remove_conditional_headers_if_none_match tests/test_request.py::TestRequestCommon::test_remove_conditional_headers_if_range tests/test_request.py::TestRequestCommon::test_remove_conditional_headers_range tests/test_request.py::TestRequestCommon::test_is_body_readable_POST tests/test_request.py::TestRequestCommon::test_is_body_readable_PATCH tests/test_request.py::TestRequestCommon::test_is_body_readable_GET tests/test_request.py::TestRequestCommon::test_is_body_readable_unknown_method_and_content_length tests/test_request.py::TestRequestCommon::test_is_body_readable_special_flag tests/test_request.py::TestRequestCommon::test_cache_control_reflects_environ tests/test_request.py::TestRequestCommon::test_cache_control_updates_environ tests/test_request.py::TestRequestCommon::test_cache_control_set_dict tests/test_request.py::TestRequestCommon::test_cache_control_set_object tests/test_request.py::TestRequestCommon::test_cache_control_gets_cached tests/test_request.py::TestRequestCommon::test_call_application_calls_application tests/test_request.py::TestRequestCommon::test_call_application_provides_write tests/test_request.py::TestRequestCommon::test_call_application_closes_iterable_when_mixed_w_write_calls tests/test_request.py::TestRequestCommon::test_call_application_raises_exc_info tests/test_request.py::TestRequestCommon::test_call_application_returns_exc_info tests/test_request.py::TestRequestCommon::test_blank__method_subtitution tests/test_request.py::TestRequestCommon::test_blank__ctype_in_env tests/test_request.py::TestRequestCommon::test_blank__ctype_in_headers tests/test_request.py::TestRequestCommon::test_blank__ctype_as_kw tests/test_request.py::TestRequestCommon::test_blank__str_post_data_for_unsupported_ctype tests/test_request.py::TestRequestCommon::test_blank__post_urlencoded tests/test_request.py::TestRequestCommon::test_blank__post_multipart tests/test_request.py::TestRequestCommon::test_blank__post_files tests/test_request.py::TestRequestCommon::test_blank__post_file_w_wrong_ctype tests/test_request.py::TestRequestCommon::test_from_bytes_extra_data tests/test_request.py::TestRequestCommon::test_as_bytes_skip_body tests/test_request.py::TestBaseRequest::test_method tests/test_request.py::TestBaseRequest::test_http_version tests/test_request.py::TestBaseRequest::test_script_name tests/test_request.py::TestBaseRequest::test_path_info tests/test_request.py::TestBaseRequest::test_content_length_getter tests/test_request.py::TestBaseRequest::test_content_length_setter_w_str tests/test_request.py::TestBaseRequest::test_remote_user tests/test_request.py::TestBaseRequest::test_remote_addr tests/test_request.py::TestBaseRequest::test_query_string tests/test_request.py::TestBaseRequest::test_server_name tests/test_request.py::TestBaseRequest::test_server_port_getter tests/test_request.py::TestBaseRequest::test_server_port_setter_with_string tests/test_request.py::TestBaseRequest::test_uscript_name tests/test_request.py::TestBaseRequest::test_upath_info tests/test_request.py::TestBaseRequest::test_upath_info_set_unicode tests/test_request.py::TestBaseRequest::test_content_type_getter_no_parameters tests/test_request.py::TestBaseRequest::test_content_type_getter_w_parameters tests/test_request.py::TestBaseRequest::test_content_type_setter_w_None tests/test_request.py::TestBaseRequest::test_content_type_setter_existing_paramter_no_new_paramter tests/test_request.py::TestBaseRequest::test_content_type_deleter_clears_environ_value tests/test_request.py::TestBaseRequest::test_content_type_deleter_no_environ_value tests/test_request.py::TestBaseRequest::test_headers_getter tests/test_request.py::TestBaseRequest::test_headers_setter tests/test_request.py::TestBaseRequest::test_no_headers_deleter tests/test_request.py::TestBaseRequest::test_client_addr_xff_singleval tests/test_request.py::TestBaseRequest::test_client_addr_xff_multival tests/test_request.py::TestBaseRequest::test_client_addr_prefers_xff tests/test_request.py::TestBaseRequest::test_client_addr_no_xff tests/test_request.py::TestBaseRequest::test_client_addr_no_xff_no_remote_addr tests/test_request.py::TestBaseRequest::test_host_port_w_http_host_and_no_port tests/test_request.py::TestBaseRequest::test_host_port_w_http_host_and_standard_port tests/test_request.py::TestBaseRequest::test_host_port_w_http_host_and_oddball_port tests/test_request.py::TestBaseRequest::test_host_port_w_http_host_https_and_no_port tests/test_request.py::TestBaseRequest::test_host_port_w_http_host_https_and_standard_port tests/test_request.py::TestBaseRequest::test_host_port_w_http_host_https_and_oddball_port tests/test_request.py::TestBaseRequest::test_host_port_wo_http_host tests/test_request.py::TestBaseRequest::test_host_url_w_http_host_and_no_port tests/test_request.py::TestBaseRequest::test_host_url_w_http_host_and_standard_port tests/test_request.py::TestBaseRequest::test_host_url_w_http_host_and_oddball_port tests/test_request.py::TestBaseRequest::test_host_url_w_http_host_https_and_no_port tests/test_request.py::TestBaseRequest::test_host_url_w_http_host_https_and_standard_port tests/test_request.py::TestBaseRequest::test_host_url_w_http_host_https_and_oddball_port tests/test_request.py::TestBaseRequest::test_host_url_wo_http_host tests/test_request.py::TestBaseRequest::test_application_url tests/test_request.py::TestBaseRequest::test_path_url tests/test_request.py::TestBaseRequest::test_path tests/test_request.py::TestBaseRequest::test_path_qs_no_qs tests/test_request.py::TestBaseRequest::test_path_qs_w_qs tests/test_request.py::TestBaseRequest::test_url_no_qs tests/test_request.py::TestBaseRequest::test_url_w_qs tests/test_request.py::TestBaseRequest::test_relative_url_to_app_true_wo_leading_slash tests/test_request.py::TestBaseRequest::test_relative_url_to_app_true_w_leading_slash tests/test_request.py::TestBaseRequest::test_relative_url_to_app_false_other_w_leading_slash tests/test_request.py::TestBaseRequest::test_relative_url_to_app_false_other_wo_leading_slash tests/test_request.py::TestBaseRequest::test_path_info_pop_empty tests/test_request.py::TestBaseRequest::test_path_info_pop_just_leading_slash tests/test_request.py::TestBaseRequest::test_path_info_pop_non_empty_no_pattern tests/test_request.py::TestBaseRequest::test_path_info_pop_non_empty_w_pattern_miss tests/test_request.py::TestBaseRequest::test_path_info_pop_non_empty_w_pattern_hit tests/test_request.py::TestBaseRequest::test_path_info_pop_skips_empty_elements tests/test_request.py::TestBaseRequest::test_path_info_peek_empty tests/test_request.py::TestBaseRequest::test_path_info_peek_just_leading_slash tests/test_request.py::TestBaseRequest::test_path_info_peek_non_empty tests/test_request.py::TestBaseRequest::test_is_xhr_no_header tests/test_request.py::TestBaseRequest::test_is_xhr_header_miss tests/test_request.py::TestBaseRequest::test_is_xhr_header_hit tests/test_request.py::TestBaseRequest::test_host_getter_w_HTTP_HOST tests/test_request.py::TestBaseRequest::test_host_getter_wo_HTTP_HOST tests/test_request.py::TestBaseRequest::test_host_setter tests/test_request.py::TestBaseRequest::test_host_deleter_hit tests/test_request.py::TestBaseRequest::test_host_deleter_miss tests/test_request.py::TestBaseRequest::test_domain_nocolon tests/test_request.py::TestBaseRequest::test_domain_withcolon tests/test_request.py::TestBaseRequest::test_encget_raises_without_default tests/test_request.py::TestBaseRequest::test_encget_doesnt_raises_with_default tests/test_request.py::TestBaseRequest::test_encget_with_encattr tests/test_request.py::TestBaseRequest::test_encget_with_encattr_latin_1 tests/test_request.py::TestBaseRequest::test_encget_no_encattr tests/test_request.py::TestBaseRequest::test_relative_url tests/test_request.py::TestBaseRequest::test_header_getter tests/test_request.py::TestBaseRequest::test_json_body tests/test_request.py::TestBaseRequest::test_host_get tests/test_request.py::TestBaseRequest::test_host_get_w_no_http_host tests/test_request.py::TestLegacyRequest::test_method tests/test_request.py::TestLegacyRequest::test_http_version tests/test_request.py::TestLegacyRequest::test_script_name tests/test_request.py::TestLegacyRequest::test_path_info tests/test_request.py::TestLegacyRequest::test_content_length_getter tests/test_request.py::TestLegacyRequest::test_content_length_setter_w_str tests/test_request.py::TestLegacyRequest::test_remote_user tests/test_request.py::TestLegacyRequest::test_remote_addr tests/test_request.py::TestLegacyRequest::test_query_string tests/test_request.py::TestLegacyRequest::test_server_name tests/test_request.py::TestLegacyRequest::test_server_port_getter tests/test_request.py::TestLegacyRequest::test_server_port_setter_with_string tests/test_request.py::TestLegacyRequest::test_uscript_name tests/test_request.py::TestLegacyRequest::test_upath_info tests/test_request.py::TestLegacyRequest::test_upath_info_set_unicode tests/test_request.py::TestLegacyRequest::test_content_type_getter_no_parameters tests/test_request.py::TestLegacyRequest::test_content_type_getter_w_parameters tests/test_request.py::TestLegacyRequest::test_content_type_setter_w_None tests/test_request.py::TestLegacyRequest::test_content_type_setter_existing_paramter_no_new_paramter tests/test_request.py::TestLegacyRequest::test_content_type_deleter_clears_environ_value tests/test_request.py::TestLegacyRequest::test_content_type_deleter_no_environ_value tests/test_request.py::TestLegacyRequest::test_headers_getter tests/test_request.py::TestLegacyRequest::test_headers_setter tests/test_request.py::TestLegacyRequest::test_no_headers_deleter tests/test_request.py::TestLegacyRequest::test_client_addr_xff_singleval tests/test_request.py::TestLegacyRequest::test_client_addr_xff_multival tests/test_request.py::TestLegacyRequest::test_client_addr_prefers_xff tests/test_request.py::TestLegacyRequest::test_client_addr_no_xff tests/test_request.py::TestLegacyRequest::test_client_addr_no_xff_no_remote_addr tests/test_request.py::TestLegacyRequest::test_host_port_w_http_host_and_no_port tests/test_request.py::TestLegacyRequest::test_host_port_w_http_host_and_standard_port tests/test_request.py::TestLegacyRequest::test_host_port_w_http_host_and_oddball_port tests/test_request.py::TestLegacyRequest::test_host_port_w_http_host_https_and_no_port tests/test_request.py::TestLegacyRequest::test_host_port_w_http_host_https_and_standard_port tests/test_request.py::TestLegacyRequest::test_host_port_w_http_host_https_and_oddball_port tests/test_request.py::TestLegacyRequest::test_host_port_wo_http_host tests/test_request.py::TestLegacyRequest::test_host_url_w_http_host_and_no_port tests/test_request.py::TestLegacyRequest::test_host_url_w_http_host_and_standard_port tests/test_request.py::TestLegacyRequest::test_host_url_w_http_host_and_oddball_port tests/test_request.py::TestLegacyRequest::test_host_url_w_http_host_https_and_no_port tests/test_request.py::TestLegacyRequest::test_host_url_w_http_host_https_and_standard_port tests/test_request.py::TestLegacyRequest::test_host_url_w_http_host_https_and_oddball_port tests/test_request.py::TestLegacyRequest::test_host_url_wo_http_host tests/test_request.py::TestLegacyRequest::test_application_url tests/test_request.py::TestLegacyRequest::test_path_url tests/test_request.py::TestLegacyRequest::test_path tests/test_request.py::TestLegacyRequest::test_path_qs_no_qs tests/test_request.py::TestLegacyRequest::test_path_qs_w_qs tests/test_request.py::TestLegacyRequest::test_url_no_qs tests/test_request.py::TestLegacyRequest::test_url_w_qs tests/test_request.py::TestLegacyRequest::test_relative_url_to_app_true_wo_leading_slash tests/test_request.py::TestLegacyRequest::test_relative_url_to_app_true_w_leading_slash tests/test_request.py::TestLegacyRequest::test_relative_url_to_app_false_other_w_leading_slash tests/test_request.py::TestLegacyRequest::test_relative_url_to_app_false_other_wo_leading_slash tests/test_request.py::TestLegacyRequest::test_path_info_pop_empty tests/test_request.py::TestLegacyRequest::test_path_info_pop_just_leading_slash tests/test_request.py::TestLegacyRequest::test_path_info_pop_non_empty_no_pattern tests/test_request.py::TestLegacyRequest::test_path_info_pop_non_empty_w_pattern_miss tests/test_request.py::TestLegacyRequest::test_path_info_pop_non_empty_w_pattern_hit tests/test_request.py::TestLegacyRequest::test_path_info_pop_skips_empty_elements tests/test_request.py::TestLegacyRequest::test_path_info_peek_empty tests/test_request.py::TestLegacyRequest::test_path_info_peek_just_leading_slash tests/test_request.py::TestLegacyRequest::test_path_info_peek_non_empty tests/test_request.py::TestLegacyRequest::test_is_xhr_no_header tests/test_request.py::TestLegacyRequest::test_is_xhr_header_miss tests/test_request.py::TestLegacyRequest::test_is_xhr_header_hit tests/test_request.py::TestLegacyRequest::test_host_getter_w_HTTP_HOST tests/test_request.py::TestLegacyRequest::test_host_getter_wo_HTTP_HOST tests/test_request.py::TestLegacyRequest::test_host_setter tests/test_request.py::TestLegacyRequest::test_host_deleter_hit tests/test_request.py::TestLegacyRequest::test_host_deleter_miss tests/test_request.py::TestLegacyRequest::test_encget_raises_without_default tests/test_request.py::TestLegacyRequest::test_encget_doesnt_raises_with_default tests/test_request.py::TestLegacyRequest::test_encget_with_encattr tests/test_request.py::TestLegacyRequest::test_encget_no_encattr tests/test_request.py::TestLegacyRequest::test_relative_url tests/test_request.py::TestLegacyRequest::test_header_getter tests/test_request.py::TestLegacyRequest::test_json_body tests/test_request.py::TestLegacyRequest::test_host_get_w_http_host tests/test_request.py::TestLegacyRequest::test_host_get_w_no_http_host tests/test_request.py::TestRequestConstructorWarnings::test_ctor_w_unicode_errors tests/test_request.py::TestRequestConstructorWarnings::test_ctor_w_decode_param_names tests/test_request.py::TestRequestWithAdhocAttr::test_adhoc_attrs_set tests/test_request.py::TestRequestWithAdhocAttr::test_adhoc_attrs_set_nonadhoc tests/test_request.py::TestRequestWithAdhocAttr::test_adhoc_attrs_get tests/test_request.py::TestRequestWithAdhocAttr::test_adhoc_attrs_get_missing tests/test_request.py::TestRequestWithAdhocAttr::test_adhoc_attrs_del tests/test_request.py::TestRequestWithAdhocAttr::test_adhoc_attrs_del_missing tests/test_request.py::TestRequest_functional::test_gets tests/test_request.py::TestRequest_functional::test_gets_with_query_string tests/test_request.py::TestRequest_functional::test_language_parsing1 tests/test_request.py::TestRequest_functional::test_language_parsing2 tests/test_request.py::TestRequest_functional::test_language_parsing3 tests/test_request.py::TestRequest_functional::test_mime_parsing1 tests/test_request.py::TestRequest_functional::test_mime_parsing2 tests/test_request.py::TestRequest_functional::test_mime_parsing3 tests/test_request.py::TestRequest_functional::test_accept_best_match tests/test_request.py::TestRequest_functional::test_from_mimeparse tests/test_request.py::TestRequest_functional::test_headers tests/test_request.py::TestRequest_functional::test_bad_cookie tests/test_request.py::TestRequest_functional::test_cookie_quoting tests/test_request.py::TestRequest_functional::test_path_quoting tests/test_request.py::TestRequest_functional::test_params tests/test_request.py::TestRequest_functional::test_copy_body tests/test_request.py::TestRequest_functional::test_already_consumed_stream tests/test_request.py::TestRequest_functional::test_broken_seek tests/test_request.py::TestRequest_functional::test_set_body tests/test_request.py::TestRequest_functional::test_broken_clen_header tests/test_request.py::TestRequest_functional::test_nonstr_keys tests/test_request.py::TestRequest_functional::test_authorization tests/test_request.py::TestRequest_functional::test_as_bytes tests/test_request.py::TestRequest_functional::test_as_text tests/test_request.py::TestRequest_functional::test_req_kw_none_val tests/test_request.py::TestRequest_functional::test_env_keys tests/test_request.py::TestRequest_functional::test_repr_nodefault tests/test_request.py::TestRequest_functional::test_request_noenviron_param tests/test_request.py::TestRequest_functional::test_unexpected_kw tests/test_request.py::TestRequest_functional::test_conttype_set_del tests/test_request.py::TestRequest_functional::test_headers2 tests/test_request.py::TestRequest_functional::test_host_url tests/test_request.py::TestRequest_functional::test_path_info_p tests/test_request.py::TestRequest_functional::test_urlvars_property tests/test_request.py::TestRequest_functional::test_urlargs_property tests/test_request.py::TestRequest_functional::test_host_property tests/test_request.py::TestRequest_functional::test_body_property tests/test_request.py::TestRequest_functional::test_repr_invalid tests/test_request.py::TestRequest_functional::test_from_garbage_file tests/test_request.py::TestRequest_functional::test_from_file_patch tests/test_request.py::TestRequest_functional::test_from_bytes tests/test_request.py::TestRequest_functional::test_from_text tests/test_request.py::TestRequest_functional::test_blank tests/test_request.py::TestRequest_functional::test_post_does_not_reparse tests/test_request.py::TestRequest_functional::test_middleware_body tests/test_request.py::TestRequest_functional::test_body_file_noseek tests/test_request.py::TestRequest_functional::test_cgi_escaping_fix tests/test_request.py::TestRequest_functional::test_content_type_none tests/test_request.py::TestRequest_functional::test_body_file_seekable tests/test_request.py::TestRequest_functional::test_request_init tests/test_request.py::TestRequest_functional::test_request_query_and_POST_vars tests/test_request.py::TestRequest_functional::test_request_put tests/test_request.py::TestRequest_functional::test_request_patch tests/test_request.py::TestRequest_functional::test_call_WSGI_app_204 tests/test_request.py::TestRequest_functional::test_call_WSGI_app_no_content_type tests/test_request.py::TestFakeCGIBody::test_encode_multipart_value_type_options tests/test_request.py::TestFakeCGIBody::test_encode_multipart_no_boundary tests/test_request.py::TestFakeCGIBody::test_repr tests/test_request.py::TestFakeCGIBody::test_fileno tests/test_request.py::TestFakeCGIBody::test_iter tests/test_request.py::TestFakeCGIBody::test_readline tests/test_request.py::TestFakeCGIBody::test_read_bad_content_type tests/test_request.py::TestFakeCGIBody::test_read_urlencoded tests/test_request.py::TestFakeCGIBody::test_readable tests/test_request.py::Test_cgi_FieldStorage__repr__patch::test_with_file tests/test_request.py::Test_cgi_FieldStorage__repr__patch::test_without_file tests/test_request.py::TestLimitedLengthFile::test_fileno tests/test_request.py::Test_environ_from_url::test_environ_from_url tests/test_request.py::Test_environ_from_url::test_environ_from_url_highorder_path_info tests/test_request.py::Test_environ_from_url::test_fileupload_mime_type_detection tests/test_request.py::TestRequestMultipart::test_multipart_with_charset tests/test_response.py::test_response tests/test_response.py::test_set_response_status_binary tests/test_response.py::test_set_response_status_str_no_reason tests/test_response.py::test_set_response_status_str_generic_reason tests/test_response.py::test_set_response_status_code tests/test_response.py::test_set_response_status_bad tests/test_response.py::test_set_response_status_code_generic_reason tests/test_response.py::test_content_type tests/test_response.py::test_init_content_type_w_charset tests/test_response.py::test_init_adds_default_charset_when_not_json tests/test_response.py::test_init_no_charset_when_json tests/test_response.py::test_init_keeps_specified_charset_when_json tests/test_response.py::test_init_doesnt_add_default_content_type_with_bodyless_status tests/test_response.py::test_cookies tests/test_response.py::test_unicode_cookies_error_raised tests/test_response.py::test_unicode_cookies_warning_issued tests/test_response.py::test_cookies_warning_issued_backwards_compat tests/test_response.py::test_cookies_raises_typeerror tests/test_response.py::test_http_only_cookie tests/test_response.py::test_headers tests/test_response.py::test_response_copy tests/test_response.py::test_response_copy_content_md5 tests/test_response.py::test_HEAD_closes tests/test_response.py::test_HEAD_conditional_response_returns_empty_response tests/test_response.py::test_HEAD_conditional_response_range_empty_response tests/test_response.py::test_conditional_response_if_none_match_false tests/test_response.py::test_conditional_response_if_none_match_true tests/test_response.py::test_conditional_response_if_none_match_weak tests/test_response.py::test_conditional_response_if_modified_since_false tests/test_response.py::test_conditional_response_if_modified_since_true tests/test_response.py::test_conditional_response_range_not_satisfiable_response tests/test_response.py::test_HEAD_conditional_response_range_not_satisfiable_response tests/test_response.py::test_md5_etag tests/test_response.py::test_md5_etag_set_content_md5 tests/test_response.py::test_decode_content_defaults_to_identity tests/test_response.py::test_decode_content_with_deflate tests/test_response.py::test_content_length tests/test_response.py::test_app_iter_range tests/test_response.py::test_app_iter_range_inner_method tests/test_response.py::test_has_body tests/test_response.py::test_str_crlf tests/test_response.py::test_from_file tests/test_response.py::test_from_file2 tests/test_response.py::test_from_text_file tests/test_response.py::test_from_file_w_leading_space_in_header tests/test_response.py::test_file_bad_header tests/test_response.py::test_from_file_not_unicode_headers tests/test_response.py::test_file_with_http_version tests/test_response.py::test_file_with_http_version_more_status tests/test_response.py::test_set_status tests/test_response.py::test_set_headerlist tests/test_response.py::test_request_uri_no_script_name tests/test_response.py::test_request_uri_https tests/test_response.py::test_app_iter_range_starts_after_iter_end tests/test_response.py::test_resp_write_app_iter_non_list tests/test_response.py::test_response_file_body_writelines tests/test_response.py::test_response_file_body_tell_text tests/test_response.py::test_response_write_non_str tests/test_response.py::test_response_file_body_write_empty_app_iter tests/test_response.py::test_response_file_body_write_empty_body tests/test_response.py::test_response_file_body_close_not_implemented tests/test_response.py::test_response_file_body_repr tests/test_response.py::test_body_get_is_none tests/test_response.py::test_body_get_is_unicode_notverylong tests/test_response.py::test_body_get_is_unicode tests/test_response.py::test_body_set_not_unicode_or_str tests/test_response.py::test_body_set_unicode tests/test_response.py::test_body_set_under_body_doesnt_exist tests/test_response.py::test_body_del tests/test_response.py::test_text_get_no_charset tests/test_response.py::test_text_get_no_default_body_encoding tests/test_response.py::test_unicode_body tests/test_response.py::test_text_get_decode tests/test_response.py::test_text_set_no_charset tests/test_response.py::test_text_set_no_default_body_encoding tests/test_response.py::test_text_set_not_unicode tests/test_response.py::test_text_del tests/test_response.py::test_body_file_del tests/test_response.py::test_write_unicode tests/test_response.py::test_write_unicode_no_charset tests/test_response.py::test_write_text tests/test_response.py::test_app_iter_del tests/test_response.py::test_charset_set_no_content_type_header tests/test_response.py::test_charset_del_no_content_type_header tests/test_response.py::test_content_type_params_get_no_semicolon_in_content_type_header tests/test_response.py::test_content_type_params_get_semicolon_in_content_type_header tests/test_response.py::test_content_type_params_set_value_dict_empty tests/test_response.py::test_content_type_params_set_ok_param_quoting tests/test_response.py::test_charset_delete tests/test_response.py::test_set_cookie_overwrite tests/test_response.py::test_set_cookie_value_is_None tests/test_response.py::test_set_cookie_expires_is_None_and_max_age_is_int tests/test_response.py::test_set_cookie_expires_is_None_and_max_age_is_timedelta tests/test_response.py::test_set_cookie_expires_is_not_None_and_max_age_is_None tests/test_response.py::test_set_cookie_expires_is_timedelta_and_max_age_is_None tests/test_response.py::test_delete_cookie tests/test_response.py::test_delete_cookie_with_path tests/test_response.py::test_delete_cookie_with_domain tests/test_response.py::test_unset_cookie_not_existing_and_not_strict tests/test_response.py::test_unset_cookie_not_existing_and_strict tests/test_response.py::test_unset_cookie_key_in_cookies tests/test_response.py::test_merge_cookies_no_set_cookie tests/test_response.py::test_merge_cookies_resp_is_Response tests/test_response.py::test_merge_cookies_resp_is_wsgi_callable tests/test_response.py::test_body_get_body_is_None_len_app_iter_is_zero tests/test_response.py::test_cache_control_get tests/test_response.py::test_location tests/test_response.py::test_request_uri_http tests/test_response.py::test_request_uri_no_script_name2 tests/test_response.py::test_cache_control_object_max_age_ten tests/test_response.py::test_cache_control_set_object_error tests/test_response.py::test_cache_expires_set tests/test_response.py::test_status_code_set tests/test_response.py::test_cache_control_set_dict tests/test_response.py::test_cache_control_set_None tests/test_response.py::test_cache_control_set_unicode tests/test_response.py::test_cache_control_set_control_obj_is_not_None tests/test_response.py::test_cache_control_del tests/test_response.py::test_body_file_get tests/test_response.py::test_body_file_write_no_charset tests/test_response.py::test_body_file_write_unicode_encodes tests/test_response.py::test_repr tests/test_response.py::test_cache_expires_set_timedelta tests/test_response.py::test_cache_expires_set_int tests/test_response.py::test_cache_expires_set_None tests/test_response.py::test_cache_expires_set_zero tests/test_response.py::test_encode_content_unknown tests/test_response.py::test_encode_content_identity tests/test_response.py::test_encode_content_gzip_already_gzipped tests/test_response.py::test_encode_content_gzip_notyet_gzipped tests/test_response.py::test_encode_content_gzip_notyet_gzipped_lazy tests/test_response.py::test_encode_content_gzip_buffer_coverage tests/test_response.py::test_decode_content_identity tests/test_response.py::test_decode_content_weird tests/test_response.py::test_decode_content_gzip tests/test_response.py::test_response_set_body_file1 tests/test_response.py::test_response_set_body_file2 tests/test_response.py::test_response_json_body tests/test_response.py::test_cache_expires_set_zero_then_nonzero tests/test_response.py::test_default_content_type tests/test_response.py::test_default_charset tests/test_response.py::test_header_list_no_defaults tests/test_response.py::test_explicit_charset tests/test_response.py::test_set_content_type tests/test_response.py::test_raises_no_charset tests/test_response.py::test_raises_none_charset tests/test_response.py::test_content_type_has_charset
webob/response.py webob/headers.py webob/descriptors.py
webob/response.py webob/headers.py webob/descriptors.py