imroc / req

Simple Go HTTP client with Black Magic
https://req.cool
MIT License
4.12k stars 334 forks source link

3.40.1bug或golang bug? #261

Closed Nyx2022 closed 10 months ago

Nyx2022 commented 10 months ago

在3.40.1中我使用SetCommonCookies给iclient设置了一些cookie,但是在我使用client.R()获取request中间件欧却得到了一堆和原来完全不一样的cookie,我跟了一下代码,应该在调用go1.20.7.windows-amd64/go/src/net/http/cookiejar/jar.go:175的地方的时候 image

其中有一个entries map,因为不方便截内容,但是我看了里面保存的值还是我使用SetCommonCookies更新之前的一些值(比如存在一个key phpsessionid),然后到了github.com/imroc/req/v3@v3.40.1/transport.go:867中的时候就会把SetCommonCookies中appen的cookies来处理,调用了AddCookie,但是AddCookie方法中的逻辑是 image 如果有coookie,就在后面添加,如果没有才set。 所以,我很好奇,为什么项目重启之后cookiejar中还会有之前残留的cookie呢,以及req在初始化的时候能把之前的残留给删掉吗?当然我自己在初始化之后重新设置一个空cookiejar应该也可以解决,这里就和作者讨论一下golang中的奇怪现象以及希望能够遭到更适当的理解或实现

imroc commented 10 months ago

为什么项目重启之后cookiejar中还会有之前残留的cookie呢

项目重启残留cookie是指什么?如果是程序重启,内存没数据了,不可能残留。

如果有coookie,就在后面添加,如果没有才set。

这个是标准库的 Request.AddCookie 实现,就是给request追加cookie(无论有没有设置Cookie头),你可以仔细看代码。

Nyx2022 commented 10 months ago

我后来发现应该是clone的问题,应该是克隆之后的cookiejar和原本的共用了一个cookiejar,导致cookie混用

imroc commented 10 months ago

我后来发现应该是clone的问题,应该是克隆之后的cookiejar和原本的共用了一个cookiejar,导致cookie混用

clone 目前是会共用 cookiejar 的,除非显式调用 client.ClearCookies,不过原则上应该新建一个cookiejar,计划下个版本clone用新建的cookiejar

Nyx2022 commented 10 months ago

OK,我先自己设置一个新的cookiajr,坐等下一版本更新。同时建议作者把不能共用的再下一个版本中都给改成独立的,谢谢