mirror of https://github.com/ginuerzh/gost
8 changed files with 76 additions and 94 deletions
@ -1,80 +0,0 @@ |
|||||
package main |
|
||||
|
|
||||
import ( |
|
||||
"bytes" |
|
||||
"fmt" |
|
||||
"io" |
|
||||
"os" |
|
||||
) |
|
||||
|
|
||||
var ( |
|
||||
Debug bool |
|
||||
) |
|
||||
|
|
||||
type BufferedLog struct { |
|
||||
buffer *bytes.Buffer |
|
||||
w io.WriteCloser |
|
||||
} |
|
||||
|
|
||||
func NewLog(buffered bool) *BufferedLog { |
|
||||
log := &BufferedLog{ |
|
||||
w: os.Stdout, |
|
||||
} |
|
||||
if buffered { |
|
||||
log.buffer = &bytes.Buffer{} |
|
||||
} |
|
||||
|
|
||||
return log |
|
||||
} |
|
||||
|
|
||||
func NewFileLog(file *os.File) *BufferedLog { |
|
||||
return &BufferedLog{ |
|
||||
buffer: &bytes.Buffer{}, |
|
||||
w: file, |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
func (log *BufferedLog) Log(a ...interface{}) (int, error) { |
|
||||
if !Debug { |
|
||||
return 0, nil |
|
||||
} |
|
||||
if log.buffer != nil { |
|
||||
return fmt.Fprint(log.buffer, a...) |
|
||||
} |
|
||||
return fmt.Fprint(log.w, a...) |
|
||||
} |
|
||||
|
|
||||
func (log *BufferedLog) Logln(a ...interface{}) (int, error) { |
|
||||
if !Debug { |
|
||||
return 0, nil |
|
||||
} |
|
||||
if log.buffer != nil { |
|
||||
return fmt.Fprintln(log.buffer, a...) |
|
||||
} |
|
||||
return fmt.Fprintln(log.w, a...) |
|
||||
} |
|
||||
|
|
||||
func (log *BufferedLog) Logf(format string, a ...interface{}) (int, error) { |
|
||||
if !Debug { |
|
||||
return 0, nil |
|
||||
} |
|
||||
if log.buffer != nil { |
|
||||
return fmt.Fprintf(log.buffer, format, a...) |
|
||||
} |
|
||||
return fmt.Fprintf(log.w, format, a...) |
|
||||
} |
|
||||
|
|
||||
func (log *BufferedLog) Flush() error { |
|
||||
defer func() { |
|
||||
if log.w != os.Stdout { |
|
||||
log.w.Close() |
|
||||
} |
|
||||
}() |
|
||||
|
|
||||
if !Debug || log.buffer == nil { |
|
||||
return nil |
|
||||
} |
|
||||
|
|
||||
_, err := log.buffer.WriteTo(log.w) |
|
||||
return err |
|
||||
} |
|
||||
@ -0,0 +1,51 @@ |
|||||
|
package main |
||||
|
|
||||
|
import ( |
||||
|
"crypto/tls" |
||||
|
"github.com/ginuerzh/gosocks5" |
||||
|
"net" |
||||
|
) |
||||
|
|
||||
|
type TlsServer struct { |
||||
|
Addr string |
||||
|
CertFile, KeyFile string |
||||
|
} |
||||
|
|
||||
|
func (s *TlsServer) ListenAndServe() error { |
||||
|
return s.listenAndServeTLS() |
||||
|
} |
||||
|
|
||||
|
func (s *TlsServer) listenAndServeTLS() error { |
||||
|
var cert tls.Certificate |
||||
|
var err error |
||||
|
|
||||
|
if len(s.CertFile) == 0 || len(s.KeyFile) == 0 { |
||||
|
cert, err = tls.X509KeyPair([]byte(rawCert), []byte(rawKey)) |
||||
|
} else { |
||||
|
cert, err = tls.LoadX509KeyPair(s.CertFile, s.KeyFile) |
||||
|
} |
||||
|
if err != nil { |
||||
|
return err |
||||
|
} |
||||
|
|
||||
|
config := &tls.Config{Certificates: []tls.Certificate{cert}} |
||||
|
l, err := tls.Listen("tcp", s.Addr, config) |
||||
|
if err != nil { |
||||
|
return err |
||||
|
} |
||||
|
defer l.Close() |
||||
|
|
||||
|
for { |
||||
|
conn, err := l.Accept() |
||||
|
if err != nil { |
||||
|
return err |
||||
|
} |
||||
|
|
||||
|
go func(c net.Conn) { |
||||
|
c = gosocks5.ServerConn(c, serverConfig) |
||||
|
serveSocks5(c) |
||||
|
}(conn) |
||||
|
} |
||||
|
|
||||
|
return nil |
||||
|
} |
||||
Loading…
Reference in new issue