Golang proxy http.request параметры post

Я написал простой HTTP-прокси на Go, и мне нужно прочитать значения параметров, отправленных HTTP POST.

Я вызвал request.ParseForm () в приложении перед созданием обратного прокси, и я получил эти параметры, но мой обратный прокси перестал работать. Когда я вызываю request.ParseForm () после обратного прокси, я получаю пустые значения.

ошибка в ходу:

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)

ошибка в хроме: 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
}

У меня тут вопрос. То есть инструкция req.ParseForm() вызывается дважды?

novalagung 31.10.2018 14:25

нет, только один раз, но я хотел показать места, где я пытаюсь назвать это утверждение.

Kamil 31.10.2018 14:38

Местоположение ошибки в трассировке стека, похоже, не связано с этой функцией. Можете показать, как настроить обратный прокси?

Arash 31.10.2018 15:17

Это все настройки обратного прокси. Я использую другую функцию только для передачи цели в func serveReverseProxy. Я думаю, что проблема связана с ParseForm (), потому что если я использую его до proxy.ServeHTTP (res, req), он генерирует эту ошибку, когда я не использую его, все работает хорошо, и если я использую ParseForm () после proxy.ServeHTTP ( res, req) или с defer - прокси работает, но я получаю пустое значение POST-запроса с заданными параметрами.

Kamil 09.11.2018 18:53
0
4
1 046
0

Другие вопросы по теме