当前位置: 首页 > article >正文

使用golang启动一个http代理

使用第三方库github.com/elazarl/goproxy

一.快速启动 可以访问http和https(不能对https的内容进行拦截)

package main

import (
    "log"
    "net/http"
    "github.com/elazarl/goproxy"
)
func main() {
	gproxy := goproxy.NewProxyHttpServer()
    // 开启调试模式
    gproxy.Verbose = true
	log.Fatal(http.ListenAndServe(":8080", gproxy))
}

二.配置对https的拦截

package main

import (
	"bytes"
	"fmt"
	"github.com/elazarl/goproxy"
	"io"
	"log"
	"net/http"
)

var (
	addr = "0.0.0.0:8080"
)

func responseCondition(resp *http.Response, ctx *goproxy.ProxyCtx) bool {
	return resp != nil && resp.Body != nil
}

func echoResp(resp *http.Response, ctx *goproxy.ProxyCtx) *http.Response {
	scheme := resp.Request.URL.Scheme
	ctx.Proxy.Logger.Printf("Intercepted a %s request: %s", scheme, resp.Request.URL.String())
	if scheme == "https" {
		respBody, _ := io.ReadAll(resp.Body)
		fmt.Print(string(respBody))
		resp.Body.Close()
		//恢复响应体供后续流程使用
		resp.Body = io.NopCloser(bytes.NewBuffer(respBody))
	}
	return resp
}

// 下载证书
func certHandler(w http.ResponseWriter, _ *http.Request) {
	w.Header().Set("Content-Type", "application/octet-stream")
	w.Header().Set("Content-Disposition", "attachment;filename=GoProxyCA.crt")
	w.WriteHeader(http.StatusOK)
	w.Write(goproxy.CA_CERT)
}

// 直接使用http访问时
// 如果不是访问下载证书的请求 则直接返回错误
func nonProxyHandler(w http.ResponseWriter, r *http.Request) {
	log.Println(r.Method, r.URL.Path)
	if r.Method == http.MethodGet && r.URL.Path == "/ssl" {
		certHandler(w, r)
	} else {
		http.Error(w, "This server only responds to proxy requests.", http.StatusInternalServerError)
	}
}

// 实例化并启动一个代理服务器
func main() {
	proxy := goproxy.NewProxyHttpServer()
	proxy.NonproxyHandler = http.HandlerFunc(nonProxyHandler)
	// 调试模式
	proxy.Verbose = true
	proxy.OnResponse(goproxy.RespConditionFunc(responseCondition)).DoFunc(echoResp)
	// 启用 HTTPS 的 MITM 拦截
	proxy.OnRequest().HandleConnect(goproxy.AlwaysMitm)
	log.Fatal(http.ListenAndServe(addr, proxy))
}


运行脚本后先使用浏览器访问http://yourAddr/ssl(如: http://localhost:8080/ssl)下载并安装证书

完整代码请访问:github.com/sgs921107/gproxy


http://www.kler.cn/a/399808.html

相关文章:

  • python读写excel等数据文件方法汇总
  • SpringBoot源码解析(四):解析应用参数args
  • 《Spring 基础之 IoC 与 DI 入门指南》
  • Vue2+ElementUI:用计算属性实现搜索框功能
  • gitlab 服务器集群配置及 存储扩展配置
  • 01.02、判定是否互为字符重排
  • Vue之el-date-picker日期选择器标签—选择日期范围,数据格式:yyyy-MM-dd HH:mm:ss,设置默认时间:HH:mm:ss
  • PyTorch数据集方法
  • 分布式cap理论学习
  • leetcode hot100【LeetCode 62.不同路径】java实现
  • SAM_MED 2D 训练完成后boxes_prompt没有生成mask的问题
  • Django token 生成与验证
  • 速盾:CDN服务器和双线服务器哪个更好?
  • 如何在开源鸿蒙OpenHarmony开启SELinux模式?RK3566鸿蒙开发板演示
  • ReactPress vs VuePress vs RectPress
  • 如何将 Anaconda 源切换到国内镜像以提高下载速度:详细教程 ubuntu20.04 Pytorch
  • Springboot基于GIS的旅游信息管理系统
  • wps PPT debug
  • 动手学深度学习10.2. 注意力汇聚:Nadaraya-Watson 核回归-笔记练习(PyTorch)
  • 【118页word下载】新型智慧城市顶层设计方案
  • Node.js 23 发布了!
  • 深入理解 JavaScript 中的 Array.find() 方法:原理、性能优势与实用案例详解
  • 思科考证多少钱?不同级别思科认证考试费用详解!
  • 6.C操作符详解,深入探索操作符与字符串处理
  • 训练误差or测试误差与特征个数之间的关系--基于R语言实现
  • 性能超越Spark 13.3 倍,比某MPP整体快数十秒 | 多项性能指标数倍于主流开源引擎 | 云器科技发布性能测试报告