2016-08-16 465 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

也使用一些日誌記錄來確定什麼是錯的。