Files
openlan/pkg/proxy/proxy.go
2025-04-13 15:33:35 +08:00

92 lines
1.4 KiB
Go
Executable File

package proxy
import (
"os"
"github.com/luscis/openlan/pkg/config"
"github.com/luscis/openlan/pkg/libol"
)
type Proxyer interface {
Initialize()
Start()
Stop()
Save()
}
type Proxy struct {
cfg *config.Proxy
tcp map[string]*TcpProxy
socks map[string]*SocksProxy
http map[string]*HttpProxy
}
func NewProxy(cfg *config.Proxy) *Proxy {
return &Proxy{
cfg: cfg,
socks: make(map[string]*SocksProxy, 32),
tcp: make(map[string]*TcpProxy, 32),
http: make(map[string]*HttpProxy, 32),
}
}
func (p *Proxy) Initialize() {
if p.cfg == nil {
return
}
for _, c := range p.cfg.Socks {
s := NewSocksProxy(c)
if s == nil {
continue
}
p.socks[c.Listen] = s
}
for _, c := range p.cfg.Tcp {
p.tcp[c.Listen] = NewTcpProxy(c)
}
for _, c := range p.cfg.Http {
if c == nil || c.Listen == "" {
continue
}
h := NewHttpProxy(c, p)
p.http[c.Listen] = h
}
}
func (p *Proxy) Start() {
if p.cfg == nil {
return
}
libol.Info("Proxy.Start")
for _, s := range p.socks {
s.Start()
}
for _, t := range p.tcp {
t.Start()
}
for _, h := range p.http {
h.Start()
}
}
func (p *Proxy) Stop() {
if p.cfg == nil {
return
}
libol.Info("Proxy.Stop")
for _, t := range p.tcp {
t.Stop()
}
}
func (p *Proxy) Save() {
p.cfg.Save()
}
func init() {
// HTTP/2.0 not support upgrade for Hijacker
if err := os.Setenv("GODEBUG", "http2server=0"); err != nil {
libol.Warn("proxy.init %s")
}
}