2016-08-16 462 views
0

我有这样的反向代理: Iam使用RoundTrip,但此代理服务器无法正常工作。
如何正确读取和修改响应?
和某人通过NewSingleHostReverseProxy创建代理服务器。 请帮助。golang httputil.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) 

}

回答

0

当你访问http://为最拿手的网站(例如您的habrahabr.ru)有一个重定向到https://开头,所以请求的HTTP返回的东西像301 Moved Permanently,你不会找到你要的内容。此外,正确的https后,请确保该网站不使用JavaScript来加载内容,你可以很容易地检查这个卷曲: curl localhost:3000

也使用一些日志记录来确定什么是错的。