From f7a8083f12bf467b15918a55a67a07ffc0cae36c Mon Sep 17 00:00:00 2001 From: Ishaan Kapur <64529428+ishaanlabs-gg@users.noreply.github.com> Date: Wed, 1 Jul 2026 06:21:35 +0530 Subject: [PATCH] Fix empty URL path with query --- scrapy/http/request/__init__.py | 4 ++++ tests/test_http_request.py | 10 ++++++++++ 2 files changed, 14 insertions(+) diff --git a/scrapy/http/request/__init__.py b/scrapy/http/request/__init__.py index 73c2e7dd4..5cc3ea83e 100644 --- a/scrapy/http/request/__init__.py +++ b/scrapy/http/request/__init__.py @@ -8,6 +8,7 @@ See documentation in docs/topics/request-response.rst from __future__ import annotations import inspect +from urllib.parse import urlsplit, urlunsplit from typing import ( TYPE_CHECKING, Any, @@ -263,6 +264,9 @@ class Request(object_ref): self._url = url else: self._url = safe_url_string(url, self.encoding) + parts = urlsplit(self._url) + if parts.netloc and not parts.path and parts.query: + self._url = urlunsplit(parts._replace(path="/")) if ( "://" not in self._url diff --git a/tests/test_http_request.py b/tests/test_http_request.py index 1941b826f..5239a75f9 100644 --- a/tests/test_http_request.py +++ b/tests/test_http_request.py @@ -100,6 +100,16 @@ class TestRequest: r = self.request_class(url="http://www.scrapy.org/path") assert r.url == "http://www.scrapy.org/path" + def test_url_empty_path_with_query(self): + r = self.request_class(url="http://www.scrapy.org?foo=bar") + assert r.url == "http://www.scrapy.org/?foo=bar" + + r = self.request_class( + url="http://www.scrapy.org?foo=bar", + meta={"verbatim_url": True}, + ) + assert r.url == "http://www.scrapy.org?foo=bar" + def test_url_quoting(self): r = self.request_class(url="http://www.scrapy.org/blank%20space") assert r.url == "http://www.scrapy.org/blank%20space"