socat实在是太好用了。
在目录里挂了一个名为gslb的文件后,成功返回了200状态码:

但实际上,它还是出现在了[E]日志里,仔细比对后,发现http.server返回的HTTP的版本号是1.0,而miio_client希望接收的协议版本号是1.1,所以直接把包丢弃了:

考虑到为此专门部署一个httpd或者用http.server模块实现一个简易的问答模型实在没必要,我干脆用socat转发stdout来模拟一次回包。
写一个简易脚本向stdout输出固定格式的http报文:

敲下socat -v TCP-LISTEN:53000,reuseaddr,fork EXEC:./res.sh,实现监听与转发,这样,脚本就会在tcp连接建立2秒后发出报文。
(这里反复尝试了好几次,ARP的欺骗效果不太稳定,不知道是不是缓存残留,miio_client多次试图连接原本的小米云。)

socat的-v能把双方的报文输出到stderr,这里成功完成了双向通信,同时wireshark抓包正常:

dbg顺便连上去,尝试抓取该程序在真正得到200状态码的正确报文后的逻辑:

然后就是机械的下断点,跟踪。
最后可以确定的是,程序完整地走完了整个http_disconnecting部分,进入了http_resp_body_recving,最后在对v195->field_30进行状态判断时卡住,进入循环,并反复报错:tls_shake failed,即TLS握手失败,但好在它有一个if-else,如果v196变量校验失败,就会尝试用http降级接收,后续可以考虑给v196设置一个有效值,暂时绕过TLS,理清大的状态:
