Я сделал следующие 2 изменения, чтобы заставить его работать:
Во-первых, укажите прокси на www.cnn.com
вместо www.cnn.com/favicon.ico
. Конечно, теперь мы должны сделать наш запрос на localhost:9090/favicon.ico
.
Затем установите поле Host
запроса прокси для целевого хоста, а не для хоста прокси, который является localhost
.
Код выглядит примерно так:
package main
import (
"log"
"net/http"
"net/http/httputil"
"net/url"
)
type Director func(*http.Request)
func (f Director) Then(g Director) Director {
return func(req *http.Request) {
f(req)
g(req)
}
}
func hostDirector(host string) Director {
return func(req *http.Request) {
req.Host = host
}
}
func main() {
url, _ := url.Parse("http://www.cnn.com")
proxy := httputil.NewSingleHostReverseProxy(url)
d := proxy.Director
// sequence the default director with our host director
proxy.Director = Director(d).Then(hostDirector(url.Hostname()))
http.Handle("/", proxy)
log.Fatal(http.ListenAndServe(":9090", nil))
}