Skip to content

Commit 7327381

Browse files
authoredFeb 20, 2025··
Merge pull request #2773 from jku/no-requests
More porting from requests to urllib3
2 parents 9c67e27 + 5acd3f7 commit 7327381

File tree

10 files changed

+28
-39
lines changed

10 files changed

+28
-39
lines changed
 

‎examples/uploader/_localrepo.py

+6-5
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
import os
1313
from datetime import datetime, timedelta, timezone
1414

15-
import requests
1615
from securesystemslib.signer import CryptoSigner, Signer
16+
from urllib3 import request
1717

1818
from tuf.api.exceptions import RepositoryError
1919
from tuf.api.metadata import Metadata, MetaFile, TargetFile, Targets
@@ -92,8 +92,9 @@ def close(self, role_name: str, md: Metadata) -> None:
9292

9393
# Upload using "api/role"
9494
uri = f"{self.base_url}/api/role/{role_name}"
95-
r = requests.post(uri, data=md.to_bytes(JSONSerializer()), timeout=5)
96-
r.raise_for_status()
95+
r = request("POST", uri, body=md.to_bytes(JSONSerializer()), timeout=5)
96+
if r.status != 200:
97+
raise RuntimeError(f"HTTP error {r.status}")
9798

9899
def add_target(self, role: str, targetpath: str) -> bool:
99100
"""Add target to roles metadata and submit new metadata version"""
@@ -124,8 +125,8 @@ def add_delegation(self, role: str) -> bool:
124125

125126
data = {signer.public_key.keyid: signer.public_key.to_dict()}
126127
url = f"{self.base_url}/api/delegation/{role}"
127-
r = requests.post(url, data=json.dumps(data), timeout=5)
128-
if r.status_code != 200:
128+
r = request("POST", url, body=json.dumps(data), timeout=5)
129+
if r.status != 200:
129130
print(f"delegation failed with {r}")
130131
return False
131132

‎pyproject.toml

+1-2
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ classifiers = [
4444
"Topic :: Software Development",
4545
]
4646
dependencies = [
47-
"requests>=2.19.1",
4847
"securesystemslib~=1.0",
4948
"urllib3<3,>=1.21.1",
5049
]
@@ -155,4 +154,4 @@ exclude_also = [
155154
]
156155
[tool.coverage.run]
157156
branch = true
158-
omit = [ "tests/*", "tuf/ngclient/_internal/requests_fetcher.py" ]
157+
omit = [ "tests/*", "tuf/ngclient/requests_fetcher.py" ]

‎requirements/main.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,4 @@
77
# triggers CI/CD builds to automatically test against updated dependencies.
88
#
99
securesystemslib[crypto]
10-
requests
10+
urllib3

‎requirements/pinned.txt

+1-9
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,13 @@
44
#
55
# pip-compile --output-file=requirements/pinned.txt --strip-extras requirements/main.txt
66
#
7-
certifi==2025.1.31
8-
# via requests
97
cffi==1.17.1
108
# via cryptography
11-
charset-normalizer==3.4.1
12-
# via requests
139
cryptography==44.0.1
1410
# via securesystemslib
15-
idna==3.10
16-
# via requests
1711
pycparser==2.22
1812
# via cffi
19-
requests==2.32.3
20-
# via -r requirements/main.txt
2113
securesystemslib==1.2.0
2214
# via -r requirements/main.txt
2315
urllib3==2.3.0
24-
# via requests
16+
# via -r requirements/main.txt

‎tuf/__init__.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@
33

44
"""TUF."""
55

6-
# This value is used in the requests user agent.
6+
# This value is used in the ngclient user agent.
77
__version__ = "5.1.0"

‎tuf/ngclient/__init__.py

+1-7
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,13 @@
44
"""TUF client public API."""
55

66
from tuf.api.metadata import TargetFile
7-
8-
# requests_fetcher is public but comes from _internal for now (because
9-
# sigstore-python 1.0 still uses the module from there). requests_fetcher
10-
# can be moved out of _internal once sigstore-python 1.0 is not relevant.
11-
from tuf.ngclient._internal.requests_fetcher import RequestsFetcher
12-
from tuf.ngclient._internal.urllib3_fetcher import Urllib3Fetcher
137
from tuf.ngclient.config import UpdaterConfig
148
from tuf.ngclient.fetcher import FetcherInterface
159
from tuf.ngclient.updater import Updater
10+
from tuf.ngclient.urllib3_fetcher import Urllib3Fetcher
1611

1712
__all__ = [ # noqa: PLE0604
1813
FetcherInterface.__name__,
19-
RequestsFetcher.__name__,
2014
Urllib3Fetcher.__name__,
2115
TargetFile.__name__,
2216
Updater.__name__,

‎tuf/ngclient/_internal/requests_fetcher.py ‎tuf/ngclient/requests_fetcher.py

+7-4
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,14 @@
33

44
"""Provides an implementation of ``FetcherInterface`` using the Requests HTTP
55
library.
6-
"""
76
8-
# requests_fetcher is public but comes from _internal for now (because
9-
# sigstore-python 1.0 still uses the module from there). requests_fetcher
10-
# can be moved out of _internal once sigstore-python 1.0 is not relevant.
7+
Note that this module is deprecated, and the default fetcher is
8+
Urllib3Fetcher:
9+
* RequestsFetcher is still available to make it easy to fall back to
10+
previous implementation if issues are found with the Urllib3Fetcher
11+
* If RequestsFetcher is used, note that `requests` must be explicitly
12+
depended on: python-tuf does not do that.
13+
"""
1114

1215
from __future__ import annotations
1316

‎tuf/ngclient/updater.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,8 @@
4949

5050
from tuf.api import exceptions
5151
from tuf.api.metadata import Root, Snapshot, TargetFile, Targets, Timestamp
52-
from tuf.ngclient._internal import trusted_metadata_set, urllib3_fetcher
52+
from tuf.ngclient import urllib3_fetcher
53+
from tuf.ngclient._internal import trusted_metadata_set
5354
from tuf.ngclient.config import EnvelopeType, UpdaterConfig
5455

5556
if TYPE_CHECKING:
File renamed without changes.

‎verify_release

+8-9
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ on GitHub and PyPI match the built release artifacts.
1212
from __future__ import annotations
1313

1414
import argparse
15-
import json
1615
import os
1716
import subprocess
1817
import sys
@@ -21,10 +20,10 @@ from tempfile import TemporaryDirectory
2120

2221
try:
2322
import build as _ # type: ignore[import-not-found] # noqa: F401
24-
import requests
23+
from urllib3 import request
2524
except ImportError:
26-
print("Error: verify_release requires modules 'requests' and 'build':")
27-
print(" pip install requests build")
25+
print("Error: verify_release requires modules 'urllib3' and 'build':")
26+
print(" pip install urllib3 build")
2827
sys.exit(1)
2928

3029
# Project variables
@@ -76,9 +75,7 @@ def get_git_version() -> str:
7675
def get_github_version() -> str:
7776
"""Return version string of latest GitHub release"""
7877
release_json = f"https://api.github.com/repos/{GITHUB_ORG}/{GITHUB_PROJECT}/releases/latest"
79-
releases = json.loads(
80-
requests.get(release_json, timeout=HTTP_TIMEOUT).content
81-
)
78+
releases = request("GET", release_json, timeout=HTTP_TIMEOUT).json()
8279
return releases["tag_name"][1:]
8380

8481

@@ -107,9 +104,11 @@ def verify_github_release(version: str, compare_dir: str) -> bool:
107104
with TemporaryDirectory() as github_dir:
108105
for filename in [tar, wheel]:
109106
url = f"{base_url}/v{version}/{filename}"
110-
response = requests.get(url, stream=True, timeout=HTTP_TIMEOUT)
107+
response = request(
108+
"GET", url, preload_content=False, timeout=HTTP_TIMEOUT
109+
)
111110
with open(os.path.join(github_dir, filename), "wb") as f:
112-
for data in response.iter_content():
111+
for data in response.stream():
113112
f.write(data)
114113

115114
return cmp(

0 commit comments

Comments
 (0)
Please sign in to comment.