登录
首页 >  Golang >  Go问答

http.Request.Clone()不会进行深层复制?

来源:stackoverflow

时间:2024-02-28 13:03:24 156浏览 收藏

最近发现不少小伙伴都对Golang很感兴趣,所以今天继续给大家介绍Golang相关的知识,本文《http.Request.Clone()不会进行深层复制?》主要内容涉及到等等知识点,希望能帮到你!当然如果阅读本文时存在不同想法,可以在评论中表达,但是请勿使用过激的措辞~

问题内容

我想要获取一个请求,并使用 parseform 检查一些数据,然后将相同的数据发送给代理,如果我这样做,我们就会遇到问题

这样的错误日志

2020/05/26 15:34:47 http:代理错误:net/http:http/1.x 传输连接损坏:http:contentlength=32,正文长度为 0

所以我终于想通了,parseform()很好地关闭了request.body

这是工作代理代码

url, _ := url.parse(config.getgamehost())

    proxy := httputil.newsinglehostreverseproxy(url)
    r.url.host = url.host
    r.url.scheme = url.scheme
    r.header.set("x-forwarded-host", r.header.get("host"))
    r.host = url.host
    proxy.servehttp(w, r)

所以,我想我也需要克隆深度克隆请求来获取我的数据并发送原始请求代理 我也编辑我的代码

nr := r.clone(r.context())
nr.parseform()

url, _ := url.parse(config.getgamehost())

proxy := httputil.newsinglehostreverseproxy(url)

r.url.host = url.host
r.url.scheme = url.scheme
r.header.set("x-forwarded-host", r.header.get("host"))
r.host = url.host

proxy.servehttp(w, r)

错误日志再次显示

2020/05/26 15:49:29 http:代理错误:net/http:http/1.x 传输连接损坏:http:contentlength=32,正文长度为 0

clone() 不是深度克隆还是我做错了?

------------这项工作------------

body, err := ioutil.ReadAll(r.Body)
if err != nil {
    // ...
}
url, _ := url.Parse(config.GetGameHost())

r2 := r.Clone(r.Context())

r.Body = ioutil.NopCloser(bytes.NewReader(body))
r2.Body = ioutil.NopCloser(bytes.NewReader(body))

r.ParseForm()

proxy := httputil.NewSingleHostReverseProxy(url)
proxy.ServeHTTP(w, r2)

解决方案


http.request.body只能读取一次,需要复制新的body。

body,err := ioutil.ReadAll(r)
if err != nil {
    // ...
}
r2 := r.Clone(r.Context())
// clone body
r.Body = ioutil.NopCloser(bytes.NewReader(body))
r2.Body = ioutil.NopCloser(bytes.NewReader(body))

// parse r1, proxy r2
r.ParseForm()
proxy.ServerHTTP(w, r2)

body对象默认为net.conn多层封装。每次使用io.reader接口读取4kb,节省内存占用,一般在从网络读取时使用。

因此,正文只能从网络读取一次。如果您希望重复读取 body 对象,则应该全部读取、保存并使用。

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《http.Request.Clone()不会进行深层复制?》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>