mirror of
https://github.com/mmatczuk/go-http-tunnel.git
synced 2026-05-15 14:16:17 -06:00
avoid panic in runtime
This commit is contained in:
parent
d364f66c09
commit
54b9f0cd4a
6 changed files with 41 additions and 28 deletions
|
|
@ -59,16 +59,16 @@ type Client struct {
|
|||
// must invoke Start() on returned instance in order to connect server.
|
||||
func NewClient(config *ClientConfig) *Client {
|
||||
if config.ServerAddr == "" {
|
||||
panic("Missing ServerAddr")
|
||||
panic("missing ServerAddr")
|
||||
}
|
||||
if config.TLSClientConfig == nil {
|
||||
panic("Missing TLSClientConfig")
|
||||
panic("missing TLSClientConfig")
|
||||
}
|
||||
if config.Tunnels == nil || len(config.Tunnels) == 0 {
|
||||
panic("Missing Tunnels")
|
||||
panic("missing Tunnels")
|
||||
}
|
||||
if config.Proxy == nil {
|
||||
panic("Missing Proxy")
|
||||
panic("missing Proxy")
|
||||
}
|
||||
|
||||
logger := config.Logger
|
||||
|
|
|
|||
|
|
@ -92,7 +92,7 @@ func main() {
|
|||
|
||||
b, err := yaml.Marshal(config)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
fatal("failed to load config: %s", err)
|
||||
}
|
||||
logger.Log("config", string(b))
|
||||
|
||||
|
|
@ -151,7 +151,7 @@ func proxy(m map[string]*TunnelConfig, logger log.Logger) tunnel.ProxyFunc {
|
|||
case proto.HTTP:
|
||||
u, err := url.Parse(t.Addr)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
fatal("invalid tunnel address: %s", err)
|
||||
}
|
||||
httpURL[t.Host] = u
|
||||
case proto.TCP, proto.TCP4, proto.TCP6:
|
||||
|
|
|
|||
12
httpproxy.go
12
httpproxy.go
|
|
@ -35,7 +35,7 @@ type HTTPProxy struct {
|
|||
// localURL.
|
||||
func NewHTTPProxy(localURL *url.URL, logger log.Logger) *HTTPProxy {
|
||||
if localURL == nil {
|
||||
panic("Empty localURL")
|
||||
panic("empty localURL")
|
||||
}
|
||||
|
||||
if logger == nil {
|
||||
|
|
@ -55,7 +55,7 @@ func NewHTTPProxy(localURL *url.URL, logger log.Logger) *HTTPProxy {
|
|||
// different backends based on localURLMap.
|
||||
func NewMultiHTTPProxy(localURLMap map[string]*url.URL, logger log.Logger) *HTTPProxy {
|
||||
if localURLMap == nil {
|
||||
panic("Empty localURLMap")
|
||||
panic("empty localURLMap")
|
||||
}
|
||||
|
||||
if logger == nil {
|
||||
|
|
@ -74,7 +74,12 @@ func NewMultiHTTPProxy(localURLMap map[string]*url.URL, logger log.Logger) *HTTP
|
|||
// Proxy is a ProxyFunc.
|
||||
func (p *HTTPProxy) Proxy(w io.Writer, r io.ReadCloser, msg *proto.ControlMessage) {
|
||||
if msg.Protocol != proto.HTTP {
|
||||
panic(fmt.Sprintf("Expected proxy protocol, got %s", msg.Protocol))
|
||||
p.logger.Log(
|
||||
"level", 0,
|
||||
"msg", "unsupported protocol",
|
||||
"ctrlMsg", msg,
|
||||
)
|
||||
return
|
||||
}
|
||||
|
||||
rw, ok := w.(http.ResponseWriter)
|
||||
|
|
@ -87,6 +92,7 @@ func (p *HTTPProxy) Proxy(w io.Writer, r io.ReadCloser, msg *proto.ControlMessag
|
|||
p.logger.Log(
|
||||
"level", 1,
|
||||
"msg", "failed to read request",
|
||||
"ctrlMsg", msg,
|
||||
"err", err,
|
||||
)
|
||||
return
|
||||
|
|
|
|||
|
|
@ -45,7 +45,7 @@ func RandBytes(n int) []byte {
|
|||
panic(err)
|
||||
}
|
||||
if read != n {
|
||||
panic("Read did not fill whole slice")
|
||||
panic("read did not fill whole slice")
|
||||
}
|
||||
return b
|
||||
}
|
||||
|
|
|
|||
20
server.go
20
server.go
|
|
@ -4,6 +4,7 @@ import (
|
|||
"context"
|
||||
"crypto/tls"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"net"
|
||||
|
|
@ -47,7 +48,7 @@ type Server struct {
|
|||
func NewServer(config *ServerConfig) (*Server, error) {
|
||||
listener, err := listener(config)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("tls listener failedAuthorization: %s", err)
|
||||
return nil, fmt.Errorf("tls listener failed: %s", err)
|
||||
}
|
||||
|
||||
logger := config.Logger
|
||||
|
|
@ -77,10 +78,10 @@ func listener(config *ServerConfig) (net.Listener, error) {
|
|||
}
|
||||
|
||||
if config.Addr == "" {
|
||||
panic("Missing Addr")
|
||||
return nil, errors.New("missing Addr")
|
||||
}
|
||||
if config.TLSConfig == nil {
|
||||
panic("Missing TLSConfig")
|
||||
return nil, errors.New("missing TLSConfig")
|
||||
}
|
||||
|
||||
return tls.Listen("tcp", config.Addr, config.TLSConfig)
|
||||
|
|
@ -442,7 +443,7 @@ func (s *Server) proxyConn(identifier id.ID, conn net.Conn, msg *proto.ControlMe
|
|||
defer pr.Close()
|
||||
defer pw.Close()
|
||||
|
||||
req, err := s.proxyRequest(identifier, msg, pr)
|
||||
req, err := s.connectRequest(identifier, msg, pr)
|
||||
if err != nil {
|
||||
s.logger.Log(
|
||||
"level", 0,
|
||||
|
|
@ -555,7 +556,7 @@ func (s *Server) proxyHTTP(identifier id.ID, r *http.Request, msg *proto.Control
|
|||
defer pr.Close()
|
||||
defer pw.Close()
|
||||
|
||||
req, err := s.proxyRequest(identifier, msg, pr)
|
||||
req, err := s.connectRequest(identifier, msg, pr)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("proxy request error: %s", err)
|
||||
}
|
||||
|
|
@ -604,11 +605,10 @@ func (s *Server) proxyHTTP(identifier id.ID, r *http.Request, msg *proto.Control
|
|||
return resp, nil
|
||||
}
|
||||
|
||||
func (s *Server) proxyRequest(identifier id.ID, msg *proto.ControlMessage, r io.Reader) (*http.Request, error) {
|
||||
if msg.Action != proto.ActionProxy {
|
||||
panic("Invalid action")
|
||||
}
|
||||
|
||||
// connectRequest creates HTTP request to client with a given identifier having
|
||||
// control message and data input stream, output data stream results from
|
||||
// response the created request.
|
||||
func (s *Server) connectRequest(identifier id.ID, msg *proto.ControlMessage, r io.Reader) (*http.Request, error) {
|
||||
req, err := http.NewRequest(http.MethodPut, s.connPool.URL(identifier), r)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("could not create request: %s", err)
|
||||
|
|
|
|||
23
tcpproxy.go
23
tcpproxy.go
|
|
@ -28,7 +28,7 @@ type TCPProxy struct {
|
|||
// localAddr.
|
||||
func NewTCPProxy(localAddr string, logger log.Logger) *TCPProxy {
|
||||
if localAddr == "" {
|
||||
panic("Empty localAddr")
|
||||
panic("missing localAddr")
|
||||
}
|
||||
|
||||
if logger == nil {
|
||||
|
|
@ -45,7 +45,7 @@ func NewTCPProxy(localAddr string, logger log.Logger) *TCPProxy {
|
|||
// different backends based on localAddrMap.
|
||||
func NewMultiTCPProxy(localAddrMap map[string]string, logger log.Logger) *TCPProxy {
|
||||
if localAddrMap == nil {
|
||||
panic("Empty localAddrMap")
|
||||
panic("missing localAddrMap")
|
||||
}
|
||||
|
||||
if logger == nil {
|
||||
|
|
@ -60,10 +60,16 @@ func NewMultiTCPProxy(localAddrMap map[string]string, logger log.Logger) *TCPPro
|
|||
|
||||
// Proxy is a ProxyFunc.
|
||||
func (p *TCPProxy) Proxy(w io.Writer, r io.ReadCloser, msg *proto.ControlMessage) {
|
||||
w = flushWriter{w}
|
||||
|
||||
if msg.Protocol != "tcp" {
|
||||
panic(fmt.Sprintf("Expected proxy protocol, got %s", msg.Protocol))
|
||||
switch msg.Protocol {
|
||||
case proto.TCP, proto.TCP4, proto.TCP6:
|
||||
// ok
|
||||
default:
|
||||
p.logger.Log(
|
||||
"level", 0,
|
||||
"msg", "unsupported protocol",
|
||||
"ctrlMsg", msg,
|
||||
)
|
||||
return
|
||||
}
|
||||
|
||||
target := p.localAddrFor(msg.ForwardedBy)
|
||||
|
|
@ -71,7 +77,7 @@ func (p *TCPProxy) Proxy(w io.Writer, r io.ReadCloser, msg *proto.ControlMessage
|
|||
p.logger.Log(
|
||||
"level", 1,
|
||||
"msg", "no target",
|
||||
"host", msg.ForwardedBy,
|
||||
"ctrlMsg", msg,
|
||||
)
|
||||
return
|
||||
}
|
||||
|
|
@ -82,6 +88,7 @@ func (p *TCPProxy) Proxy(w io.Writer, r io.ReadCloser, msg *proto.ControlMessage
|
|||
"level", 0,
|
||||
"msg", "dial failed",
|
||||
"target", target,
|
||||
"ctrlMsg", msg,
|
||||
"err", err,
|
||||
)
|
||||
return
|
||||
|
|
@ -89,7 +96,7 @@ func (p *TCPProxy) Proxy(w io.Writer, r io.ReadCloser, msg *proto.ControlMessage
|
|||
|
||||
done := make(chan struct{})
|
||||
go func() {
|
||||
transfer(w, local, log.NewContext(p.logger).With(
|
||||
transfer(flushWriter{w}, local, log.NewContext(p.logger).With(
|
||||
"dst", msg.ForwardedBy,
|
||||
"src", target,
|
||||
))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue