github.com/imgk/caddy-trojan@v0.0.0-20221206043256-2631719e16c8/app/proxy.go (about) 1 package app 2 3 import ( 4 "errors" 5 "io" 6 "net" 7 8 "golang.org/x/net/proxy" 9 10 "github.com/caddyserver/caddy/v2" 11 12 "github.com/imgk/caddy-trojan/trojan" 13 ) 14 15 func init() { 16 caddy.RegisterModule(NoProxy{}) 17 caddy.RegisterModule(EnvProxy{}) 18 } 19 20 // Proxy is ... 21 type Proxy interface { 22 // Handle is ... 23 Handle(r io.Reader, w io.Writer) (int64, int64, error) 24 // Closer is ... 25 io.Closer 26 } 27 28 // NoProxy is ... 29 type NoProxy struct{} 30 31 // CaddyModule is ... 32 func (NoProxy) CaddyModule() caddy.ModuleInfo { 33 return caddy.ModuleInfo{ 34 ID: "trojan.proxies.no_proxy", 35 New: func() caddy.Module { return new(NoProxy) }, 36 } 37 } 38 39 // Handle is ... 40 func (*NoProxy) Handle(r io.Reader, w io.Writer) (int64, int64, error) { 41 return trojan.Handle(r, w) 42 } 43 44 // Close is ... 45 func (*NoProxy) Close() error { 46 return nil 47 } 48 49 // EnvProxy is ... 50 type EnvProxy struct { 51 proxy.Dialer `json:"-,omitempty"` 52 } 53 54 // CaddyModule is ... 55 func (EnvProxy) CaddyModule() caddy.ModuleInfo { 56 return caddy.ModuleInfo{ 57 ID: "trojan.proxies.env_proxy", 58 New: func() caddy.Module { return new(EnvProxy) }, 59 } 60 } 61 62 // Provision is ... 63 func (p *EnvProxy) Provision(ctx caddy.Context) error { 64 p.Dialer = proxy.FromEnvironment() 65 return nil 66 } 67 68 // Handle is ... 69 func (p *EnvProxy) Handle(r io.Reader, w io.Writer) (int64, int64, error) { 70 return trojan.HandleWithDialer(r, w, p) 71 } 72 73 // Close is ... 74 func (*EnvProxy) Close() error { 75 return nil 76 } 77 78 // ListenPacket is ... 79 func (*EnvProxy) ListenPacket(network, addr string) (net.PacketConn, error) { 80 return nil, errors.New("proxy from environment does not support UDP") 81 } 82 83 var ( 84 _ Proxy = (*NoProxy)(nil) 85 _ caddy.Provisioner = (*EnvProxy)(nil) 86 _ Proxy = (*EnvProxy)(nil) 87 )