socks5.go raw

   1  // Copyright 2011 The Go Authors. All rights reserved.
   2  // Use of this source code is governed by a BSD-style
   3  // license that can be found in the LICENSE file.
   4  
   5  package proxy
   6  
   7  import (
   8  	"context"
   9  	"net"
  10  
  11  	"golang.org/x/net/internal/socks"
  12  )
  13  
  14  // SOCKS5 returns a Dialer that makes SOCKSv5 connections to the given
  15  // address with an optional username and password.
  16  // See RFC 1928 and RFC 1929.
  17  func SOCKS5(network, address string, auth *Auth, forward Dialer) (Dialer, error) {
  18  	d := socks.NewDialer(network, address)
  19  	if forward != nil {
  20  		if f, ok := forward.(ContextDialer); ok {
  21  			d.ProxyDial = func(ctx context.Context, network string, address string) (net.Conn, error) {
  22  				return f.DialContext(ctx, network, address)
  23  			}
  24  		} else {
  25  			d.ProxyDial = func(ctx context.Context, network string, address string) (net.Conn, error) {
  26  				return dialContext(ctx, forward, network, address)
  27  			}
  28  		}
  29  	}
  30  	if auth != nil {
  31  		up := socks.UsernamePassword{
  32  			Username: auth.User,
  33  			Password: auth.Password,
  34  		}
  35  		d.AuthMethods = []socks.AuthMethod{
  36  			socks.AuthMethodNotRequired,
  37  			socks.AuthMethodUsernamePassword,
  38  		}
  39  		d.Authenticate = up.Authenticate
  40  	}
  41  	return d, nil
  42  }
  43