mirror of https://github.com/scrapy/scrapy.git
41 lines
1.2 KiB
Python
41 lines
1.2 KiB
Python
from __future__ import annotations
|
|
|
|
from itertools import product
|
|
|
|
SCHEME_PARAMS = ("url", "location", "target")
|
|
HTTP_SCHEMES = ("http", "https")
|
|
NON_HTTP_SCHEMES = ("data", "file", "ftp", "s3", "foo")
|
|
REDIRECT_SCHEME_CASES = (
|
|
# http/https → http/https redirects
|
|
*(
|
|
(
|
|
f"{input_scheme}://example.com/a",
|
|
f"{output_scheme}://example.com/b",
|
|
f"{output_scheme}://example.com/b",
|
|
)
|
|
for input_scheme, output_scheme in product(HTTP_SCHEMES, repeat=2)
|
|
),
|
|
# http/https → data/file/ftp/s3/foo does not redirect
|
|
*(
|
|
(
|
|
f"{input_scheme}://example.com/a",
|
|
f"{output_scheme}://example.com/b",
|
|
None,
|
|
)
|
|
for input_scheme in HTTP_SCHEMES
|
|
for output_scheme in NON_HTTP_SCHEMES
|
|
),
|
|
# http/https → relative redirects
|
|
*(
|
|
(
|
|
f"{scheme}://example.com/a",
|
|
location,
|
|
f"{scheme}://example.com/b",
|
|
)
|
|
for scheme in HTTP_SCHEMES
|
|
for location in ("//example.com/b", "/b")
|
|
),
|
|
# Note: We do not test data/file/ftp/s3 schemes for the initial URL
|
|
# because their download handlers cannot return a status code of 3xx.
|
|
)
|