avoid panic in runtime

This commit is contained in:
mmatczuk 2017-05-12 11:40:50 +02:00
parent d364f66c09
commit 54b9f0cd4a
6 changed files with 41 additions and 28 deletions

View file

@ -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

View file

@ -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:

View file

@ -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

View file

@ -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
}

View file

@ -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)

View file

@ -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,
))