Requests v2.34.2 keeps synchronous HTTP deliberately ordinary
Requests v2.34.2 makes the common HTTP operations look like regular Python calls. A developer passes query parameters, form data, JSON, headers, files, or authentication and receives a Response object with status, headers, text, bytes, and JSON helpers. Sessions persist cookies and shared settings while reusing connections through urllib3. The package handles HTTP/1.1, redirects, decompression, proxies, basic and digest authentication, netrc credentials, TLS verification, and streamed downloads.
The repository is compact by widely used library standards. Our checkout contained 128 files, about 12,069 lines of source, and occupied 4.5 MB. GitHub identifies Python as the primary language, and the package supports Python 3.10 or newer. It has an Apache-2.0 license, 8 CI workflow files, and a tests directory. There is no Dockerfile, which is appropriate for a client library that runs inside another application rather than exposing its own service.
Sessions reuse HTTP/1.1 connections and persist cookies
A Session carries cookies, default headers, authentication, proxies, and certificate settings across HTTP/1.1 calls. It also returns connections to urllib3's pool when response bodies are consumed, avoiding a new connection for every request to the same host. Prepared requests let advanced callers alter the exact body or headers before sending. The documentation warns that directly preparing a Request can omit session and environment settings, so the session-aware preparation method is safer when CA bundles or proxies come from the environment.
What happened when we ran it
Our sandbox installed Requests at commit dae7ef6 in 37 seconds, adding 54 packages and using 63 MB on disk. The build then succeeded in 6 seconds. This ran in a fresh unprivileged Debian container with 3 CPUs and 8 GB of RAM, using Python 3.12 and no secrets. The repository itself was only 4.5 MB before dependencies, so most of the measured disk use belongs to the development and test environment rather than the client source.
Tests completed successfully after 85 seconds. Pytest reported 619 passed, 0 failed, and 15 skipped of 619. We preserve that harness summary exactly rather than recalculating its stated total. Pip-audit found 0 known vulnerabilities in the installed environment. These results are unusually clean for a library that sits on network, proxy, certificate, redirect, encoding, and authentication boundaries, although they describe one commit and one Python 3.12 environment.
The measurement signals also found 8 CI workflow files, no Dockerfile, and a tests directory. Our run did not make external service claims, measure request latency, or test every proxy and certificate arrangement. A passing suite means the checked-out project behaved as its tests expected in the sandbox. It does not replace an application's own checks against its authentication scheme, corporate proxy, CA store, retry rules, response sizes, or failure handling.
Requests waits indefinitely unless code sets a timeout
Requests v2.34.2 does not apply a timeout when the caller omits the argument. The quickstart warns that production code should set one on nearly every call because a program can otherwise hang indefinitely. Its timeout describes socket inactivity rather than a cap on the entire download. Applications with end-to-end deadlines need to account for that difference. A shared wrapper or Session subclass can apply a house default, but the base library leaves the value to each call.
TLS verification is enabled by default and should stay that way. A caller can provide a CA bundle, use environment variables for trusted roots, or attach a client certificate. The docs warn that verify=False accepts expired certificates and hostname mismatches, exposing the connection to interception. They also state that encrypted client private keys are unsupported. Those limits are concrete reasons to check Requests against an organization's certificate process before standardizing on it.
Streaming works, with connection and multipart limits
With stream=True, Requests v2.34.2 downloads headers first and defers the body. Iterating through content handles common transfer decoding, while raw access preserves the underlying bytes. The connection returns to the pool only after the body is consumed or the response is closed. A context manager is the safest pattern for code that may stop reading early. Without streaming enabled, the response body arrives immediately, a detail that open issue 7599 says one docstring describes ambiguously.
Large file downloads fit this model, but large multipart uploads need another package when the body must stream rather than load normally. The quickstart points those users to requests-toolbelt. Our installed environment used 63 MB before an application added such extras. SOCKS proxy support is optional as well. The split keeps the default package focused, though buyers should inventory proxy and upload requirements instead of assuming every HTTP feature belongs in the core distribution.
September 2026 work shows health beyond the May release
GitHub showed 54,281 stars and 235 combined open issues and pull requests. The last push was September 2, 2026, after the latest release, v2.34.2, shipped on May 14. Issue discussions were updated through September 5. That evidence shows current maintenance even though no newer release tag exists. The combined open count includes pull requests, and several recently updated issues began years ago, so neither 235 nor issue age alone measures defect severity.
The current queue contains real edge cases. Issue 6102 concerns non-Latin digest credentials, issue 5000 concerns no_proxy behavior, and issue 6990 concerns digest authentication when a URL path contains semicolons. Issue 7443 reports typing trouble for some JSON dictionaries after recent type changes. Most applications will never hit all four, but authentication, proxy, and typing-heavy users should build small reproductions with v2.34.2 before changing a shared dependency.
The 619 passing tests support a narrow recommendation
Requests remains our pick for ordinary synchronous HTTP/1.1 because its documentation states the sharp edges and our full run passed. The 37-second install and 6-second build make a trial cheap. Set timeouts, preserve TLS checks, close streams, and test unusual authentication or proxy behavior. Async services and HTTP/2 clients should start with HTTPX or aiohttp.

