go语言 实现正向代理

517 阅读1分钟

正向代理的过程

我们无法访问外网 就需要VPN 这里的VPN相当于是一个代理服务器,我们将请求的数据给代理服务器,让代理帮我们转发并接收请求消息 1695199068564.png

游览器设置

a4a0ebce400b1c16ed078903e27b4a6.png

代理端控制台输出

546a9fc909ef77617edb048662ca4bc.png 当游览器设置代理之后访问网页,代理服务器就会打印游览的操作

代码

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)  
  
}