dongtan9253 2018-10-31 11:31
浏览 233

GoLang代理http.request POST参数

I have written a simple http proxy in Go and need to read values of an HTTP POST sent parameters.

I have called request.ParseForm() in the application before create the reverse proxy and I got these parameteres but my reverse proxy stopped work. When I call request.ParseForm() after reverse proxy I get empty values.

error in go:

2018/10/31 12:26:45 http: panic serving [::1]:49967: runtime error: invalid 
memory address or nil pointer dereference
goroutine 51 [running]:
net/http.(*conn).serve.func1(0xc0001c2000)
    C:/Go/src/net/http/server.go:1746 +0xd7
panic(0x7ae340, 0xb00ba0)
    C:/Go/src/runtime/panic.go:513 +0x1c7
main.(*myTransport).RoundTrip(0xb2bb10, 0xc000140400, 0xf, 0xc0000ec301, 0x3)

error in chrome: ERR_EMPTY_RESPONSE

func serveReverseProxy(target string, res http.ResponseWriter, req *http.Request) {

    if req.Method == "POST" {

        // req.ParseForm() here broke the reverse proxy but I get value of HTTP POST Param
        req.ParseForm()
        value := req.Form.Get("url")
        fmt.Println(value)

        // parse the url
        url, _ := url.Parse(target)

        // create the reverse proxy
        proxy := httputil.NewSingleHostReverseProxy(url)

        // Update the headers to allow for SSL redirection
        req.URL.Path = url.Path
        req.URL.Host = url.Host
        req.URL.Scheme = url.Scheme
        req.Header.Set("X-Forwarded-Host", req.Header.Get("Host"))
        req.Host = url.Host


        proxy.Transport = &myTransport{}
        proxy.ServeHTTP(res, req)

        // if I use req.ParseForm() here the reverse proxy works good but I get empty value of HTTP POST param
        req.ParseForm()
        value := req.Form.Get("url")
        fmt.Println(value)

        if(ableToSaveInDB){
            handleInsert(res,req, value)
        }
    }
}


func (t *myTransport) RoundTrip(request *http.Request) (*http.Response, error) {

    response, err := http.DefaultTransport.RoundTrip(request)

    if(response.StatusCode == 200) {
        ableToSaveInDB = true
    }

    return response, err
}
  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 R语言Rstudio突然无法启动
    • ¥15 关于#matlab#的问题:提取2个图像的变量作为另外一个图像像元的移动量,计算新的位置创建新的图像并提取第二个图像的变量到新的图像
    • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
    • ¥15 用windows做服务的同志有吗
    • ¥60 求一个简单的网页(标签-安全|关键词-上传)
    • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
    • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
    • ¥100 为什么这个恒流源电路不能恒流?
    • ¥15 有偿求跨组件数据流路径图
    • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值