Go net/http代理

share/share.go

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
/******
** @创建时间 : 2020/5/25 20:26
** @作者 : SongZhiBin
******/
package share
 
import (
    "fmt"
    "net/http"
    "net/http/httputil"
    "net/url"
    "os"
)
 
// ========= global variable
var Config conf
var LogOut *os.File
 
// ========== Struct
type conf struct {
    TargetIP   string
    TargetPort int
    LocalPort  int
}
 
// 转发中间件
func (c *conf) Forward(w http.ResponseWriter, r *http.Request) {
    u, _ := url.Parse(fmt.Sprintf("http://%s:%d/", Config.TargetIP, Config.TargetPort))
    proxy := httputil.NewSingleHostReverseProxy(u)
    proxy.ServeHTTP(w, r)
}

  

config.txt

1
2
3
4
[target]
TargetIP = 127.0.0.1
TargetPort = 8080
LocalPort = 80

 

run.go 

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
/******
** @创建时间 : 2020/5/25 19:09
** @作者 : SongZhiBin
******/
package main
 
import (
    "fmt"
    "gopkg.in/ini.v1"
    "net/http"
    "os"
)
import "Songzhibin/HttpAgent/share"
 
func main() {
    // 读取配置文件
    share.LogOut = os.Stdout
    cfg, err := ini.Load("./config.txt")
    if err != nil {
        // 读取失败,使用默认配置
        share.Config.TargetIP = "127.0.0.1"
        share.Config.TargetPort = 80
        share.Config.LocalPort = 80
        fmt.Fprintf(share.LogOut, "使用默认配置->TargetIP:%s TargetPort:%d\n", share.Config.TargetIP, share.Config.TargetPort)
    }
 
    err = cfg.Section("target").MapTo(&share.Config)
    if err != nil {
        fmt.Fprintf(share.LogOut, "MapTo映射失败->Err:%s\n", err)
        return
    }
    fmt.Fprintf(share.LogOut, "配置文件启动->TargetIP:%s TargetPort:%d\n", share.Config.TargetIP, share.Config.TargetPort)
    http.HandleFunc("/", share.Config.Forward)                                 // 设置默认路由
    err = http.ListenAndServe(fmt.Sprintf(":%d", share.Config.LocalPort), nil)
    if err != nil {
        fmt.Printf("http server failed, err:%v\n", err)
        return
    }
}

  

posted @   Binb  阅读(519)  评论(0编辑  收藏  举报
编辑推荐:
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
点击右上角即可分享
微信分享提示