codecov[bot]: # [Codecov](https://codecov.io/gh/scrapy/scrapy/pull/4008?src=pr&el=h1) Report
> Merging [#4008](https://codecov.io/gh/scrapy/scrapy/pull/4008?src=pr&el=desc) into [master](https://codecov.io/gh/scrapy/scrapy/commit/6ad5a89cb0aeac18a72ed41819c07e9c22990f10?src=pr&el=desc) will **decrease** coverage by `0.24%`.
> The diff coverage is `n/a`.


```diff
@@            Coverage Diff             @@
##           master    #4008      +/-   ##
==========================================
- Coverage   85.68%   85.43%   -0.25%     
==========================================
  Files         165      167       +2     
  Lines        9734     9732       -2     
  Branches     1463     1456       -7     
==========================================
- Hits         8341     8315      -26     
- Misses       1136     1159      +23     
- Partials      257      258       +1
```

| [Impacted Files](https://codecov.io/gh/scrapy/scrapy/pull/4008?src=pr&el=tree) | Coverage Δ | |
|---|---|---|
| [scrapy/extensions/corestats.py](https://codecov.io/gh/scrapy/scrapy/pull/4008/diff?src=pr&el=tree#diff-c2NyYXB5L2V4dGVuc2lvbnMvY29yZXN0YXRzLnB5) | `90% <0%> (-10%)` | :arrow_down: |
| [scrapy/core/scraper.py](https://codecov.io/gh/scrapy/scrapy/pull/4008/diff?src=pr&el=tree#diff-c2NyYXB5L2NvcmUvc2NyYXBlci5weQ==) | `86.48% <0%> (-2.85%)` | :arrow_down: |
| [scrapy/commands/runspider.py](https://codecov.io/gh/scrapy/scrapy/pull/4008/diff?src=pr&el=tree#diff-c2NyYXB5L2NvbW1hbmRzL3J1bnNwaWRlci5weQ==) | `74.28% <0%> (-1.08%)` | :arrow_down: |
| [scrapy/pipelines/files.py](https://codecov.io/gh/scrapy/scrapy/pull/4008/diff?src=pr&el=tree#diff-c2NyYXB5L3BpcGVsaW5lcy9maWxlcy5weQ==) | `65.38% <0%> (-0.79%)` | :arrow_down: |
| [scrapy/spiders/crawl.py](https://codecov.io/gh/scrapy/scrapy/pull/4008/diff?src=pr&el=tree#diff-c2NyYXB5L3NwaWRlcnMvY3Jhd2wucHk=) | `81.7% <0%> (-0.44%)` | :arrow_down: |
| [scrapy/item.py](https://codecov.io/gh/scrapy/scrapy/pull/4008/diff?src=pr&el=tree#diff-c2NyYXB5L2l0ZW0ucHk=) | `98.55% <0%> (-0.12%)` | :arrow_down: |
| [scrapy/core/engine.py](https://codecov.io/gh/scrapy/scrapy/pull/4008/diff?src=pr&el=tree#diff-c2NyYXB5L2NvcmUvZW5naW5lLnB5) | `92.76% <0%> (-0.04%)` | :arrow_down: |
| [scrapy/logformatter.py](https://codecov.io/gh/scrapy/scrapy/pull/4008/diff?src=pr&el=tree#diff-c2NyYXB5L2xvZ2Zvcm1hdHRlci5weQ==) | `90.47% <0%> (ø)` | :arrow_up: |
| [scrapy/xlib/pydispatch.py](https://codecov.io/gh/scrapy/scrapy/pull/4008/diff?src=pr&el=tree#diff-c2NyYXB5L3hsaWIvcHlkaXNwYXRjaC5weQ==) | `0% <0%> (ø)` | |
| [scrapy/xlib/tx.py](https://codecov.io/gh/scrapy/scrapy/pull/4008/diff?src=pr&el=tree#diff-c2NyYXB5L3hsaWIvdHgucHk=) | `0% <0%> (ø)` | |
| ... and [1 more](https://codecov.io/gh/scrapy/scrapy/pull/4008/diff?src=pr&el=tree-more) | |

elacuesta: Tests are green without the restriction (the one failure is because of #4014, it can be ignored IMHO).
@pablohoffman since you authored the commit that introduced the assertion, do you have any objections to remove it?
pablohoffman: no objections @elacuesta!
Gallaecio: > Tests are green without the restriction

Unless we already have it, though, this might be a great opportunity to add a test for this, that specifically verifies that a callback can be omitted even if an errback is provided.
diff --git a/scrapy/http/request/__init__.py b/scrapy/http/request/__init__.py
index 76a428199..61c0a4c9e 100644
--- a/scrapy/http/request/__init__.py
+++ b/scrapy/http/request/__init__.py
@@ -32,7 +32,6 @@ class Request(object_ref):
             raise TypeError('callback must be a callable, got %s' % type(callback).__name__)
         if errback is not None and not callable(errback):
             raise TypeError('errback must be a callable, got %s' % type(errback).__name__)
-        assert callback or not errback, "Cannot use errback without a callback"
         self.callback = callback
         self.errback = errback
 

Request doesn't set callback to self.parse automatically when errback is set
Hi, I'm facing an `AssertionError` when set `errback`  and not `callback` in `Request`, is that expected? :

```
...
    def start_requests(self):
        yield Request(
            self.start_url,
            # callback=self.parse,
            errback=self.parse_error,
            meta={
                'dont_redirect': True,
            },
        )
...
```
trigger this : 
```
2019-01-16 15:47:22 [scrapy.core.engine] ERROR: Error while obtaining start requests
Traceback (most recent call last):
  File "/home/joaquin/Repos/example/env/lib/python3.6/site-packages/scrapy/core/engine.py", line 127, in _next_request
    request = next(slot.start_requests)
  File "/home/joaquin/Repos/example/example/spiders/br/rj/example.py", line 128, in start_requests
    'dont_redirect': True,
  File "/home/joaquin/Repos/example/env/lib/python3.6/site-packages/scrapy/http/request/__init__.py", line 34, in __init__
    assert callback or not errback, "Cannot use errback without a callback"
AssertionError: Cannot use errback without a callback
2019-01-16 15:47:22 [scrapy.core.engine] INFO: Closing spider (finished)
2019-01-16 15:47:22 [scrapy.core.engine] INFO: Spider closed (finished)
```
diff --git a/tests/test_http_request.py b/tests/test_http_request.py
index 9df6ff67b..3449c7a40 100644
--- a/tests/test_http_request.py
+++ b/tests/test_http_request.py
@@ -246,25 +246,41 @@ class RequestTest(unittest.TestCase):
         self.assertRaises(AttributeError, setattr, r, 'url', 'http://example2.com')
         self.assertRaises(AttributeError, setattr, r, 'body', 'xxx')
 
-    def test_callback_is_callable(self):
+    def test_callback_and_errback(self):
         def a_function():
             pass
-        r = self.request_class('http://example.com')
-        self.assertIsNone(r.callback)
-        r = self.request_class('http://example.com', a_function)
-        self.assertIs(r.callback, a_function)
-        with self.assertRaises(TypeError):
-            self.request_class('http://example.com', 'a_function')
 
-    def test_errback_is_callable(self):
-        def a_function():
-            pass
-        r = self.request_class('http://example.com')
-        self.assertIsNone(r.errback)
-        r = self.request_class('http://example.com', a_function, errback=a_function)
-        self.assertIs(r.errback, a_function)
+        r1 = self.request_class('http://example.com')
+        self.assertIsNone(r1.callback)
+        self.assertIsNone(r1.errback)
+
+        r2 = self.request_class('http://example.com', callback=a_function)
+        self.assertIs(r2.callback, a_function)
+        self.assertIsNone(r2.errback)
+
+        r3 = self.request_class('http://example.com', errback=a_function)
+        self.assertIsNone(r3.callback)
+        self.assertIs(r3.errback, a_function)
+
+        r4 = self.request_class(
+            url='http://example.com',
+            callback=a_function,
+            errback=a_function,
+        )
+        self.assertIs(r4.callback, a_function)
+        self.assertIs(r4.errback, a_function)
+
+    def test_callback_and_errback_type(self):
+        with self.assertRaises(TypeError):
+            self.request_class('http://example.com', callback='a_function')
         with self.assertRaises(TypeError):
-            self.request_class('http://example.com', a_function, errback='a_function')
+            self.request_class('http://example.com', errback='a_function')
+        with self.assertRaises(TypeError):
+            self.request_class(
+                url='http://example.com',
+                callback='a_function',
+                errback='a_function',
+            )
 
     def test_from_curl(self):
         # Note: more curated tests regarding curl conversion are in

pip install -e .
parse_log_pytest_v2
requirements.txt
pytest pytest-cov pytest-xdist pytest-mock pytest-asyncio
apt-get update apt-get install -y gcc libxml2-dev libxslt1-dev zlib1g-dev libffi-dev libssl-dev
3.9
docs/requirements.txt
pytest -xvs
alabaster==0.7.16
attrs==25.3.0
Automat==24.8.1
babel==2.17.0
certifi==2025.1.31
cffi==1.17.1
charset-normalizer==3.4.1
constantly==23.10.4
coverage==7.8.0
cryptography==44.0.2
cssselect==1.3.0
docutils==0.21.2
exceptiongroup==1.2.2
execnet==2.1.1
hyperlink==21.0.0
idna==3.10
imagesize==1.4.1
importlib_metadata==8.6.1
incremental==24.7.2
iniconfig==2.1.0
Jinja2==3.1.6
jmespath==1.0.1
lxml==5.3.1
MarkupSafe==3.0.2
packaging==24.2
parsel==1.10.0
pluggy==1.5.0
Protego==0.4.0
pyasn1==0.6.1
pyasn1_modules==0.4.2
pycparser==2.22
PyDispatcher==2.0.7
Pygments==2.19.1
pyOpenSSL==25.0.0
pytest==8.3.5
pytest-asyncio==0.26.0
pytest-cov==6.0.0
pytest-mock==3.14.0
pytest-xdist==3.6.1
queuelib==1.7.0
requests==2.32.3
-e git+https://github.com/scrapy/scrapy.git@9b7452211a71676e84573def77483e3e7a32751b#egg=Scrapy
service-identity==24.2.0
six==1.17.0
snowballstemmer==2.2.0
Sphinx==7.4.7
sphinx-hoverxref==1.4.2
sphinx-notfound-page==1.1.0
sphinx-rtd-theme==3.0.2
sphinxcontrib-applehelp==2.0.0
sphinxcontrib-devhelp==2.0.0
sphinxcontrib-htmlhelp==2.1.0
sphinxcontrib-jquery==4.1
sphinxcontrib-jsmath==1.0.1
sphinxcontrib-qthelp==2.0.0
sphinxcontrib-serializinghtml==2.0.0
tomli==2.2.1
Twisted==24.11.0
typing_extensions==4.13.0
urllib3==2.3.0
w3lib==2.3.1
zipp==3.21.0
zope.interface==7.2

name: scrapy
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:
      - alabaster==0.7.16
      - attrs==25.3.0
      - automat==24.8.1
      - babel==2.17.0
      - certifi==2025.1.31
      - cffi==1.17.1
      - charset-normalizer==3.4.1
      - constantly==23.10.4
      - coverage==7.8.0
      - cryptography==44.0.2
      - cssselect==1.3.0
      - docutils==0.21.2
      - exceptiongroup==1.2.2
      - execnet==2.1.1
      - hyperlink==21.0.0
      - idna==3.10
      - imagesize==1.4.1
      - importlib-metadata==8.6.1
      - incremental==24.7.2
      - iniconfig==2.1.0
      - jinja2==3.1.6
      - jmespath==1.0.1
      - lxml==5.3.1
      - markupsafe==3.0.2
      - packaging==24.2
      - parsel==1.10.0
      - pluggy==1.5.0
      - protego==0.4.0
      - pyasn1==0.6.1
      - pyasn1-modules==0.4.2
      - pycparser==2.22
      - pydispatcher==2.0.7
      - pygments==2.19.1
      - pyopenssl==25.0.0
      - pytest==8.3.5
      - pytest-asyncio==0.26.0
      - pytest-cov==6.0.0
      - pytest-mock==3.14.0
      - pytest-xdist==3.6.1
      - queuelib==1.7.0
      - requests==2.32.3
      - service-identity==24.2.0
      - six==1.17.0
      - snowballstemmer==2.2.0
      - sphinx==7.4.7
      - sphinx-hoverxref==1.4.2
      - sphinx-notfound-page==1.1.0
      - sphinx-rtd-theme==3.0.2
      - sphinxcontrib-applehelp==2.0.0
      - sphinxcontrib-devhelp==2.0.0
      - sphinxcontrib-htmlhelp==2.1.0
      - sphinxcontrib-jquery==4.1
      - sphinxcontrib-jsmath==1.0.1
      - sphinxcontrib-qthelp==2.0.0
      - sphinxcontrib-serializinghtml==2.0.0
      - tomli==2.2.1
      - twisted==24.11.0
      - typing-extensions==4.13.0
      - urllib3==2.3.0
      - w3lib==2.3.1
      - zipp==3.21.0
      - zope-interface==7.2
prefix: /opt/conda/envs/scrapy

tests/test_http_request.py::RequestTest::test_callback_and_errback tests/test_http_request.py::RequestTest::test_callback_and_errback_type tests/test_http_request.py::RequestTest::test_copy tests/test_http_request.py::RequestTest::test_copy_inherited_classes tests/test_http_request.py::RequestTest::test_eq tests/test_http_request.py::RequestTest::test_from_curl tests/test_http_request.py::RequestTest::test_from_curl_ignore_unknown_options tests/test_http_request.py::RequestTest::test_from_curl_with_kwargs tests/test_http_request.py::RequestTest::test_headers tests/test_http_request.py::RequestTest::test_immutable_attributes tests/test_http_request.py::RequestTest::test_init tests/test_http_request.py::RequestTest::test_method_always_str tests/test_http_request.py::RequestTest::test_replace tests/test_http_request.py::RequestTest::test_url tests/test_http_request.py::RequestTest::test_url_encoding tests/test_http_request.py::RequestTest::test_url_encoding_nonutf8_untouched tests/test_http_request.py::RequestTest::test_url_encoding_other tests/test_http_request.py::RequestTest::test_url_encoding_query tests/test_http_request.py::RequestTest::test_url_encoding_query_latin1 tests/test_http_request.py::RequestTest::test_url_no_scheme tests/test_http_request.py::RequestTest::test_url_quoting tests/test_http_request.py::FormRequestTest::test_ajax_url tests/test_http_request.py::FormRequestTest::test_body tests/test_http_request.py::FormRequestTest::test_callback_and_errback tests/test_http_request.py::FormRequestTest::test_callback_and_errback_type tests/test_http_request.py::FormRequestTest::test_copy tests/test_http_request.py::FormRequestTest::test_copy_inherited_classes tests/test_http_request.py::FormRequestTest::test_custom_encoding_bytes tests/test_http_request.py::FormRequestTest::test_custom_encoding_textual_data tests/test_http_request.py::FormRequestTest::test_default_encoding_bytes tests/test_http_request.py::FormRequestTest::test_default_encoding_mixed_data tests/test_http_request.py::FormRequestTest::test_default_encoding_textual_data tests/test_http_request.py::FormRequestTest::test_empty_formdata tests/test_http_request.py::FormRequestTest::test_eq tests/test_http_request.py::FormRequestTest::test_from_curl tests/test_http_request.py::FormRequestTest::test_from_curl_ignore_unknown_options tests/test_http_request.py::FormRequestTest::test_from_curl_with_kwargs tests/test_http_request.py::FormRequestTest::test_from_response_ambiguous_clickdata tests/test_http_request.py::FormRequestTest::test_from_response_button_notype tests/test_http_request.py::FormRequestTest::test_from_response_button_novalue tests/test_http_request.py::FormRequestTest::test_from_response_button_submit tests/test_http_request.py::FormRequestTest::test_from_response_case_insensitive tests/test_http_request.py::FormRequestTest::test_from_response_checkbox tests/test_http_request.py::FormRequestTest::test_from_response_clickdata_does_not_ignore_image tests/test_http_request.py::FormRequestTest::test_from_response_css tests/test_http_request.py::FormRequestTest::test_from_response_descendants tests/test_http_request.py::FormRequestTest::test_from_response_dont_click tests/test_http_request.py::FormRequestTest::test_from_response_dont_submit_image_as_input tests/test_http_request.py::FormRequestTest::test_from_response_dont_submit_reset_as_input tests/test_http_request.py::FormRequestTest::test_from_response_drop_params tests/test_http_request.py::FormRequestTest::test_from_response_duplicate_form_key tests/test_http_request.py::FormRequestTest::test_from_response_errors_formnumber tests/test_http_request.py::FormRequestTest::test_from_response_errors_noform tests/test_http_request.py::FormRequestTest::test_from_response_extra_headers tests/test_http_request.py::FormRequestTest::test_from_response_formid_errors_formnumber tests/test_http_request.py::FormRequestTest::test_from_response_formid_exists tests/test_http_request.py::FormRequestTest::test_from_response_formid_notexist tests/test_http_request.py::FormRequestTest::test_from_response_formname_errors_formnumber tests/test_http_request.py::FormRequestTest::test_from_response_formname_exists tests/test_http_request.py::FormRequestTest::test_from_response_formname_notexist tests/test_http_request.py::FormRequestTest::test_from_response_formname_notexists_fallback_formid tests/test_http_request.py::FormRequestTest::test_from_response_get tests/test_http_request.py::FormRequestTest::test_from_response_input_hidden tests/test_http_request.py::FormRequestTest::test_from_response_input_text tests/test_http_request.py::FormRequestTest::test_from_response_input_textarea tests/test_http_request.py::FormRequestTest::test_from_response_invalid_html5 tests/test_http_request.py::FormRequestTest::test_from_response_invalid_nr_index_clickdata tests/test_http_request.py::FormRequestTest::test_from_response_multiple_clickdata tests/test_http_request.py::FormRequestTest::test_from_response_multiple_forms_clickdata tests/test_http_request.py::FormRequestTest::test_from_response_noformname tests/test_http_request.py::FormRequestTest::test_from_response_non_matching_clickdata tests/test_http_request.py::FormRequestTest::test_from_response_nr_index_clickdata tests/test_http_request.py::FormRequestTest::test_from_response_override_clickable tests/test_http_request.py::FormRequestTest::test_from_response_override_duplicate_form_key tests/test_http_request.py::FormRequestTest::test_from_response_override_method tests/test_http_request.py::FormRequestTest::test_from_response_override_params tests/test_http_request.py::FormRequestTest::test_from_response_override_url tests/test_http_request.py::FormRequestTest::test_from_response_post tests/test_http_request.py::FormRequestTest::test_from_response_post_nonascii_bytes_latin1 tests/test_http_request.py::FormRequestTest::test_from_response_post_nonascii_bytes_utf8 tests/test_http_request.py::FormRequestTest::test_from_response_post_nonascii_unicode tests/test_http_request.py::FormRequestTest::test_from_response_radio tests/test_http_request.py::FormRequestTest::test_from_response_select tests/test_http_request.py::FormRequestTest::test_from_response_submit_first_clickable tests/test_http_request.py::FormRequestTest::test_from_response_submit_not_first_clickable tests/test_http_request.py::FormRequestTest::test_from_response_submit_novalue tests/test_http_request.py::FormRequestTest::test_from_response_unicode_clickdata tests/test_http_request.py::FormRequestTest::test_from_response_unicode_clickdata_latin1 tests/test_http_request.py::FormRequestTest::test_from_response_unicode_xpath tests/test_http_request.py::FormRequestTest::test_from_response_valid_form_methods tests/test_http_request.py::FormRequestTest::test_from_response_xpath tests/test_http_request.py::FormRequestTest::test_headers tests/test_http_request.py::FormRequestTest::test_html_base_form_action tests/test_http_request.py::FormRequestTest::test_immutable_attributes tests/test_http_request.py::FormRequestTest::test_init tests/test_http_request.py::FormRequestTest::test_method_always_str tests/test_http_request.py::FormRequestTest::test_multi_key_values tests/test_http_request.py::FormRequestTest::test_replace tests/test_http_request.py::FormRequestTest::test_spaces_in_action tests/test_http_request.py::FormRequestTest::test_url tests/test_http_request.py::FormRequestTest::test_url_encoding tests/test_http_request.py::FormRequestTest::test_url_encoding_nonutf8_untouched tests/test_http_request.py::FormRequestTest::test_url_encoding_other tests/test_http_request.py::FormRequestTest::test_url_encoding_query tests/test_http_request.py::FormRequestTest::test_url_encoding_query_latin1 tests/test_http_request.py::FormRequestTest::test_url_no_scheme tests/test_http_request.py::FormRequestTest::test_url_quoting tests/test_http_request.py::XmlRpcRequestTest::test_ajax_url tests/test_http_request.py::XmlRpcRequestTest::test_body tests/test_http_request.py::XmlRpcRequestTest::test_callback_and_errback tests/test_http_request.py::XmlRpcRequestTest::test_callback_and_errback_type tests/test_http_request.py::XmlRpcRequestTest::test_copy tests/test_http_request.py::XmlRpcRequestTest::test_copy_inherited_classes tests/test_http_request.py::XmlRpcRequestTest::test_eq tests/test_http_request.py::XmlRpcRequestTest::test_from_curl tests/test_http_request.py::XmlRpcRequestTest::test_from_curl_ignore_unknown_options tests/test_http_request.py::XmlRpcRequestTest::test_from_curl_with_kwargs tests/test_http_request.py::XmlRpcRequestTest::test_headers tests/test_http_request.py::XmlRpcRequestTest::test_immutable_attributes tests/test_http_request.py::XmlRpcRequestTest::test_init tests/test_http_request.py::XmlRpcRequestTest::test_latin1 tests/test_http_request.py::XmlRpcRequestTest::test_method_always_str tests/test_http_request.py::XmlRpcRequestTest::test_replace tests/test_http_request.py::XmlRpcRequestTest::test_url tests/test_http_request.py::XmlRpcRequestTest::test_url_encoding tests/test_http_request.py::XmlRpcRequestTest::test_url_encoding_nonutf8_untouched tests/test_http_request.py::XmlRpcRequestTest::test_url_encoding_other tests/test_http_request.py::XmlRpcRequestTest::test_url_encoding_query tests/test_http_request.py::XmlRpcRequestTest::test_url_encoding_query_latin1 tests/test_http_request.py::XmlRpcRequestTest::test_url_no_scheme tests/test_http_request.py::XmlRpcRequestTest::test_url_quoting tests/test_http_request.py::XmlRpcRequestTest::test_xmlrpc_dumps tests/test_http_request.py::JsonRequestTest::test_ajax_url tests/test_http_request.py::JsonRequestTest::test_body tests/test_http_request.py::JsonRequestTest::test_body_data tests/test_http_request.py::JsonRequestTest::test_body_data_none tests/test_http_request.py::JsonRequestTest::test_body_none_data tests/test_http_request.py::JsonRequestTest::test_callback_and_errback tests/test_http_request.py::JsonRequestTest::test_callback_and_errback_type tests/test_http_request.py::JsonRequestTest::test_copy tests/test_http_request.py::JsonRequestTest::test_copy_inherited_classes tests/test_http_request.py::JsonRequestTest::test_data tests/test_http_request.py::JsonRequestTest::test_data_method tests/test_http_request.py::JsonRequestTest::test_dumps_kwargs tests/test_http_request.py::JsonRequestTest::test_dumps_sort_keys tests/test_http_request.py::JsonRequestTest::test_empty_body_data tests/test_http_request.py::JsonRequestTest::test_eq tests/test_http_request.py::JsonRequestTest::test_from_curl tests/test_http_request.py::JsonRequestTest::test_from_curl_ignore_unknown_options tests/test_http_request.py::JsonRequestTest::test_from_curl_with_kwargs tests/test_http_request.py::JsonRequestTest::test_headers tests/test_http_request.py::JsonRequestTest::test_immutable_attributes tests/test_http_request.py::JsonRequestTest::test_init tests/test_http_request.py::JsonRequestTest::test_method_always_str tests/test_http_request.py::JsonRequestTest::test_replace tests/test_http_request.py::JsonRequestTest::test_replace_data tests/test_http_request.py::JsonRequestTest::test_replace_dumps_kwargs tests/test_http_request.py::JsonRequestTest::test_replace_sort_keys tests/test_http_request.py::JsonRequestTest::test_url tests/test_http_request.py::JsonRequestTest::test_url_encoding tests/test_http_request.py::JsonRequestTest::test_url_encoding_nonutf8_untouched tests/test_http_request.py::JsonRequestTest::test_url_encoding_other tests/test_http_request.py::JsonRequestTest::test_url_encoding_query tests/test_http_request.py::JsonRequestTest::test_url_encoding_query_latin1 tests/test_http_request.py::JsonRequestTest::test_url_no_scheme tests/test_http_request.py::JsonRequestTest::test_url_quoting
tests/test_http_request.py::RequestTest::test_ajax_url tests/test_http_request.py::RequestTest::test_body
scrapy/http/request/__init__.py
scrapy/http/request/__init__.py