package main
import (
"fmt"
"io"
"net"
"net/http"
"strings"
)
// Pxy ServerHTTP方法绑定的对象
type Pxy struct{
}
// ServerHTTP 实现http.Handler接口中的方法
func (p *Pxy) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
fmt.Printf(`Received request {"Method":"%s","Host":"%s","RemoteAddr":"%s"}`, req.Method, req.Host, req.RemoteAddr)
fmt.Println()
//1. 复制请求, 修改头部信息
pxyReq := new(http.Request)
*pxyReq = *req
if clientIP, _, err := net.SplitHostPort(pxyReq.RemoteAddr); err == nil {
if prior, ok := pxyReq.Header["X-Forwarded-For"]; ok {
clientIP = strings.Join(prior, ", ") + ", " + clientIP
}
pxyReq.Header.Set("X-Forwarded-For", clientIP)
}
//2. 请求目的机器
transport := http.DefaultTransport
res, err := transport.RoundTrip(pxyReq)
if err != nil {
rw.WriteHeader(http.StatusBadGateway)
return
}
//3. 回写客户端
for key, values := range res.Header {
for _, v := range values {
rw.Header().Add(key, v)
}
}
rw.WriteHeader(res.StatusCode)
io.Copy(rw, res.Body)
res.Body.Close()
}
func main() {
http.Handle("/", &Pxy{
})
http.ListenAndServe(":8080", nil)
}
Go实现简单的客户端代理
猜你喜欢
转载自blog.csdn.net/qq_38900565/article/details/107576558
今日推荐
周排行