Go实现简单的客户端代理

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

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_38900565/article/details/107576558