curl で通信の内容を見ながら詳細なデバッグをしたいとき、 tcpdump や Wireshark でパケットキャプチャを行うのが定番だと思う。ただ、通信が多い環境だと実際にデバッグしたい通信を絞り込むのが面倒だし、TLS だと暗号化されていてさらに面倒。
curl のオプションを見ると通信内容のトレースを記録できる --trace
や --trace-ascii
があり、使ってみると便利だった。
例
$ curl https://www.google.com/ [--trace-time] --trace[-ascii] trace-result.txt
これで curl が行った通信の内容が trace-result.txt に記録される。-
にすると stdout に出力される。
また、--trace-time
をつけると trace に時刻が付与され、--trace
を --trace-ascii
にすると Hex は保存されず ascii の内容のみ確認することができる。
trace の内容は以下のような感じ(一部省略している)。
== Info: Trying 2404:6800:4004:80b::2004:443... == Info: Connected to www.google.com (2404:6800:4004:80b::2004) port 443 (#0) == Info: ALPN, offering h2 == Info: ALPN, offering http/1.1 == Info: successfully set certificate verify locations: == Info: CAfile: /etc/ssl/certs/ca-certificates.crt == Info: CApath: /etc/ssl/certs => Send SSL data, 5 bytes (0x5) 0000: 16 03 01 02 00 ..... == Info: TLSv1.3 (OUT), TLS handshake, Client hello (1): => Send SSL data, 512 bytes (0x200) 0000: 01 00 01 fc 03 03 ca 7f 00 66 6c 46 6f a9 2c 8f .......^?.flFo.,. 0010: 97 83 1a b8 c7 80 50 6d 0c c8 f8 73 bc 49 90 ab ......Pm...s.I.. 0020: ec 8b bc be 4f 0d 20 a4 f1 17 e2 8c 0d 6f 61 25 ....O. ......oa% 0030: 54 d8 13 27 b6 5d e2 0d 92 de 42 9f 93 2c ce c5 T..'.]....B..,.. 0040: 50 bd 3c 75 b9 bd 86 00 3e 13 02 13 03 13 01 c0 P.<u....>....... 0050: 2c c0 30 00 9f cc a9 cc a8 cc aa c0 2b c0 2f 00 ,.0.........+./. 0060: 9e c0 24 c0 28 00 6b c0 23 c0 27 00 67 c0 0a c0 ..$.(.k.#.'.g... 0070: 14 00 39 c0 09 c0 13 00 33 00 9d 00 9c 00 3d 00 ..9.....3.....=. 0080: 3c 00 35 00 2f 00 ff 01 00 01 75 00 00 00 13 00 <.5./.....u..... 0090: 11 00 00 0e 77 77 77 2e 67 6f 6f 67 6c 65 2e 63 ....www.google.c 00a0: 6f 6d 00 0b 00 04 03 00 01 02 00 0a 00 0c 00 0a om.............. ... <= Recv SSL data, 5 bytes (0x5) 0000: 16 03 03 00 7a ....z == Info: TLSv1.3 (IN), TLS handshake, Server hello (2): <= Recv SSL data, 122 bytes (0x7a) 0000: 02 00 00 76 03 03 1d 3c 9b 52 99 6f e5 05 b7 9f ...v...<.R.o.... 0010: 2b 35 94 0e 11 bd 4f 3a de e3 b8 1d d4 16 a4 45 +5....O:.......E 0020: c4 91 13 b0 18 ef 20 a4 f1 17 e2 8c 0d 6f 61 25 ...... ......oa% ...
TLS で暗号化された内容も、元の HTTP が平文で見れるので便利。
<= Recv header, 13 bytes (0xd) 0000: 48 54 54 50 2f 32 20 32 30 30 20 0d 0a HTTP/2 200 .. <= Recv header, 37 bytes (0x25) 0000: 64 61 74 65 3a 20 54 68 75 2c 20 31 35 20 4a 75 date: Thu, 15 Ju 0010: 6e 20 32 30 32 33 20 30 32 3a 33 37 3a 34 33 20 n 2023 02:37:43 0020: 47 4d 54 0d 0a GMT.. <= Recv header, 13 bytes (0xd) 0000: 65 78 70 69 72 65 73 3a 20 2d 31 0d 0a expires: -1.. <= Recv header, 35 bytes (0x23) 0000: 63 61 63 68 65 2d 63 6f 6e 74 72 6f 6c 3a 20 70 cache-control: p 0010: 72 69 76 61 74 65 2c 20 6d 61 78 2d 61 67 65 3d rivate, max-age= 0020: 30 0d 0a 0.. <= Recv header, 45 bytes (0x2d) 0000: 63 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20 74 65 content-type: te 0010: 78 74 2f 68 74 6d 6c 3b 20 63 68 61 72 73 65 74 xt/html; charset 0020: 3d 49 53 4f 2d 38 38 35 39 2d 31 0d 0a =ISO-8859-1.. <= Recv header, 245 bytes (0xf5) 0000: 63 6f 6e 74 65 6e 74 2d 73 65 63 75 72 69 74 79 content-security 0010: 2d 70 6f 6c 69 63 79 2d 72 65 70 6f 72 74 2d 6f -policy-report-o ...