Implement tcp proxy with single forward
This commit is contained in:
@@ -5,10 +5,12 @@ import (
|
||||
"crypto/tls"
|
||||
"encoding/base64"
|
||||
"errors"
|
||||
"io"
|
||||
"local/rproxy3/config"
|
||||
"local/rproxy3/storage"
|
||||
"local/rproxy3/storage/packable"
|
||||
"log"
|
||||
"net"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"strings"
|
||||
@@ -24,6 +26,7 @@ type listenerScheme int
|
||||
const (
|
||||
schemeHTTP listenerScheme = iota
|
||||
schemeHTTPS listenerScheme = iota
|
||||
schemeTCP listenerScheme = iota
|
||||
)
|
||||
|
||||
func (ls listenerScheme) String() string {
|
||||
@@ -32,6 +35,8 @@ func (ls listenerScheme) String() string {
|
||||
return "http"
|
||||
case schemeHTTPS:
|
||||
return "https"
|
||||
case schemeTCP:
|
||||
return "tcp"
|
||||
}
|
||||
return ""
|
||||
}
|
||||
@@ -58,6 +63,9 @@ func (s *Server) Run() error {
|
||||
if _, _, ok := config.GetSSL(); ok {
|
||||
scheme = schemeHTTPS
|
||||
}
|
||||
if _, ok := config.GetTCP(); ok {
|
||||
scheme = schemeTCP
|
||||
}
|
||||
log.Printf("Listening for %v on %v...\n", scheme, s.addr)
|
||||
switch scheme {
|
||||
case schemeHTTP:
|
||||
@@ -83,6 +91,10 @@ func (s *Server) Run() error {
|
||||
TLSNextProto: make(map[string]func(*http.Server, *tls.Conn, http.Handler), 0),
|
||||
}
|
||||
return httpsServer.ListenAndServeTLS(c, k)
|
||||
case schemeTCP:
|
||||
log.Printf("Serve tcp")
|
||||
addr, _ := config.GetTCP()
|
||||
return s.ServeTCP(addr)
|
||||
}
|
||||
return errors.New("did not load server")
|
||||
}
|
||||
@@ -103,6 +115,36 @@ func (s *Server) doAuth(foo http.HandlerFunc) http.HandlerFunc {
|
||||
}
|
||||
}
|
||||
|
||||
func (s *Server) ServeTCP(addr string) error {
|
||||
listen, err := net.Listen("tcp", s.addr)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
for {
|
||||
c, err := listen.Accept()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
go func(c net.Conn) {
|
||||
d, err := net.Dial("tcp", addr)
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
return
|
||||
}
|
||||
go pipe(c, d)
|
||||
go pipe(d, c)
|
||||
}(c)
|
||||
}
|
||||
}
|
||||
|
||||
func pipe(a, b net.Conn) {
|
||||
log.Println("open pipe")
|
||||
defer log.Println("close pipe")
|
||||
defer a.Close()
|
||||
defer b.Close()
|
||||
io.Copy(a, b)
|
||||
}
|
||||
|
||||
func (s *Server) Pre(foo http.HandlerFunc) http.HandlerFunc {
|
||||
return func(w http.ResponseWriter, r *http.Request) {
|
||||
ctx, can := context.WithTimeout(r.Context(), time.Second*time.Duration(config.GetTimeout()))
|
||||
|
||||
Reference in New Issue
Block a user