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  )