← Alle artikelen

Ontwikkelaars · 2 min

Lees de SQL op de draad met Caddy en mitmproxy

Je backend bouwt SQL uit de filters van de gebruiker. Stuur de Postgres-verbinding tijdens het draaien via mitmproxy met @viaalink/caddy-api-client, lees de echte query en zet de route terug. Er wordt niets herstart.

  • caddy
  • mitmproxy
  • postgres
  • sql
  • debugging
  • developer-tools

TL;DR: De SQL die je app verstuurt, bestaat alleen op het moment dat hij draait. @viaalink/caddy-api-client kan één Postgres-verbinding via mitmproxy sturen en weer terugzetten terwijl Caddy blijft draaien. De decoder laat de query zien, de parameters, de rijen en de fouten. Bekijk de uitleg op YouTube (2:38).


De query die niemand schreef

Een backend bouwt zijn SQL uit wat de gebruiker kiest: filters, categorieën, een sorteervolgorde. De code laat de onderdelen zien. Hij laat niet het statement zien dat bij de database aankomt.

Het querylogboek van de database zou dat wel tonen, maar het staat vaak uit, is op een beheerde database niet bereikbaar en mengt de queries van alle clients. Je wilt de statements van één verbinding, zoals ze verstuurd zijn.

Zet de proxy in het pad

Caddy kan ruwe TCP-verkeer routeren met zijn layer 4-app (caddy-l4). De client wisselt die ene route tijdens het draaien via mitmproxy en weer terug, zonder herstart. Caddy blijft draaien en alleen de Postgres-route verandert.

mitmproxy vangt de bytes op. De Postgres-decoder die bij de bibliotheek hoort, zet ze om in de SQL, de parameters, de rijen en de fouten. Hij verbergt ook wachtwoorden, dus het logboek dat je bewaart bevat ze niet.

Wat de demo op de draad vindt

De uitleg draait een productzoekopdracht met een echte Playwright-opname. Twee bugs komen alleen naar boven als je het verkeer leest:

  • Een categorie die niets vindt. De app stuurt electronics, terwijl de data Electronics heeft. De query geeft nul rijen en geen fout, dus de pagina lijkt leeg.
  • Sorteren op een kolom die niet bestaat. Kiezen voor “Sort by Rating” stuurt een query op rating. De app zegt alleen “something went wrong”. Postgres zegt precies wat er mis is: column "rating" does not exist.

Geen van beide bugs zit in de code die je als eerste leest. Beide zijn meteen duidelijk in het statement.

Hoe het zich verhoudt tot ngrok

ngrok heeft TCP-verbindingsinspectie toegevoegd die verbindingsgegevens toont. Onze invalshoek is anders: je leest de SQL binnen de verbinding, lokaal, op je eigen machine, tegen je eigen Caddy.

Aan de slag

De uitleg gebruikt een AI-stemkloon van Kelvins stem. De schermopname is echt: een Playwright-run tegen de productzoekopdracht.

Contact

Een onderwerp voor ons?

Schrijf ons.