Corgi:打印 HTTP 请求

2023-07-07, 星期五, 17:05

MAKEGolang

你可以访问 Corgi - GitHub 获取源代码和预编译的二进制文件。

$ ./corgi -h
usage: corgi [-h|--help] [-p|--port <integer>] [--max-printable-size <integer>]
             [--pretty] [--fetch "<value>"]

             Corgi HTTP Request Logger, version 1.1.0

Arguments:

  -h  --help                Print help information
  -p  --port                监听指定端口. Default: 8000
      --max-printable-size  请求体最大打印长度(0
                            表示不截断),JSON 和 URLEncoded
                            表单不受影响). Default: 256
      --pretty              特定类型请求体输出美化
      --fetch               转发请求到指定地址

调试在线 HTTP Endpoint 可能需要为运行中的服务添加日志追踪点,重新打包和部署应用。Corgi 可以通过代理接口在不修改代码的情况下展示请求信息。

可能有一些同学已经用过这个 Z shell 函数了,函数会打印指定端口收到的 HTTP 请求并返回 200 OK,在调试时非常有用。缺点大概是还没用 Bash 重写,而且无限循环的退出机制也没有认真研究过)。Corgi 是这个想法的扩充。

listen_port () {
	while true
	do
		{
			echo -e 'HTTP/1.1 200 OK\r\n'
		} | nc -l -v $1
		echo '\r\n'
	done
}

Corgi 可以美化输出 application/jsonapplication/x-www-form-urlencoded 类型的请求体,后者会按行列出键值对,其中的值会被 URL 解码。

$ ./corgi -p 8000 --pretty

2023/07/06 16:27:32 corgi is waiting on :8000
2023/07/06 16:27:38 POST /proxy?url=/iot/alipayApi/faceAuth/getAlipayUserInfo HTTP/1.1
RemoteAddr: [::1]:57382
Host: localhost:8000
cookie: Cookie_1=value
authorization: Bearer Igp5d444444444444444
user-agent: PostmanRuntime/7.32.3
accept: */*
accept-encoding: gzip, deflate, br
content-type: application/x-www-form-urlencoded
content-length: 98
postman-token: 9a00e0be-f921-4605-b2f3-b577c1e263c2
connection: keep-alive

payload={"username":"admin","password":"wecsnuigb43j@_f"}
method=PATCH

Corgi 可以把请求转发到目标地址,并且将目标地址的响应返回给客户端:

$ ./corgi -p 8000 --fetch localhost:8001 --pretty

2023/07/07 16:37:40 POST /proxy?url=/iot/alipayApi/faceAuth/getAlipayUserInfo HTTP/1.1
> RemoteAddr: [::1]:59214
> Host: localhost:8000
> user-agent: PostmanRuntime/7.32.3
> content-type: application/x-www-form-urlencoded
> cookie: Cookie_1=value
> content-length: 98
> authorization: Bearer Igp5d444444444444444
> accept: */*
> postman-token: 5dfc18b4-5902-4a15-94f5-53b23db764e7
> accept-encoding: gzip, deflate, br
> connection: keep-alive
> 
> payload={"username":"admin","password":"wecsnuigb43j@_f"}
> method=PATCH

2023/07/07 16:37:40 HTTP/1.1 200 200 OK
< date: Fri, 07 Jul 2023 08:37:40 GMT
< content-length: 9
< content-type: text/plain; charset=utf-8
< 
< woof woof