正向代理是客户端与正向代理客户端在同一局域网,客户端发出请求,正向代理 替代客户端向服务器发出请求。服务器不知道谁是真正的客户端,正向代理隐藏了真实的请求客户端。

    package main

    import (
    “fmt”
    “io”
    “net”
    “net/http”
    “strings”
    )

    type Pxy struct{}

    func (p Pxy) ServeHTTP(rw http.ResponseWriter, req http.Request) {
    fmt.Printf(“Received request %s %s %s\n”, req.Method, req.Host, req.RemoteAddr)
    //连接池
    transport := http.DefaultTransport
    // step 1,浅拷贝对象,然后就再新增属性数据
    outReq := new(http.Request)
    outReq = req
    if clientIP, , err := net.SplitHostPort(req.RemoteAddr); err == nil {
    if prior, ok := outReq.Header[“X-Forwarded-For”]; ok {
    clientIP = strings.Join(prior, “, “) + “, “ + clientIP
    }
    outReq.Header.Set(“X-Forwarded-For”, clientIP)
    }

    // step 2, 请求下游
    res, err := transport.RoundTrip(outReq)
    if err != nil {
    rw.WriteHeader(http._StatusBadGateway
    )
    return
    }

    // step 3, 把下游请求内容返回给上游
    for key, value := range res.Header {
    for _, v := range value {
    rw.Header().Add(key, v)
    }
    }
    rw.WriteHeader(res.StatusCode)
    io.Copy(rw, res.Body)
    res.Body.Close()
    }

    func main() {
    fmt.Println(“Serve on :8080”)
    http.Handle(“/“, &Pxy{})
    http.ListenAndServe(“0.0.0.0:8080”, nil)
    }