Go语言实现HTTP正向代理

文章目录

前言

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

实现思路

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

代码实现

go 复制代码
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.")
	}
}
相关推荐
BingoGo2 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
JaguarJack2 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
用户3074596982072 天前
PHP 扩展——从入门到理解
php
霜落长河2 天前
抛弃TCP改用UDP,HTTP3怎么了?
http
鹏仔先生3 天前
拷贝漫画APP下载页PHP程序,后台带免费AI写作
php
何以解忧,唯有..3 天前
Go语言循环语句详解:for、range与循环控制
开发语言·算法·golang
云水一下3 天前
从零开始学 PHP 系列(一):PHP 的前世今生与开发环境搭建
开发语言·php
xingpanvip3 天前
星盘接口开发文档:本命盘接口指南
android·开发语言·css·php·lua
之歆3 天前
现代 HTTP 客户端深度解析:Fetch 与 Axios
chrome·网络协议·http
踏着七彩祥云的小丑3 天前
Go学习第9天:并发编程 + 文件操作 + 正则表达式
学习·golang·正则表达式·go