mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-08-06 23:27:04 +02:00
The following config is sufficient to trace H2 exchanges between a client and a server: global lua-load "dev/h2/h2-tracer.lua" listen h2_sniffer mode tcp bind :8002 filter lua.h2-tracer #hex server s1 127.0.0.1:8003 The commented "hex" argument will also display full frames in hex (not recommended). The connections are prefixed with a 3-hex digit number in order to also support a bit of multiplexing without impacting the reading too much. The screen is split in two, with the request on the left and the response on the right. Here's an example of what it does between an haproxy backend and an haproxy frontend both in H2, when submitted a curl request for /?s=30k handled by httpterm: [001] ### req start [001] [PREFACE len=24] [001] [SETTINGS sid=0 len=24 (bytes=24)] [001] | ### res start [001] | [SETTINGS sid=0 len=18 (bytes=27)] [001] | [SETTINGS ACK sid=0 len=0 (bytes=0)] [001] [SETTINGS ACK sid=0 len=0 (bytes=56)] [001] [HEADERS EH+ES sid=1 len=47 (bytes=47)] [001] | [HEADERS EH sid=1 len=101 (bytes=15351)] [001] | [DATA sid=1 len=15126 (bytes=15241)] [001] | [DATA sid=1 len=1258 (bytes=106)] [001] | ... -106 = 1152 [001] | ... -1152 = 0 [001] [WINDOW_UPDATE sid=1 len=4 (bytes=43)] [001] [WINDOW_UPDATE sid=0 len=4 (bytes=30)] [001] [WINDOW_UPDATE sid=1 len=4 (bytes=17)] [001] [WINDOW_UPDATE sid=0 len=4 (bytes=4)] [001] | [DATA ES sid=1 len=14336 (bytes=14336)] [001] [WINDOW_UPDATE sid=0 len=4 (bytes=4)] [001] ### req end: 31080 bytes total [001] | [GOAWAY sid=0 len=8 (bytes=8)] [001] | ### res end: 31097 bytes total It deserves some improvements. For instance at the moment it does not verify the preface, any 24 bytes will work. It does not perform any protocol validation either. Detecting some issues such as out-of-sequence frames could be helpful. But it already helps as-is. |
||
---|---|---|
.. | ||
h2-tracer.lua | ||
mkhdr.sh |