V2EX eudore 的所有回复 第 1 页 / 共 9 页
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX    eudore    全部回复第 1 页 / 共 9 页
回复总数  169
1  2  3  4  5  6  7  8  9  
可以随便找一个 sql parser 的 ast node 作为定义,使用 yaml 描述 sql ast 。然后 yaml -> ast -> sql ,在 ast 还能自定义一些行为。
privoxy 单向打通 pod 和 svc 网络。
没法上 V2EX ,整美区 id 太麻烦。
37 天前
回复了 xingheng 创建的主题 程序员 Stack Overflow 声望现在还有用吗
700 点路过 近几年都没怎么登录
部署一个 privoxy 可以单向暴露 pod 和 svc network ,然后本地配置 HTTP_PROXY 指向 privoxy 端口就好了。
好多基础语法都不支持,玩具都称不上。
win+R 输入 mspaint
在中间件上执行 RemoveAll ,不能保证后续没有 Wrap Handler 然后再次使用了 WithContext 。
在 ParseMultipartForm 后手动执行 RemoveAll ,需要修改所有的 form 请求代码。
在 ParseMultipartForm 后启动新的 goroutine ,使用 context 到期删除,不太想使用新的 goroutine 。

对于 go http server ,如果存在使用 multipart/form-data 的请求,我们可以构造 form 请求,额外添加一个 32MB 的 file ;如果这个服务端使用了 WithContext 但是没有 limitBody ,我们爆掉他的服务端的 tmpdir 。


不想了,等 go 团队先处理。 https://github.com/golang/go/issues/74455
没想好,怎么都不完美,大致思路。

方法 1:WithContext post 执行 MultipartForm 同步,执行一次 WithContext 后未传递就将导致无效,包含第三方传递逻辑。
方法 2:在 ParseMultipartForm 后手动执行 RemoveAll ,所有 form 请求方法都需要执行,不仅仅是上传,防止其他 form 请求被攻击爆磁盘。
方法 3:在 HandlerFunc 之后执行一次 RemoveAll ,写法比较丑陋。
方法 4:BodyLimt 和 maxMemory 避免使用临时文件,BodyLimt 可能被不靠谱的原因调大,maxMemory 过大影响内存使用。
方法 5:框架层实现自定义清理。
多思考了一下,我选择方法 2 在使用 form file 后手动释放临时文件,本身是一个低频率功能,在 HandlerFunc 里面同时完成 Parse 和 RemoveAll ;而不是在 WithContext 时添加额外操作。

可能在 finshReq 执行 RemoveAll 就不是一个好的方法。

```go
func main() {
router := gin.Default()
router.Use(func(c *gin.Context) {
rr := c.Request
c.Request = c.Request.WithContext(c.Request.Context())
c.Next()

fmt.Println(rr.MultipartForm)
fmt.Println(c.Request.MultipartForm)
// fix 1
if rr.MultipartForm != c.Request.MultipartForm {
rr.MultipartForm = c.Request.MultipartForm
}
})
router.POST("/upload", func(c *gin.Context) {
c.Request.ParseMultipartForm(1<<10)
})
router.Run()
}
func main() {
router := gin.Default()
router.Use(func(c *gin.Context) {
c.Request = c.Request.WithContext(c.Request.Context())
})
router.POST("/upload", func(c *gin.Context) {
c.Request.ParseMultipartForm(1<<10)
// fix 2
c.Requset.MultipartForm.RemoveAll()
c.Requset.MultipartForm.File = nil
})
router.Run()
}
```
@zihuyishi
WithContext 后新旧两个 req 的 MultipartForm 值为 nil 不是 ptr ,旧 req 不包含新 req 初始化后 ptr ,旧 req 在 finshreq 的时没有执行清理。
属于 nethttp 缺陷,没有好的方法直接修正。

修复:将新旧 req 的 MultipartForm 值同步。

```go
router.Use(func(c *gin.Context) {
rr := c.Request
ctx := c.Request.Context()
c.Request = c.Request.WithContext(ctx
c.Next()

fmt.Println(rr.MultipartForm)
fmt.Println(c.Request.MultipartForm)
if (rr.MultipartForm == nil) != (c.Request.MultipartForm == nil) {
rr.MultipartForm = c.Request.MultipartForm
}
})
```
1 、不用 form 格式,嫌弃数据格式麻烦,直接使用 octet-stream iocopy 写入文件。
2 、WithContext 方法比 Clone 更好,一些标准库修改 context 就是使用的 WithContext 方法。
3 、应该是你使用了什么奇奇怪怪的东西,正常情况下在 HandlerFunc 之前不会去解析 body ,建议删除内容和使用 nethttp 差异测试。
4 、无法复现不是问题。
为什么页面在加载之后还会加载 js ?不应该首次加载后加载所有 js 吗? 在更新瞬间访问导致版本不一样可以忽略,可以让 404 返回一段 js 去刷新页面。
315 天前
回复了 caola 创建的主题 Go 编程语言 怎么把全局共享修改为并发的
每次请求创建一次 proxyInfo 副本就好了,可以运行加上-race 参数测试并发问题。

或者把这些参数通过 newProxy 函数传递过去也行。

```go
func proxyRequestHandler() http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
pi := &proxyInfo{}
//不是 https 的请求
if r.TLS == nil {
_, err := pi.getHostConf(getHostName(r.Host))
if err != nil {
w.WriteHeader( http.StatusBadRequest)
w.Write([]byte(err.Error()))
return
}
}

pi.requestPath = r.URL.Path
pi.requestRawQuery = r.URL.RawQuery

requestHeader := make(map[string]string)
requestHeader["Referer"] = pi.targetUrl
requestHeader["User-Agent"] = r.Header.Get("User-Agent")
requestHeader["Accept"] = r.Header.Get("Accept")
pi.requestHeader = requestHeader

//反代
proxy, err := pi.newProxy()
if err != nil {
panic(err)
}

proxy.ServeHTTP(w, r)
}
}
```
我放 github 的 go 项目,按照单元测试报告一行行改就好了; go 没有 catry 不考虑,只要不是多进程功能基本都可以覆盖到。

在覆盖过程中,一些表达式错误和逻辑不可达都可以发现,简单错误都可以排除,剩下一般都是非代码逻辑错误。
2023-10-17 20:41:09 +08:00
回复了 sidewalkerLin 创建的主题 Kubernetes 求一份 k8s 运维工程师的日常工作的简历
k8s 运维的日常就是摸鱼等下班,完成生态建设后就没啥事了。
设置 node 亲和性指定 node1node2 ,优先调度到这两个机器上;设置 pod 反亲和性时同一个 deploy 的 pod 调度到不同的 node 上;在机器数量充足且 node12 在线时,就可以优先选择 node12 ,然后再被反亲分别放到两个 node 上;如果 node 数量不足或 node12 存在下线时会优先 1 个或 2 个 pod(两个亲和规则权重影响)在 node12 ,然后在分配到其他 node 或在同一个 node 上。
2023-09-04 13:40:07 +08:00
回复了 inSpring 创建的主题 程序员 求推荐低代码平台?
今天看到的: 《亚马逊终止低代码 Honeycode 服务》

https://www.infoq.cn/news/cJgNCmuqrkgdeXbj0aKe
2023-09-02 08:39:35 +08:00
回复了 guonaihong 创建的主题 Go 编程语言 高性能 websocket 库 quickws 发布
@guonaihong go get -v -u 已正常

一段 action 修改建议,使用 matrix 区分 arch ,另外 race 和 cover 可以一起测试,但是 covermode 有个值不支持。

```yaml
strategy:
max-parallel: 2
matrix:
go: [ '1.20']
arch: [amd64, 386]
name: Go-${{ matrix.go }} ${{ matrix.arch }}
env:
GOARCH: ${{ matrix.arch }}
steps:
- name: Run Tests
run: go test -v -timeout=1m -race -cover -coverprofile=coverage.out ./...
```
2023-09-01 19:46:45 +08:00回复了 guonaihong 创建的主题 Go 编程语言 高性能 websocket 库 quickws 发布
稍微看了一下单元测试覆盖也就 66%,跑一下`go get -v github.com/antlabs/quickws ;CGO_ENABLED=1 go test -v -race github.com/antlabs/quickws`出现直接失败,堆栈太长 v2 粘不全。

```bash
[root@node1 tmp]# CGO_ENABLED=1 go test -v -race github.com/antlabs/quickws
=== RUN Test_DefaultCallback
=== RUN Test_DefaultCallback/local:_default_callback
fatal error: checkptr: pointer arithmetic result points to invalid allocation

goroutine 22 [running]:
runtime.throw({0x969273?, 0xc0001162d8?})
/usr/local/go1.20/src/runtime/panic.go:1047 +0x5d fp=0xc000093480 sp=0xc000093450 pc=0x46e7fd
runtime.checkptrArithmetic(0x930ae0?, {0x0, 0x0, 0x952406?})
/usr/local/go1.20/src/runtime/checkptr.go:69 +0xaa fp=0xc0000934b0 sp=0xc000093480 pc=0x43e68a
github.com/antlabs/wsutil/rsp.ClearRsp({0x9ff570?, 0xc0001162a0})
/root/go/src/github.com/antlabs/wsutil/rsp/rsp.go:19 +0x249 fp=0xc000093548 sp=0xc0000934b0 pc=0x86cb09
github.com/antlabs/quickws.upgradeInner({0x9ff570, 0xc0001162a0}, 0xc00011a500, 0xc0000803c0)
/root/go/src/github.com/antlabs/quickws/upgrade.go:76 +0x17a fp=0xc000093770 sp=0xc000093548 pc=0x87b4da
github.com/antlabs/quickws.Upgrade({0x9ff570, 0xc0001162a0}, 0x7fb16e226818?, {0xc0000938a0, 0x1, 0x0?})
/root/go/src/github.com/antlabs/quickws/upgrade.go:53 +0x225 fp=0xc0000937d8 sp=0xc000093770 pc=0x87b2e5
github.com/antlabs/quickws.Test_DefaultCallback.func1.1({0x9ff570, 0xc0001162a0}, 0x4a8297?)
/root/go/src/github.com/antlabs/quickws/callback_test.go:34 +0xfd fp=0xc0000938f8 sp=0xc0000937d8 pc=0x8b7d3d
net/http.HandlerFunc.ServeHTTP(0xc0000cc120, {0x9ff570, 0xc0001162a0}, 0x1?)
/usr/local/go1.20/src/net/http/server.go:2122 +0x4e fp=0xc000093928 sp=0xc0000938f8 pc=0x829fee
net/http.serverHandler.ServeHTTP({0xc00009f050?}, {0x9ff570, 0xc0001162a0}, 0xc00011a500)
/usr/local/go1.20/src/net/http/server.go:2936 +0x683 fp=0xc000093a50 sp=0xc000093928 pc=0x82d8a3
net/http.(*conn).serve(0xc0001321b0, {0x9ff960, 0xc00009ef30})
/usr/local/go1.20/src/net/http/server.go:1995 +0xbd5 fp=0xc000093fa0 sp=0xc000093a50 pc=0x8283f5
net/http.(*Server).Serve.func3()
/usr/local/go1.20/src/net/http/server.go:3089 +0x59 fp=0xc000093fe0 sp=0xc000093fa0 pc=0x82e559
runtime.goexit()
/usr/local/go1.20/src/runtime/asm_amd64.s:1598 +0x1 fp=0xc000093fe8 sp=0xc000093fe0 pc=0x4a5221
created by net/http.(*Server).Serve
/usr/local/go1.20/src/net/http/server.go:3089 +0x818
```
1  2  3  4  5  6  7  8  9  
关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2673 人在线   最高记录 6679       Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 28ms UTC 14:47 PVG 22:47 LAX 07:47 JFK 10:47
Do have faith in what you're doing.
ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86