我也写了一个堪称愚蠢的小工具(用来打印接收到的 HTTP 请求)

168 天前
 amet

受到 我写了一个堪称愚蠢的小工具 鼓舞,遂决定把 23 年写的一个工具发出来,ddrpa/corgi 可以用来打印收到的 HTTP 请求。

这个工具本质上是对下面这段脚本的扩展:

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

支持的功能有:

$ ./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               转发请求到指定地址

对接调试接口时,可以在代码有错误(或一行代码都没写)的情况下知道对方发送了什么。

效果演示(监听 8000 端口,打印收到的 HTTP 请求):

$ ./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

为什么说这个工具很愚蠢,因为:

  1. 双方把对接文档写清楚,或使用 Swagger 之类的工具的话,就不需要这样调试了;
  2. 我发现有的项目都进预发布环节了,才发现对接有误。因此这个工具是 Golang 编写的,方便直接从 GitHub Release 页面下载二进制文件到预发布环境;

要是您觉得这个小工具愚蠢的比较清澈的话,我还有一堆

2991 次点击
所在节点    程序员
23 条回复
zapper
168 天前
赶早不如赶巧,刚好要用到,喂到嘴边了
Anakin078
168 天前
nc -lvvp 8000
adrianzhang
168 天前
请把你的愚蠢小工具都放出来看看。
lizhisty
168 天前
@Anakin078 root@VM-12-17-debian:~/LycheeServer/deploy/docker-compose# nc -lvvp 9999
retrying local 0.0.0.0:9999 : Address already in use
retrying local 0.0.0.0:9999 : Address already in use
retrying local 0.0.0.0:9999 : Address already in use


老哥,这个命令似乎不行啊
shuxhan
168 天前
挺有意思的
amet
168 天前
@adrianzhang 你好,帖子中的[“一堆”]( https://yufanonsoftware.me/make) 是一个超链接。不过我觉得这些工具里最蠢的莫过于 [ddrpa/chainsaw]( https://github.com/ddrpa/chainsaw),是用来解决 `nohup *** > app.log 2>&1 &` 问题的。
amet
168 天前
@Anakin078 我一开始也是用的 netcat ,不过后面希望做到一种“中间人”的效果,即这个请求能被打印出来,同时还能继续被发送到原本的目的地去。顺便还做了点输出结果美化的工作。
amet
168 天前
@lizhisty 看起来像是 9999 端口已经被原程序占用了?你可以让 netcat 换一个监听端口,然后,如果使用 NGINX 的话,可以使用 location 配合 proxy_pass 让请求被转发到 netcat 那里去。
lsk569937453
168 天前
https://github.com/lsk569937453/local-echo-server 。花了一个小时撸了一个 rust 版本的,欢迎大家使用。
adrianzhang
168 天前
@amet 都挺好玩的小玩意。顺带提一嘴,日志处理的实践,基本上都是传专门的日志服务器,很少会在本地生成几个 GB 的日志。你这个工具适用于不规范的 dev 环境,stg&prod 中没有使用场景。如果发现你这个工具有很多人经常用,那说明出了大问题。
adrianzhang
168 天前
@lsk569937453 卷的起飞
catsoul
167 天前
说实话我就喜欢这些 simple stupid tools ( simple stupid 是说用 tool 的人)
abolast
167 天前
看起来 op 也是运维
amet
167 天前
@adrianzhang 还有广大的软件开发市场是由中小规模的公司瓜分的,这些公司承接的项目(甚至包括我见过的一些重要的城市基础设施),如果从最佳实践的角度来看(只是看了点 HN 、Thoughtworks 什么的,不敢妄言),确实是十分惊险的。做到那些(不管是日志还是其他)需要:

1. 项目达到一定规模,时间和金钱能够覆盖这样做的成本
2. 业主、项目负责人等能够理解这样做的意图
3. 开发人员认识到这样做的必要性

还有些其他什么七七八八的原因,只能说这条路还有些漫长。

我不能阻止人们把灯泡放进嘴巴里,但是可以做个方便把灯泡取出来的工具(这个比喻有点不恰当,但也差不多意思了)。

好在从我目前的处境来看,2 和 3 多少是比较可行的,所以我也在 README.md 里说了,看到谁再“整活”就“揍”他。
adrianzhang
167 天前
@amet 不,并不是这样。日志集中分析处理是互联网标配,证据就是 ELK 等工具的流行,另一个逻辑证据是,应用的日志分析是版本升级等功能的基础,也是商业分析基础数据。所以,除非是特别不正经的网络公司(不靠互联网用户挣钱的公司),都应该实行日志集中处理与分析。
Jeremial
167 天前
可以看看 traefik/whoami 这个, docker 部署很方便.
还支持各种选项
ZColin
167 天前
好用爱用 多来点
amet
167 天前
@adrianzhang 感谢你的回复,不过我的论点基于「广大的软件开发市场」而不是「互联网产品」。

社交 APP 是软件,负责收取停车费用的也是软件,监测传感器群的也是软件,后者一般不需要各种分析来决定下一步怎么走,它们最主要目的是记录和重建已经发生的问题,避免重蹈覆辙。

如果你建设一个日志服务平台或采购云服务,用户(业主)就会问「为什么我的数据要传输到互联网上/通过互联网发送到你这里?」。如果你为每个软件项目创建自己的,比如 ELK 这样经典而又基础的服务,也许会发现相比于要解决的问题,有时它们占用了太多的资源。
adrianzhang
167 天前
@amet 我不明白你为什么一定觉得我不知道离线软件和在线软件。你非要证明你的软件有用武之地前景广阔??
adrianzhang
167 天前
@amet 你告诉我有多少离线软件市场需要处理本地几个 GB 的日志?占离线软件绝对份额的低功耗设备本身存储容量就不大。其他都是在线软件的天下,而且智能化趋势都看懂了,未来完全离线的市场只会越来越小。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1054921

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX