Go http, send incoming http.request to an other server using client.Do

后端 未结 2 913
北荒
北荒 2020-12-28 08:42

Here my use case

We have one services \"foobar\" which has two version legacy and version_2_of_doom (both in go)

In order to ma

2条回答
  •  醉话见心
    2020-12-28 09:16

    You need to copy the values you want into a new request. Since this is very similar to what a reverse proxy does, you may want to look at what "net/http/httputil" does for ReverseProxy.

    Create a new request, and copy only the parts of the request you want to send to the next server. You will also need to read and buffer the request body if you intend to use it both places:

    func handler(w http.ResponseWriter, req *http.Request) {
        // we need to buffer the body if we want to read it here and send it
        // in the request. 
        body, err := ioutil.ReadAll(req.Body)
        if err != nil {
            http.Error(w, err.Error(), http.StatusInternalServerError)
            return
        }
    
        // you can reassign the body if you need to parse it as multipart
        req.Body = ioutil.NopCloser(bytes.NewReader(body))
    
        // create a new url from the raw RequestURI sent by the client
        url := fmt.Sprintf("%s://%s%s", proxyScheme, proxyHost, req.RequestURI)
    
        proxyReq, err := http.NewRequest(req.Method, url, bytes.NewReader(body))
    
        // We may want to filter some headers, otherwise we could just use a shallow copy
        // proxyReq.Header = req.Header
        proxyReq.Header = make(http.Header)
        for h, val := range req.Header {
            proxyReq.Header[h] = val
        }
    
        resp, err := httpClient.Do(proxyReq)
        if err != nil {
            http.Error(w, err.Error(), http.StatusBadGateway)
            return
        }
        defer resp.Body.Close()
    
        // legacy code
    }
    

提交回复
热议问题