bertjwregeer: Would you be so kind as to add some extra tests that would add coverage for the changes, that would be fantastic.
diff --git a/webob/acceptparse.py b/webob/acceptparse.py
index 42f2643..afa0d8f 100644
--- a/webob/acceptparse.py
+++ b/webob/acceptparse.py
@@ -274,7 +274,7 @@ class MIMEAccept(Accept):
     def parse(value):
         for mask, q in Accept.parse(value):
             try:
-                mask_major, mask_minor = map(lambda x: x.lower(), mask.split('/'))
+                mask_major, mask_minor = [x.lower() for x in mask.split('/')]
             except ValueError:
                 continue
             if mask_major == '*' and mask_minor != '*':
@@ -296,20 +296,62 @@ class MIMEAccept(Accept):
 
     accepts_html = property(accept_html) # note the plural
 
+
     def _match(self, mask, offer):
         """
             Check if the offer is covered by the mask
+
+            ``offer`` may contain wildcards to facilitate checking if a
+            ``mask`` would match a 'permissive' offer.
+
+            Wildcard matching forces the match to take place against the
+            type or subtype of the mask and offer (depending on where
+            the wildcard matches)
         """
-        _check_offer(offer)
-        if '*' not in mask:
-            return offer.lower() == mask.lower()
-        elif mask == '*/*':
+        # Match if comparisons are the same or either is a complete wildcard
+        if (mask.lower() == offer.lower() or
+                '*/*' in (mask, offer) or
+                '*' == offer):
             return True
-        else:
-            assert mask.endswith('/*')
-            mask_major = mask[:-2].lower()
-            offer_major = offer.split('/', 1)[0].lower()
-            return offer_major == mask_major
+
+        # Set mask type with wildcard subtype for malformed masks
+        try:
+            mask_type, mask_subtype = [x.lower() for x in mask.split('/')]
+        except ValueError:
+            mask_type = mask
+            mask_subtype = '*'
+
+        # Set offer type with wildcard subtype for malformed offers
+        try:
+            offer_type, offer_subtype = [x.lower() for x in offer.split('/')]
+        except ValueError:
+            offer_type = offer
+            offer_subtype = '*'
+
+        if mask_subtype == '*':
+            # match on type only
+            if offer_type == '*':
+                return True
+            else:
+                return mask_type.lower() == offer_type.lower()
+
+        if mask_type == '*':
+            # match on subtype only
+            if offer_subtype == '*':
+                return True
+            else:
+                return mask_subtype.lower() == offer_subtype.lower()
+
+        if offer_subtype == '*':
+            # match on type only
+            return mask_type.lower() == offer_type.lower()
+
+        if offer_type == '*':
+            # match on subtype only
+            return mask_subtype.lower() == offer_subtype.lower()
+
+        return offer.lower() == mask.lower()
+
 
 
 class MIMENilAccept(NilAccept):

Accept matching against wildcard offers is not allowed
Wildcards cannot be used in 'offered' content types to search for a match:

```python
>>> from webob.acceptparse import MIMEAccept
>>> accept = MIMEAccept('text/*')

>>> 'text/plain' in accept
True

# Expect this to be True
>>> 'text/*' in accept
ValueError: The application should offer specific types, got 'text/*'

>>> accept.best_match(['text/html', 'text/plain', 'text/json'])
'text/html'

# Expect 'text/html' or 'text/plain' in the absence of quality parameter
>>> accept.best_match(['text/*', 'text/html', 'text/plain'])
ValueError: The application should offer specific types, got 'text/*'

# Expect 'text/*' as the best match
>>> accept.best_match(['text/*', 'foo/bar'])
ValueError: The application should offer specific types, got 'text/*'
```

The behavior and error WebOb provides is explicit and it uses the same [check](https://github.com/Pylons/webob/blob/1.4/webob/acceptparse.py#L320) anywhere it is performing a match:

```python
def _check_offer(offer):
    if '*' in offer:
        raise ValueError("The application should offer specific types, got %r" % offer)
```

This is not insensible, but it does cause an issue with Pyramid's [documented](http://docs.pylonsproject.org/projects/pyramid/en/latest/api/config.html) accept predicate handling: https://github.com/Pylons/pyramid/issues/1407

If you want to define a 'permissive' accept predicate like `text/*`, the Pyramid `AcceptPredicate` essentially boils down to:

```python
return 'text/*' in request.accept
```

`request.accept` is a WebOb `MIMEAccept` instance, so this check will always fail.
diff --git a/tests/test_acceptparse.py b/tests/test_acceptparse.py
index 9183e95..a5e8c15 100644
--- a/tests/test_acceptparse.py
+++ b/tests/test_acceptparse.py
@@ -271,7 +271,69 @@ def test_match():
     assert mimeaccept._match('image/*', 'image/jpg')
     assert mimeaccept._match('*/*', 'image/jpg')
     assert not mimeaccept._match('text/html', 'image/jpg')
-    assert_raises(ValueError, mimeaccept._match, 'image/jpg', '*/*')
+
+    mismatches = [
+        ('B/b', 'A/a'),
+        ('B/b', 'B/a'),
+        ('B/b', 'A/b'),
+        ('A/a', 'B/b'),
+        ('B/a', 'B/b'),
+        ('A/b', 'B/b')
+    ]
+    for mask, offer in mismatches:
+        assert not mimeaccept._match(mask, offer)
+
+
+def test_wildcard_matching():
+    """
+    Wildcard matching forces the match to take place against the type
+    or subtype of the mask and offer (depending on where the wildcard
+    matches)
+    """
+    mimeaccept = MIMEAccept('type/subtype')
+    matches = [
+        ('*/*', '*/*'),
+        ('*/*', 'A/*'),
+        ('*/*', '*/a'),
+        ('*/*', 'A/a'),
+        ('A/*', '*/*'),
+        ('A/*', 'A/*'),
+        ('A/*', '*/a'),
+        ('A/*', 'A/a'),
+        ('*/a', '*/*'),
+        ('*/a', 'A/*'),
+        ('*/a', '*/a'),
+        ('*/a', 'A/a'),
+        ('A/a', '*/*'),
+        ('A/a', 'A/*'),
+        ('A/a', '*/a'),
+        ('A/a', 'A/a'),
+        # Offers might not contain a subtype
+        ('*/*', '*'),
+        ('A/*', '*'),
+        ('*/a', '*')]
+    for mask, offer in matches:
+        assert mimeaccept._match(mask, offer)
+        # Test malformed mask and offer variants where either is missing
+        # a type or subtype
+        assert mimeaccept._match('A', offer)
+        assert mimeaccept._match(mask, 'a')
+
+    mismatches = [
+        ('B/b', 'A/*'),
+        ('B/*', 'A/a'),
+        ('B/*', 'A/*'),
+        ('*/b', '*/a')]
+    for mask, offer in mismatches:
+        assert not mimeaccept._match(mask, offer)
+
+def test_mimeaccept_contains():
+    mimeaccept = MIMEAccept('A/a, B/b, C/c')
+    assert 'A/a' in mimeaccept
+    assert 'A/*' in mimeaccept
+    assert '*/a' in mimeaccept
+    assert not 'A/b' in mimeaccept
+    assert not 'B/a' in mimeaccept
 
 def test_accept_json():
     mimeaccept = MIMEAccept('text/html, *; q=.2, */*; q=.2')
diff --git a/tests/test_request.py b/tests/test_request.py
index 24c7aa0..0e0ec9b 100644
--- a/tests/test_request.py
+++ b/tests/test_request.py
@@ -2444,7 +2444,6 @@ class TestRequest_functional(unittest.TestCase):
         self.assertTrue(not self._blankOne('/', headers={'Accept': ''}).accept)
         req = self._blankOne('/', headers={'Accept':'text/plain'})
         self.assertTrue(req.accept)
-        self.assertRaises(ValueError, req.accept.best_match, ['*/*'])
         req = self._blankOne('/', accept=['*/*','text/*'])
         self.assertEqual(
             req.accept.best_match(['application/x-foo', 'text/plain']),

pip install -e .[testing]
parse_log_pytest
requirements.txt
pytest pytest-cov pytest
3.9
requirements/base.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
coverage==7.8.0
exceptiongroup==1.2.2
iniconfig==2.1.0
nose==1.3.7
packaging==24.2
pluggy==1.5.0
pytest==8.3.5
pytest-cov==6.0.0
tomli==2.2.1
-e git+https://github.com/Pylons/webob.git@ef371de5e78093efc82eb66117cbacca852c9afa#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
  - 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
  - pip=25.0=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
  - 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
      - exceptiongroup==1.2.2
      - iniconfig==2.1.0
      - nose==1.3.7
      - packaging==24.2
      - pluggy==1.5.0
      - pytest==8.3.5
      - pytest-cov==6.0.0
      - tomli==2.2.1
prefix: /opt/conda/envs/webob

tests/test_acceptparse.py::test_wildcard_matching tests/test_acceptparse.py::test_mimeaccept_contains
tests/test_acceptparse.py::test_parse_accept_badq tests/test_acceptparse.py::test_init_accept_content_type tests/test_acceptparse.py::test_init_accept_accept_charset tests/test_acceptparse.py::test_init_accept_accept_charset_mixedcase tests/test_acceptparse.py::test_init_accept_accept_charset_with_iso_8859_1 tests/test_acceptparse.py::test_init_accept_accept_charset_wildcard tests/test_acceptparse.py::test_init_accept_accept_language tests/test_acceptparse.py::test_init_accept_invalid_value tests/test_acceptparse.py::test_init_accept_invalid_q_value tests/test_acceptparse.py::test_accept_repr tests/test_acceptparse.py::test_accept_str tests/test_acceptparse.py::test_zero_quality tests/test_acceptparse.py::test_accept_str_with_q_not_1 tests/test_acceptparse.py::test_accept_str_with_q_not_1_multiple tests/test_acceptparse.py::test_accept_add_other_accept tests/test_acceptparse.py::test_accept_add_other_list_of_tuples tests/test_acceptparse.py::test_accept_add_other_dict tests/test_acceptparse.py::test_accept_add_other_empty_str tests/test_acceptparse.py::test_accept_with_no_value_add_other_str tests/test_acceptparse.py::test_contains tests/test_acceptparse.py::test_contains_not tests/test_acceptparse.py::test_quality tests/test_acceptparse.py::test_quality_not_found tests/test_acceptparse.py::test_best_match tests/test_acceptparse.py::test_best_match_with_one_lower_q tests/test_acceptparse.py::test_best_match_with_complex_q tests/test_acceptparse.py::test_accept_match tests/test_acceptparse.py::test_accept_match_lang tests/test_acceptparse.py::test_nil tests/test_acceptparse.py::test_nil_add tests/test_acceptparse.py::test_nil_radd tests/test_acceptparse.py::test_nil_radd_masterclass tests/test_acceptparse.py::test_nil_contains tests/test_acceptparse.py::test_nil_best_match tests/test_acceptparse.py::test_noaccept_contains tests/test_acceptparse.py::test_mime_init tests/test_acceptparse.py::test_accept_html tests/test_acceptparse.py::test_match tests/test_acceptparse.py::test_accept_json tests/test_acceptparse.py::test_accept_mixedcase tests/test_acceptparse.py::test_match_mixedcase tests/test_acceptparse.py::test_match_uppercase_q tests/test_acceptparse.py::test_accept_property_fget tests/test_acceptparse.py::test_accept_property_fget_nil tests/test_acceptparse.py::test_accept_property_fset tests/test_acceptparse.py::test_accept_property_fset_acceptclass tests/test_acceptparse.py::test_accept_property_fdel 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_POST_existing_cache_hit tests/test_request.py::TestRequestCommon::test_POST_missing_content_type tests/test_request.py::TestRequestCommon::test_POST_multipart tests/test_request.py::TestRequestCommon::test_POST_not_POST_or_PUT tests/test_request.py::TestRequestCommon::test_PUT_bad_content_type tests/test_request.py::TestRequestCommon::test_PUT_missing_content_type 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_as_bytes_skip_body tests/test_request.py::TestRequestCommon::test_as_string_deprecated tests/test_request.py::TestRequestCommon::test_blank__ctype_as_kw 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__method_subtitution tests/test_request.py::TestRequestCommon::test_blank__post_file_w_wrong_ctype tests/test_request.py::TestRequestCommon::test_blank__post_files tests/test_request.py::TestRequestCommon::test_blank__post_multipart tests/test_request.py::TestRequestCommon::test_blank__post_urlencoded tests/test_request.py::TestRequestCommon::test_blank__str_post_data_for_unsupported_ctype tests/test_request.py::TestRequestCommon::test_body_deleter_None tests/test_request.py::TestRequestCommon::test_body_file_deleter tests/test_request.py::TestRequestCommon::test_body_file_getter tests/test_request.py::TestRequestCommon::test_body_file_getter_cache tests/test_request.py::TestRequestCommon::test_body_file_getter_seekable tests/test_request.py::TestRequestCommon::test_body_file_getter_unreadable tests/test_request.py::TestRequestCommon::test_body_file_raw tests/test_request.py::TestRequestCommon::test_body_file_seekable_input_is_seekable tests/test_request.py::TestRequestCommon::test_body_file_seekable_input_not_seekable tests/test_request.py::TestRequestCommon::test_body_file_setter_non_bytes tests/test_request.py::TestRequestCommon::test_body_file_setter_w_bytes 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_cache_control_gets_cached tests/test_request.py::TestRequestCommon::test_cache_control_reflects_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_updates_environ tests/test_request.py::TestRequestCommon::test_call_application_calls_application tests/test_request.py::TestRequestCommon::test_call_application_closes_iterable_when_mixed_w_write_calls tests/test_request.py::TestRequestCommon::test_call_application_provides_write 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_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_cookies_wo_webob_parsed_cookies tests/test_request.py::TestRequestCommon::test_copy_get tests/test_request.py::TestRequestCommon::test_ctor_environ_getter_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_ctor_wo_environ_raises_WTF tests/test_request.py::TestRequestCommon::test_from_bytes_extra_data tests/test_request.py::TestRequestCommon::test_from_string_deprecated tests/test_request.py::TestRequestCommon::test_is_body_readable_GET tests/test_request.py::TestRequestCommon::test_is_body_readable_PATCH tests/test_request.py::TestRequestCommon::test_is_body_readable_POST tests/test_request.py::TestRequestCommon::test_is_body_readable_special_flag tests/test_request.py::TestRequestCommon::test_is_body_readable_unknown_method_and_content_length tests/test_request.py::TestRequestCommon::test_json_body tests/test_request.py::TestRequestCommon::test_json_body_array 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_scheme tests/test_request.py::TestRequestCommon::test_set_cookies tests/test_request.py::TestRequestCommon::test_text_body 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_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_urlvars_deleter_w_paste_key tests/test_request.py::TestRequestCommon::test_urlvars_deleter_w_wsgiorg_key_empty_tuple tests/test_request.py::TestRequestCommon::test_urlvars_deleter_w_wsgiorg_key_non_empty_tuple tests/test_request.py::TestRequestCommon::test_urlvars_deleter_wo_keys 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::TestBaseRequest::test_application_url 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_client_addr_prefers_xff tests/test_request.py::TestBaseRequest::test_client_addr_xff_multival tests/test_request.py::TestBaseRequest::test_client_addr_xff_singleval 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_content_type_deleter_clears_environ_value tests/test_request.py::TestBaseRequest::test_content_type_deleter_no_environ_value 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_existing_paramter_no_new_paramter tests/test_request.py::TestBaseRequest::test_content_type_setter_w_None tests/test_request.py::TestBaseRequest::test_domain_nocolon tests/test_request.py::TestBaseRequest::test_domain_withcolon tests/test_request.py::TestBaseRequest::test_encget_doesnt_raises_with_default tests/test_request.py::TestBaseRequest::test_encget_no_encattr tests/test_request.py::TestBaseRequest::test_encget_raises_without_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_header_getter tests/test_request.py::TestBaseRequest::test_headers_getter tests/test_request.py::TestBaseRequest::test_headers_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_host_get tests/test_request.py::TestBaseRequest::test_host_get_w_no_http_host 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_port_w_http_host_and_no_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_and_standard_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_oddball_port tests/test_request.py::TestBaseRequest::test_host_port_w_http_host_https_and_standard_port tests/test_request.py::TestBaseRequest::test_host_port_wo_http_host tests/test_request.py::TestBaseRequest::test_host_setter 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_oddball_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_https_and_no_port tests/test_request.py::TestBaseRequest::test_host_url_w_http_host_https_and_oddball_port tests/test_request.py::TestBaseRequest::test_host_url_w_http_host_https_and_standard_port tests/test_request.py::TestBaseRequest::test_host_url_wo_http_host tests/test_request.py::TestBaseRequest::test_http_version tests/test_request.py::TestBaseRequest::test_is_xhr_header_hit tests/test_request.py::TestBaseRequest::test_is_xhr_header_miss tests/test_request.py::TestBaseRequest::test_is_xhr_no_header tests/test_request.py::TestBaseRequest::test_json_body tests/test_request.py::TestBaseRequest::test_method tests/test_request.py::TestBaseRequest::test_no_headers_deleter tests/test_request.py::TestBaseRequest::test_path tests/test_request.py::TestBaseRequest::test_path_info 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_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_hit tests/test_request.py::TestBaseRequest::test_path_info_pop_non_empty_w_pattern_miss tests/test_request.py::TestBaseRequest::test_path_info_pop_skips_empty_elements 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_path_url tests/test_request.py::TestBaseRequest::test_query_string tests/test_request.py::TestBaseRequest::test_relative_url 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_relative_url_to_app_true_w_leading_slash tests/test_request.py::TestBaseRequest::test_relative_url_to_app_true_wo_leading_slash tests/test_request.py::TestBaseRequest::test_remote_addr tests/test_request.py::TestBaseRequest::test_remote_user tests/test_request.py::TestBaseRequest::test_script_name 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_upath_info tests/test_request.py::TestBaseRequest::test_upath_info_set_unicode tests/test_request.py::TestBaseRequest::test_url_no_qs tests/test_request.py::TestBaseRequest::test_url_w_qs tests/test_request.py::TestBaseRequest::test_uscript_name tests/test_request.py::TestLegacyRequest::test_application_url 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_client_addr_prefers_xff tests/test_request.py::TestLegacyRequest::test_client_addr_xff_multival tests/test_request.py::TestLegacyRequest::test_client_addr_xff_singleval 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_content_type_deleter_clears_environ_value tests/test_request.py::TestLegacyRequest::test_content_type_deleter_no_environ_value 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_existing_paramter_no_new_paramter tests/test_request.py::TestLegacyRequest::test_content_type_setter_w_None tests/test_request.py::TestLegacyRequest::test_encget_doesnt_raises_with_default tests/test_request.py::TestLegacyRequest::test_encget_no_encattr tests/test_request.py::TestLegacyRequest::test_encget_raises_without_default tests/test_request.py::TestLegacyRequest::test_encget_with_encattr tests/test_request.py::TestLegacyRequest::test_header_getter tests/test_request.py::TestLegacyRequest::test_headers_getter tests/test_request.py::TestLegacyRequest::test_headers_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_host_get_w_http_host tests/test_request.py::TestLegacyRequest::test_host_get_w_no_http_host 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_port_w_http_host_and_no_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_and_standard_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_oddball_port tests/test_request.py::TestLegacyRequest::test_host_port_w_http_host_https_and_standard_port tests/test_request.py::TestLegacyRequest::test_host_port_wo_http_host tests/test_request.py::TestLegacyRequest::test_host_setter 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_oddball_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_https_and_no_port tests/test_request.py::TestLegacyRequest::test_host_url_w_http_host_https_and_oddball_port tests/test_request.py::TestLegacyRequest::test_host_url_w_http_host_https_and_standard_port tests/test_request.py::TestLegacyRequest::test_host_url_wo_http_host tests/test_request.py::TestLegacyRequest::test_http_version tests/test_request.py::TestLegacyRequest::test_is_xhr_header_hit tests/test_request.py::TestLegacyRequest::test_is_xhr_header_miss tests/test_request.py::TestLegacyRequest::test_is_xhr_no_header tests/test_request.py::TestLegacyRequest::test_json_body tests/test_request.py::TestLegacyRequest::test_method tests/test_request.py::TestLegacyRequest::test_no_headers_deleter tests/test_request.py::TestLegacyRequest::test_path tests/test_request.py::TestLegacyRequest::test_path_info 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_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_hit tests/test_request.py::TestLegacyRequest::test_path_info_pop_non_empty_w_pattern_miss tests/test_request.py::TestLegacyRequest::test_path_info_pop_skips_empty_elements 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_path_url tests/test_request.py::TestLegacyRequest::test_query_string tests/test_request.py::TestLegacyRequest::test_relative_url 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_relative_url_to_app_true_w_leading_slash tests/test_request.py::TestLegacyRequest::test_relative_url_to_app_true_wo_leading_slash tests/test_request.py::TestLegacyRequest::test_remote_addr tests/test_request.py::TestLegacyRequest::test_remote_user tests/test_request.py::TestLegacyRequest::test_script_name 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_upath_info tests/test_request.py::TestLegacyRequest::test_upath_info_set_unicode tests/test_request.py::TestLegacyRequest::test_url_no_qs tests/test_request.py::TestLegacyRequest::test_url_w_qs tests/test_request.py::TestLegacyRequest::test_uscript_name tests/test_request.py::TestRequestConstructorWarnings::test_ctor_w_decode_param_names tests/test_request.py::TestRequestConstructorWarnings::test_ctor_w_unicode_errors tests/test_request.py::TestRequestWithAdhocAttr::test_adhoc_attrs_del tests/test_request.py::TestRequestWithAdhocAttr::test_adhoc_attrs_del_missing 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_set tests/test_request.py::TestRequestWithAdhocAttr::test_adhoc_attrs_set_nonadhoc tests/test_request.py::TestRequest_functional::test_accept_best_match 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_authorization tests/test_request.py::TestRequest_functional::test_bad_cookie tests/test_request.py::TestRequest_functional::test_blank tests/test_request.py::TestRequest_functional::test_body_file_noseek tests/test_request.py::TestRequest_functional::test_body_file_seekable tests/test_request.py::TestRequest_functional::test_body_property tests/test_request.py::TestRequest_functional::test_broken_clen_header tests/test_request.py::TestRequest_functional::test_broken_seek tests/test_request.py::TestRequest_functional::test_call_WSGI_app 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_conttype_set_del tests/test_request.py::TestRequest_functional::test_cookie_quoting tests/test_request.py::TestRequest_functional::test_copy_body tests/test_request.py::TestRequest_functional::test_env_keys tests/test_request.py::TestRequest_functional::test_from_bytes tests/test_request.py::TestRequest_functional::test_from_garbage_file tests/test_request.py::TestRequest_functional::test_from_mimeparse tests/test_request.py::TestRequest_functional::test_from_text tests/test_request.py::TestRequest_functional::test_get_response_catch_exc_info_true 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_headers tests/test_request.py::TestRequest_functional::test_headers2 tests/test_request.py::TestRequest_functional::test_host_property tests/test_request.py::TestRequest_functional::test_host_url 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_middleware_body 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_nonstr_keys tests/test_request.py::TestRequest_functional::test_params tests/test_request.py::TestRequest_functional::test_path_info_p tests/test_request.py::TestRequest_functional::test_path_quoting tests/test_request.py::TestRequest_functional::test_post_does_not_reparse tests/test_request.py::TestRequest_functional::test_repr_invalid tests/test_request.py::TestRequest_functional::test_repr_nodefault tests/test_request.py::TestRequest_functional::test_req_kw_none_val tests/test_request.py::TestRequest_functional::test_request_init tests/test_request.py::TestRequest_functional::test_request_noenviron_param tests/test_request.py::TestRequest_functional::test_request_patch tests/test_request.py::TestRequest_functional::test_request_put tests/test_request.py::TestRequest_functional::test_request_query_and_POST_vars tests/test_request.py::TestRequest_functional::test_set_body tests/test_request.py::TestRequest_functional::test_unexpected_kw tests/test_request.py::TestRequest_functional::test_urlargs_property tests/test_request.py::TestRequest_functional::test_urlvars_property tests/test_request.py::FakeCGIBodyTests::test_encode_multipart_no_boundary tests/test_request.py::FakeCGIBodyTests::test_encode_multipart_value_type_options tests/test_request.py::FakeCGIBodyTests::test_fileno tests/test_request.py::FakeCGIBodyTests::test_iter tests/test_request.py::FakeCGIBodyTests::test_read_bad_content_type tests/test_request.py::FakeCGIBodyTests::test_read_urlencoded tests/test_request.py::FakeCGIBodyTests::test_readline tests/test_request.py::FakeCGIBodyTests::test_repr 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
webob/acceptparse.py
webob/acceptparse.py