HTTP-verzoeken ontleden direct in de terminal met httptap
Wanneer een externe service of interne microservice plotseling begint te haperen, grijp je vanzelf naar goed oud curl. Maar standaard curl geeft alleen de response body output, en om connection phase timings te extraheren, moet je een monsterlijk template bouwen met een dozijn variabelen via de -w flag. Of je opent een browser, gaat naar het Network tab in DevTools, en bewondert de mooie waterfall daar. Op de console van een remote server kun je geen browser openen, en graven door ruwe output is een浩劫.
Ik stuitte onlangs op httptap. Het is een handig Python-tool dat elk HTTP-verzoek opsplitst in zijn component fasen: DNS, TCP handshake, TLS-onderhandeling, time to first byte (TTFB), en response body transfer. Dit alles wordt weergegeven als een duidelijke waterfall-grafiek rechtstreeks in de console.
Wat er onder de motorkap zit en waarom je het nodig hebt
De tool is gebouwd in Python met httpx, httpcore, dnspython, en de Rich library voor het renderen van de interface. Het meet niet alleen de totale response tijd—het hookt in op network stack tracing en toont exact in welk stadium een verzoek vastliep.

Als je ooit het httpstat project hebt gebruikt, voelt het idee bekend. Maar httptap heeft verschillende belangrijke verschillen:
- Het kan redirect chains tracken en de timing van elke stap apart meten, met een samenvattings tabel.
- Ondersteunt latency budget (SLO) checks met human-readable exit codes.
- Inspecteert TLS certificaten: rapporteert hostname (CN), cipher algoritme, protocol versie, en dagen tot expiratie.
- Exporteert gedetailleerde gestructureerde JSON met alle metrics voor automatisering.
- Begrijpt curl flags (
-X,-L,-H,-k,-x), dus je hoeft je vingers niet te hertrainen.
Hoe te installeren en uit te voeren
De snelste manier om te installeren op macOS of Linux is via Homebrew:
brew install httptap
Als je Python tools verkiest, werken pip of uv:
uv pip install httptap
# или
pip install httptap
Er is ook een kant-en-klare Docker image in de GitHub Packages registry:
docker run --rm ghcr.io/ozeranskii/httptap:latest https://example.com
Basis gebruik is eenvoudig:
httptap https://httpbin.io/get
De tool zal het verzoek maken en een nette tabel outputten met timings voor elke stap, status code, en netwerk info (inclusief HTTP/2 protocol versie en IPv4/IPv6 adres familie).
Wat de tool in de praktijk kan doen
Werken met elke HTTP methodes en request bodies
De tool stuurt JSON of XML zonder problemen. Als je de --data flag doorgeeft zonder expliciet een methode op te geven, schakelt de tool automatisch over naar POST, waardoor het curl's gedrag nabootst:
httptap https://httpbin.io/post --data '{"status": "testing", "source": "httptap"}'
Als de data in een bestand staat, kun je het pad doorgeven via de @ syntax:
httptap https://httpbin.io/post --data @payload.json
Voor andere methodes is er de bekende --method flag (of -X):
httptap https://httpbin.io/put --method PUT --data '{"key": "value"}'
Redirect chains volgen
Weinig tools kunnen correct tonen hoeveel tijd een reeks 301 en 302 responses kost. Hier hoef je alleen de --follow flag (of -L) toe te voegen:
httptap --follow https://httpbin.io/redirect/2

De output bevat een gedetailleerde breakdown voor elke tussenliggende host en een finale rij met de totale tijd.
Latency budgets controleren in CI
Een van de meest nuttige features van het project is de --slo flag. Het verandert de tool in een smoke test en gate instrument voor build pipelines:
httptap --slo total=500,ttfb=200 https://api.example.com/health
Als de target service reageert met een 200 status maar TTFB groter is dan 200 milliseconden of de totale tijd over 500 milliseconden gaat, zal de tool exit code 4 retourneren. Als er een netwerkfout optreedt, retourneert het code 75 (EX_TEMPFAIL per BSD sysexits standaard).
Dankzij de code scheiding kun je een deployment script configureren om te onderscheiden tussen netwerk failures en performance degradatie:
httptap --slo total=1500,tls=200 https://staging.example.com/
case $? in
0) echo "Сервис уложился в нормативы" ;;
4) echo "Нарушен SLO по времени ответа"; exit 1 ;;
75) echo "Временный сетевой сбой, повторяем проверку" ;;
esac
Scripting en compacte output
Voor automatisering en cron jobs kan Rich's grafische output overbodig zijn. Twee modi zijn beschikbaar voor zulke scenario's:
-
Compacte lijn modus
--compactvoor logs:httptap --compact https://httpbin.io/get -
Metrics text stream
--metrics-only:httptap --metrics-only https://httpbin.io/getJe krijgt een enkele regel terug zoals:
Step 1: dns=30.1 connect=97.3 tls=199.0 ttfb=472.2 total=476.0 status=200 bytes=389 ip=44.211.11.205 family=IPv4 tls_version=TLSv1.2 proxy=direct -
JSON export via
--json out/report.json, waar timings, headers, TLS parameters, en IP adressen worden opgeslagen.
Custom resolvers en uitbreidbaarheid
Als je interne Python utilities schrijft, kan httptap als library worden gebruikt. De architectuur is gebouwd op protocols (typing.Protocol), dus componenten zijn eenvoudig te vervangen. Je kunt bijvoorbeeld de DNS resolver overschrijven om de response van een specifiek IP te testen zonder /etc/hosts te wijzigen:
from httptap import HTTPTapAnalyzer, SystemDNSResolver
class StaticDNS(SystemDNSResolver):
def resolve(self, host, port, timeout):
return "93.184.216.34", "IPv4", 0.05
analyzer = HTTPTapAnalyzer(dns_resolver=StaticDNS())
steps = analyzer.analyze_url("https://example.com")
for step in steps:
print(f"TTFB: {step.timing.ttfb_ms:.2f} ms")
De tool bleek compact, snel, en gericht op één specifieke taak. Het overbrugt netjes de kloof tussen rauw curl -w en zware grafische profilers.
De utility zal nuttig zijn voor operations engineers voor snelle diagnose van trage endpoints op servers, backend developers voor het meten van externe API latencies, en QA teams voor het controleren van SLO's rechtstreeks in pipelines. Probeer het lokaal te installeren en vervang je gebruikelijke curl -I voor een paar dagen. Het verschil in helderheid is direct merkbaar.
Gerelateerde projecten