• Go语言实现HTTP正向代理


    前言

    正向代理(Forward Proxy)是一种代理服务器的部署方式,它位于客户端和目标服务器之间,代表客户端向目标服务器发送请求。正向代理可以用来隐藏客户端的真实身份,以及在不同网络环境下实现访问控制、负载均衡、缓存、访问优化等功能

    实现思路

    使用Go启动一个HTTP服务器,接收到客户端的请求后,使用服务器发送客户端的请求,然后将响应结果返回给客户端

    代码实现

    package main
    
    import (
    	"context"
    	"io"
    	"log"
    	"net"
    	"net/http"
    	"strings"
    )
    
    type ForwardProxy struct {}
    
    func (p *ForwardProxy)ServeHTTP(w http.ResponseWriter, r *http.Request){
    	transport := http.DefaultTransport
    
    	// 拷贝一个request 对象,避免后续修影响了源对象
    	req := r.Clone(context.Background())
    	
    	// 设置X-Forward-For 头部
    	// X-Forward-For 字段的值是一个逗号分隔的 IP 地址列表
    	// 列表中的第一个 IP 地址通常是客户端的真实 IP 地址,后续的 IP 地址则是代理服务器或负载均衡器的地址
    	if clientIp , _ , err := net.SplitHostPort(r.RemoteAddr); err == nil{
    		if prior, ok := req.Header["X-Forward-For"]; ok {
    			clientIp = strings.Join(prior, ", ") + ", " + clientIp
    		}
    		req.Header.Set("X-Forward-For", clientIp)
    	}
    
    	// 构造新请求
    	response,err:=transport.RoundTrip(req)
    	if err != nil {
    		w.WriteHeader(http.StatusInternalServerError)
    		return
    	}
    
    	// 获取响应数据并返回
    	for k,v := range response.Header{
    		for _,v1 := range v{
    			w.Header().Add(k,v1)
    		}
    	}
    	w.WriteHeader(response.StatusCode)
    	io.Copy(w,response.Body)
    	response.Body.Close()
    }
    
    var serverAddr = ":8888"
    
    func main() {
    	server := &http.Server{
    		Addr: serverAddr,
    		Handler: &ForwardProxy{},
    	}
    
    	if err := server.ListenAndServe(); err != nil{
    		log.Fatal("HTTP forward proxy failed to start.")
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
  • 相关阅读:
    网络安全(黑客)自学笔记
    linux安装showdoc——让你避过大坑
    Tarjan—离线求LCA
    在 PyCharm 中使用 CuPy 进行 CUDA 加速的向量运算
    Android App活动页面
    Git工具的学习
    vue.js插槽的定义和使用
    “论软件系统架构评估”精选范文,软考高级论文,系统架构设计师论文
    【软件工程】三、形式化说明技术 & 总体设计 & 详细设计
    Git命令全集
  • 原文地址:https://blog.csdn.net/qq_67733273/article/details/134252654