golang httputil.NewSingleHostReverseProxy如何读取响应并修改响应?

时间:2016-08-16 07:42:44

标签: go

我是这样的反向代理: 我使用RoundTrip,但这个代理服务器无法正常工作 如何正确阅读和修改回复?
有人通过NewSingleHostReverseProxy创建代理服务器。 请帮助。

package main

import (
"bytes"
"fmt"
"io/ioutil"
"net/http"
"net/http/httputil"
"net/url"
)

type transport struct {
 http.RoundTripper
}

func (t *transport) RoundTrip(req *http.Request) (resp *http.Response, err error) {
   resp, err = t.RoundTripper.RoundTrip(req)
   if err != nil {
    return nil, err
   }

   b, err := ioutil.ReadAll(resp.Body)
   if err != nil {
    return nil, err
   }

   err = resp.Body.Close()
   if err != nil {
    return nil, err
   }

   b = bytes.Replace(b, []byte("Google"), []byte("GOOGLE"), -1)
   body := ioutil.NopCloser(bytes.NewReader(b))
   resp.Body = body
   return resp, nil
}

func sameHost(handler http.Handler) http.Handler {
 return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    r.Host = r.URL.Host
    handler.ServeHTTP(w, r)
 })
}

func main() {
  u, _ := url.Parse("http://habrahabr.ru")
  reverseProxy := httputil.NewSingleHostReverseProxy(u)
  reverseProxy.Transport = &transport{http.DefaultTransport}
  // wrap that proxy with our sameHost function
  singleHosted := sameHost(reverseProxy)
  http.ListenAndServe(":3000", singleHosted)

}

1 个答案:

答案 0 :(得分:0)

如果您要访问http://以获取大多数优秀网站(例如您的habrahabr.ru),则会重定向到https://,因此对http的请求将返回301 Moved Permanently之类的内容,您将会找不到您要找的内容。此外,在正确到https之后,请确保该网站不使用javascript加载内容,您可以通过curl轻松检查: curl localhost:3000

还可以使用一些日志来确定错误。