V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  eudore  ›  全部回复第 1 页 / 共 9 页
回复总数  170
1  2  3  4  5  6  7  8  9  
预发 dev->test->pre->prod
可以随便找一个 sql parser 的 ast node 作为定义,使用 yaml 描述 sql ast 。然后 yaml -> ast -> sql ,在 ast 还能自定义一些行为。
privoxy 单向打通 pod 和 svc 网络。
没法上 V2EX ,整美区 id 太麻烦。
60 天前
回复了 xingheng 创建的主题 程序员 Stack Overflow 声望现在还有用吗
700 点路过 近几年都没怎么登录
部署一个 privoxy 可以单向暴露 pod 和 svc network ,然后本地配置 HTTP_PROXY 指向 privoxy 端口就好了。
好多基础语法都不支持,玩具都称不上。
121 天前
回复了 iorilu 创建的主题 程序员 最简单的图片编辑软件是什么, 求推荐
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 去刷新页面。
339 天前
回复了 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)
}
}
```
2024-07-12 06:17:32 +08:00
回复了 solaris2022 创建的主题 React 各位是如何写单元测试的,如何保证单元测试覆盖率
我放 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 ./...
```
1  2  3  4  5  6  7  8  9  
关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   2280 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 30ms · UTC 01:45 · PVG 09:45 · LAX 18:45 · JFK 21:45
♥ Do have faith in what you're doing.