<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hacker News: mesahm</title><link>https://news.ycombinator.com/user?id=mesahm</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Mon, 15 Jun 2026 10:23:07 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=mesahm" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by mesahm in "Show HN: Niquests – A Requests fork, three years of catching Python's HTTP up"]]></title><description><![CDATA[
<p>Very stable actually. We've enabled it by default as such.<p>regards,</p>
]]></description><pubDate>Tue, 07 Apr 2026 12:47:00 +0000</pubDate><link>https://news.ycombinator.com/item?id=47674472</link><dc:creator>mesahm</dc:creator><comments>https://news.ycombinator.com/item?id=47674472</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47674472</guid></item><item><title><![CDATA[New comment by mesahm in "Show HN: Niquests – A Requests fork, three years of catching Python's HTTP up"]]></title><description><![CDATA[
<p>We've extensively worked the compat layer. And every adapters out there should work as is.
But most of time, we've exposed better way to achieve that (e.g. mTLS in memory, network fine tuning, peer cert retrieval, ...) can be done without extra customization.<p>regards,</p>
]]></description><pubDate>Tue, 07 Apr 2026 10:14:38 +0000</pubDate><link>https://news.ycombinator.com/item?id=47672931</link><dc:creator>mesahm</dc:creator><comments>https://news.ycombinator.com/item?id=47672931</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47672931</guid></item><item><title><![CDATA[New comment by mesahm in "Show HN: Niquests – A Requests fork, three years of catching Python's HTTP up"]]></title><description><![CDATA[
<p>Author here. I forked Requests in mid-2023 because it's effectively frozen, and Python's HTTP capabilities have fallen far behind what the protocols and the ecosystem allow today. The Requests API is great; I didn't want to replace it, I wanted to catch it up.<p>Three years later, here's where things stand:<p>HTTP/2 by default, HTTP/3 over QUIC when the server advertises it via Alt-Svc or via DNS HTTPS record. No configuration needed, the client negotiates automatically. This alone accounts for most of the performance difference in practice. A quick benchmark (1000 requests to httpbingo.org/get, reproduction steps in the README)<p>niquests  0.551s  (HTTP/2)
aiohttp   1.351s  (HTTP/1.1)
httpx     2.087s  (HTTP/2)<p>Security defaults that should have been there years ago. OS trust store instead of bundled certifi. Certificate revocation checks via OCSP or CRL. Encrypted Client Hello. Post-quantum key exchange. None of this is exotic anymore - browsers have shipped most of it - but Python clients still don't do it.<p>DNS. DNS-over-HTTPS, DNS-over-TLS, DNS-over-QUIC, DNSSEC validation. Per-session resolver configuration.<p>Other things that accumulated over three years: Happy Eyeballs, WebSocket and SSE over all three HTTP versions, in-memory certificates for mTLS, connection-level telemetry (DNS/TCP/TLS timings via response.conn_info), native Unix socket support, and as of 3.18, experimental Pyodide/WASM support.<p>Migration is boring by design: import niquests as requests. Existing auth flows, cookie jars, .netrc, adapters - they all work. We also maintain compatibility shims for requests-mock, responses, and betamax.<p>Happy to discuss anything related to the project or HTTP in general.</p>
]]></description><pubDate>Tue, 07 Apr 2026 08:45:39 +0000</pubDate><link>https://news.ycombinator.com/item?id=47672341</link><dc:creator>mesahm</dc:creator><comments>https://news.ycombinator.com/item?id=47672341</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47672341</guid></item><item><title><![CDATA[Show HN: Niquests – A Requests fork, three years of catching Python's HTTP up]]></title><description><![CDATA[
<p>Article URL: <a href="https://github.com/jawah/niquests/tree/v3.18.4">https://github.com/jawah/niquests/tree/v3.18.4</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=47672321">https://news.ycombinator.com/item?id=47672321</a></p>
<p>Points: 3</p>
<p># Comments: 5</p>
]]></description><pubDate>Tue, 07 Apr 2026 08:42:23 +0000</pubDate><link>https://github.com/jawah/niquests/tree/v3.18.4</link><dc:creator>mesahm</dc:creator><comments>https://news.ycombinator.com/item?id=47672321</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47672321</guid></item><item><title><![CDATA[New comment by mesahm in "Show HN: A drop-in replacement and memory-safe TLS back end for Python"]]></title><description><![CDATA[
<p>Hi HN,<p>I am the original author of "rtls". For years now, the Python experts are arguing about OpenSSL mandatory aspect in the distribution, and many other went into compiling CPython themselves against LibreSSL, or AWS-LC, (...)<p>I wanted the broader community to be able to just "run an alternative ssl backend" without effort.<p>The main goal is for anyone running a mere high level http client to be able to leverage a memory-safe TLS backend.<p>Behind the scene it's Rustls, with aws-lc-rs engine.<p>I'm also the author of Niquests http client, a drop in replacement for Requests.
<a href="https://github.com/jawah/niquests" rel="nofollow">https://github.com/jawah/niquests</a> and yes rtls is supported transparently with it.</p>
]]></description><pubDate>Thu, 02 Apr 2026 09:40:36 +0000</pubDate><link>https://news.ycombinator.com/item?id=47612110</link><dc:creator>mesahm</dc:creator><comments>https://news.ycombinator.com/item?id=47612110</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47612110</guid></item><item><title><![CDATA[Show HN: A drop-in replacement and memory-safe TLS back end for Python]]></title><description><![CDATA[
<p>Article URL: <a href="https://github.com/jawah/rtls">https://github.com/jawah/rtls</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=47612046">https://news.ycombinator.com/item?id=47612046</a></p>
<p>Points: 1</p>
<p># Comments: 1</p>
]]></description><pubDate>Thu, 02 Apr 2026 09:30:57 +0000</pubDate><link>https://github.com/jawah/rtls</link><dc:creator>mesahm</dc:creator><comments>https://news.ycombinator.com/item?id=47612046</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47612046</guid></item><item><title><![CDATA[New comment by mesahm in "Why I forked httpx"]]></title><description><![CDATA[
<p>I spend 3 years developing Niquests, and believe me, HTTP is far from easy. Being a client means you have to speak to everyone, and no one have to speak to you (RFC are nice, but in practice never applied as-is). Once you go deep under the implementation, you'll find a thousand edge cases(...). And yes, the myth that as developer http/1 is "best" only means that the underlying scheduler is weak.
today, via a dead simple script, you'll see http/2+ beat established giant in the http/1 client landscape. see <a href="https://gist.github.com/Ousret/9e99b07e66eec48ccea5811775ec116d" rel="nofollow">https://gist.github.com/Ousret/9e99b07e66eec48ccea5811775ec1...</a> if you are curious.</p>
]]></description><pubDate>Wed, 25 Mar 2026 13:38:03 +0000</pubDate><link>https://news.ycombinator.com/item?id=47517194</link><dc:creator>mesahm</dc:creator><comments>https://news.ycombinator.com/item?id=47517194</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47517194</guid></item><item><title><![CDATA[New comment by mesahm in "Why I forked httpx"]]></title><description><![CDATA[
<p>yes, plenty! testing it extensively, finding edge bugs, (...) and of course: spread the word on other project to help increasing adoption.</p>
]]></description><pubDate>Wed, 25 Mar 2026 12:27:41 +0000</pubDate><link>https://news.ycombinator.com/item?id=47516434</link><dc:creator>mesahm</dc:creator><comments>https://news.ycombinator.com/item?id=47516434</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47516434</guid></item><item><title><![CDATA[New comment by mesahm in "Why I forked httpx"]]></title><description><![CDATA[
<p>help for getting it working is appreciated, we have it in mind.
duly noted about the sponsorship, we accept constructive criticism, and alternative can be considered.</p>
]]></description><pubDate>Wed, 25 Mar 2026 12:26:09 +0000</pubDate><link>https://news.ycombinator.com/item?id=47516417</link><dc:creator>mesahm</dc:creator><comments>https://news.ycombinator.com/item?id=47516417</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47516417</guid></item><item><title><![CDATA[New comment by mesahm in "Why I forked httpx"]]></title><description><![CDATA[
<p>nice to hear :)</p>
]]></description><pubDate>Wed, 25 Mar 2026 12:24:46 +0000</pubDate><link>https://news.ycombinator.com/item?id=47516406</link><dc:creator>mesahm</dc:creator><comments>https://news.ycombinator.com/item?id=47516406</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47516406</guid></item><item><title><![CDATA[New comment by mesahm in "Why I forked httpx"]]></title><description><![CDATA[
<p>Thank you. Appreciated, you're welcome here anytime.</p>
]]></description><pubDate>Wed, 25 Mar 2026 11:05:14 +0000</pubDate><link>https://news.ycombinator.com/item?id=47515752</link><dc:creator>mesahm</dc:creator><comments>https://news.ycombinator.com/item?id=47515752</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47515752</guid></item><item><title><![CDATA[New comment by mesahm in "Why I forked httpx"]]></title><description><![CDATA[
<p>agreed. as I said, it was a mistake from my end. and clearly looking to better myself.</p>
]]></description><pubDate>Wed, 25 Mar 2026 10:00:56 +0000</pubDate><link>https://news.ycombinator.com/item?id=47515328</link><dc:creator>mesahm</dc:creator><comments>https://news.ycombinator.com/item?id=47515328</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47515328</guid></item><item><title><![CDATA[New comment by mesahm in "Why I forked httpx"]]></title><description><![CDATA[
<p>it's the gitmoji thing, I really don't like it, it was a mistake. Thinking to stop it soon. I was inspired by fastapi in the early days. I prefer conventionalcommits.org</p>
]]></description><pubDate>Wed, 25 Mar 2026 09:17:53 +0000</pubDate><link>https://news.ycombinator.com/item?id=47515075</link><dc:creator>mesahm</dc:creator><comments>https://news.ycombinator.com/item?id=47515075</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47515075</guid></item><item><title><![CDATA[New comment by mesahm in "Why I forked httpx"]]></title><description><![CDATA[
<p>nee-quests, I am French native.</p>
]]></description><pubDate>Wed, 25 Mar 2026 09:15:13 +0000</pubDate><link>https://news.ycombinator.com/item?id=47515061</link><dc:creator>mesahm</dc:creator><comments>https://news.ycombinator.com/item?id=47515061</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47515061</guid></item><item><title><![CDATA[New comment by mesahm in "Why I forked httpx"]]></title><description><![CDATA[
<p>ahah, "en effet"! je m'en souviendrai.<p>more seriously, all that is needed is our collective effort. I've done my part by scarifying a lot of personal time for it.</p>
]]></description><pubDate>Wed, 25 Mar 2026 09:07:39 +0000</pubDate><link>https://news.ycombinator.com/item?id=47515016</link><dc:creator>mesahm</dc:creator><comments>https://news.ycombinator.com/item?id=47515016</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47515016</guid></item><item><title><![CDATA[New comment by mesahm in "Why I forked httpx"]]></title><description><![CDATA[
<p>aiohttp is an excellent library. very stable. I concurs, but!
it's too heavily tied to HTTP/1, and well, I am not a fan of opening thousands of TCP conn just to keep up with HTTP/2 onward. niquests easily beat aiohttp just using 10 conn and crush httpx  see <a href="https://gist.github.com/Ousret/9e99b07e66eec48ccea5811775ec116d" rel="nofollow">https://gist.github.com/Ousret/9e99b07e66eec48ccea5811775ec1...</a><p>fwiw, HTTP/2 is twelve years old, just saying.</p>
]]></description><pubDate>Wed, 25 Mar 2026 09:01:15 +0000</pubDate><link>https://news.ycombinator.com/item?id=47514966</link><dc:creator>mesahm</dc:creator><comments>https://news.ycombinator.com/item?id=47514966</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47514966</guid></item><item><title><![CDATA[New comment by mesahm in "Why I forked httpx"]]></title><description><![CDATA[
<p>the http landscape is rather scary lately in Python. instead of forking join forces... See Niquests <a href="https://github.com/jawah/niquests" rel="nofollow">https://github.com/jawah/niquests</a><p>I am trying to resolve what you've seen. For years of hard work.</p>
]]></description><pubDate>Wed, 25 Mar 2026 08:44:11 +0000</pubDate><link>https://news.ycombinator.com/item?id=47514844</link><dc:creator>mesahm</dc:creator><comments>https://news.ycombinator.com/item?id=47514844</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47514844</guid></item><item><title><![CDATA[New comment by mesahm in "Show HN: I forked Python's Requests to add HTTP/3, async, and multiplexing"]]></title><description><![CDATA[
<p>And most importantly, we managed to get almost every plugin/3rd party tool bound to Requests in a working condition with this fork.</p>
]]></description><pubDate>Fri, 13 Mar 2026 10:07:48 +0000</pubDate><link>https://news.ycombinator.com/item?id=47362478</link><dc:creator>mesahm</dc:creator><comments>https://news.ycombinator.com/item?id=47362478</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47362478</guid></item><item><title><![CDATA[New comment by mesahm in "Show HN: I forked Python's Requests to add HTTP/3, async, and multiplexing"]]></title><description><![CDATA[
<p>Hi HN,<p>I'm the maintainer of Niquests.<p>For years, Python's Requests library was the gold standard, but it has been under feature freeze. As the web moved on, the Python ecosystem fractured: we got aiohttp (async only) and httpx (great, but currently struggles in high throughput scenarii for years with no visible solution merged so far).<p>I wanted the beautiful, ergonomic API of requests, but I wanted it to speak the modern web and solve most seen struggles around HTTP consumption. So I built Niquests as a drop-in replacement, you can literally do import niquests as requests. I didn't want to reinvent the wheel, I wanted to start on solid ground. Requests and urllib3 are both rock solid, so this was the starting point, learning from them and extend them for the modern web.<p>Under the hood, it's a different beast. I've added:<p>* HTTP/2 & HTTP/3 over QUIC out of the box
* Multiplexing and full thread/task safety (fixed the old concurrency bottlenecks over thousands of TCP connections)
* OS trust store support by default (no more certifi issues)
* Both sync and async support (in one library)
* Deep DNS control (DoH, DoQ, DoT, DNSSEC), "Happy Eyeballs" for fast connects
* Integrated WebSocket extension over HTTP/1, HTTP/2, and HTTP/3
* Works in WASM (Pyodide), and compatible with ASGI/WSGI apps
* And much more(...)<p>Here’s a real-world benchmark: Niquests completes a 1000-request multiplexed workload in 0.55s, compared to httpx (2.08s) and aiohttp (1.35s). See <a href="https://gist.github.com/Ousret/9e99b07e66eec48ccea5811775ec116d" rel="nofollow">https://gist.github.com/Ousret/9e99b07e66eec48ccea5811775ec1...</a> to verify yourself. And yes it does scale as long as your server can take it.<p>I've worked hard to make this the most advanced Python HTTP client. without losing the simplicity and readability we love from requests.<p>Would love feedback, technical questions (especially around HTTP/2+ and multiplexing!), or discussion about the state of Python HTTP clients.</p>
]]></description><pubDate>Fri, 13 Mar 2026 10:06:04 +0000</pubDate><link>https://news.ycombinator.com/item?id=47362465</link><dc:creator>mesahm</dc:creator><comments>https://news.ycombinator.com/item?id=47362465</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47362465</guid></item><item><title><![CDATA[Show HN: I forked Python's Requests to add HTTP/3, async, and multiplexing]]></title><description><![CDATA[
<p>Article URL: <a href="https://github.com/jawah/niquests/tree/v3.18.2">https://github.com/jawah/niquests/tree/v3.18.2</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=47362442">https://news.ycombinator.com/item?id=47362442</a></p>
<p>Points: 5</p>
<p># Comments: 2</p>
]]></description><pubDate>Fri, 13 Mar 2026 10:02:05 +0000</pubDate><link>https://github.com/jawah/niquests/tree/v3.18.2</link><dc:creator>mesahm</dc:creator><comments>https://news.ycombinator.com/item?id=47362442</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47362442</guid></item></channel></rss>