|
5 | 5 | "fmt" |
6 | 6 | "log" |
7 | 7 | "net" |
| 8 | + "os" |
8 | 9 | ) |
9 | 10 |
|
10 | 11 | const ( |
@@ -38,6 +39,10 @@ type Config struct { |
38 | 39 |
|
39 | 40 | // BindIP is used for bind or udp associate |
40 | 41 | BindIP net.IP |
| 42 | + |
| 43 | + // Logger can be used to provide a custom log target. |
| 44 | + // Defaults to stdout. |
| 45 | + Logger *log.Logger |
41 | 46 | } |
42 | 47 |
|
43 | 48 | // Server is reponsible for accepting connections and handling |
@@ -68,6 +73,11 @@ func New(conf *Config) (*Server, error) { |
68 | 73 | conf.Rules = PermitAll() |
69 | 74 | } |
70 | 75 |
|
| 76 | + // Ensure we have a log target |
| 77 | + if conf.Logger == nil { |
| 78 | + conf.Logger = log.New(os.Stdout, "", log.LstdFlags) |
| 79 | + } |
| 80 | + |
71 | 81 | server := &Server{ |
72 | 82 | config: conf, |
73 | 83 | } |
@@ -110,28 +120,28 @@ func (s *Server) ServeConn(conn net.Conn) error { |
110 | 120 | // Read the version byte |
111 | 121 | version := []byte{0} |
112 | 122 | if _, err := bufConn.Read(version); err != nil { |
113 | | - log.Printf("[ERR] socks: Failed to get version byte: %v", err) |
| 123 | + s.config.Logger.Printf("[ERR] socks: Failed to get version byte: %v", err) |
114 | 124 | return err |
115 | 125 | } |
116 | 126 |
|
117 | 127 | // Ensure we are compatible |
118 | 128 | if version[0] != socks5Version { |
119 | 129 | err := fmt.Errorf("Unsupported SOCKS version: %v", version) |
120 | | - log.Printf("[ERR] socks: %v", err) |
| 130 | + s.config.Logger.Printf("[ERR] socks: %v", err) |
121 | 131 | return err |
122 | 132 | } |
123 | 133 |
|
124 | 134 | // Authenticate the connection |
125 | 135 | if err := s.authenticate(conn, bufConn); err != nil { |
126 | 136 | err = fmt.Errorf("Failed to authenticate: %v", err) |
127 | | - log.Printf("[ERR] socks: %v", err) |
| 137 | + s.config.Logger.Printf("[ERR] socks: %v", err) |
128 | 138 | return err |
129 | 139 | } |
130 | 140 |
|
131 | 141 | // Process the client request |
132 | 142 | if err := s.handleRequest(conn, bufConn); err != nil { |
133 | 143 | err = fmt.Errorf("Failed to handle request: %v", err) |
134 | | - log.Printf("[ERR] socks: %v", err) |
| 144 | + s.config.Logger.Printf("[ERR] socks: %v", err) |
135 | 145 | return err |
136 | 146 | } |
137 | 147 |
|
|
0 commit comments