From 61811e8e618babc2dd68b03f0fa769a736c50d57 Mon Sep 17 00:00:00 2001 From: Bel LaPointe Date: Fri, 14 Feb 2020 14:57:26 -0700 Subject: [PATCH] Listen on second port and redirect to main --- config/config.go | 5 +++++ config/new.go | 1 + server/new.go | 2 ++ server/server.go | 49 ++++++++++++++++++++++++++++++++++++++---------- 4 files changed, 47 insertions(+), 10 deletions(-) diff --git a/config/config.go b/config/config.go index 1daa7f4..6c179a8 100755 --- a/config/config.go +++ b/config/config.go @@ -40,6 +40,11 @@ func GetPort() string { return ":" + fmt.Sprint(port) } +func GetAltPort() string { + port := conf.Get("ap").GetInt() + return ":" + fmt.Sprint(port) +} + func GetRate() (int, int) { rate := conf.Get("r").GetInt() burst := conf.Get("b").GetInt() diff --git a/config/new.go b/config/new.go index 4f0864f..422ea50 100755 --- a/config/new.go +++ b/config/new.go @@ -39,6 +39,7 @@ func parseArgs() (*args.ArgSet, error) { as.Append(args.STRING, "user", "username for basic auth", "") as.Append(args.STRING, "pass", "password for basic auth", "") as.Append(args.INT, "p", "port for service", 51555) + as.Append(args.INT, "ap", "alt port for always http service", 51556) as.Append(args.INT, "r", "rate per second for requests", 100) as.Append(args.INT, "b", "burst requests", 100) as.Append(args.STRING, "crt", "path to crt for ssl", "") diff --git a/server/new.go b/server/new.go index 96f2eeb..517eab2 100755 --- a/server/new.go +++ b/server/new.go @@ -9,10 +9,12 @@ import ( func New() *Server { port := config.GetPort() + altport := config.GetAltPort() r, b := config.GetRate() return &Server{ db: storage.NewMap(), addr: port, + altaddr: altport, limiter: rate.NewLimiter(rate.Limit(r), b), } } diff --git a/server/server.go b/server/server.go index 48277f1..08d5527 100755 --- a/server/server.go +++ b/server/server.go @@ -47,6 +47,7 @@ func (ls listenerScheme) String() string { type Server struct { db storage.DB addr string + altaddr string username string password string limiter *rate.Limiter @@ -65,20 +66,13 @@ func (s *Server) Route(src string, dst config.Proxy) error { } func (s *Server) Run() error { - scheme := schemeHTTP - if _, _, ok := config.GetSSL(); ok { - scheme = schemeHTTPS - } - if _, ok := config.GetTCP(); ok { - scheme = schemeTCP - } + go s.alt() + scheme := getScheme() log.Printf("Listening for %v on %v...\n", scheme, s.addr) switch scheme { case schemeHTTP: - log.Printf("Serve http") return http.ListenAndServe(s.addr, s) case schemeHTTPS: - log.Printf("Serve https") c, k, _ := config.GetSSL() httpsServer := &http.Server{ Addr: s.addr, @@ -98,7 +92,6 @@ func (s *Server) Run() error { } return httpsServer.ListenAndServeTLS(c, k) case schemeTCP: - log.Printf("Serve tcp") addr, _ := config.GetTCP() return s.ServeTCP(addr) } @@ -189,3 +182,39 @@ func getProxyAuth(r *http.Request) (string, string) { proxyAuthSplit := strings.Split(proxyAuth, ":") return proxyAuthSplit[0], proxyAuthSplit[1] } + +func (s *Server) alt() { + switch getScheme() { + case schemeHTTP: + case schemeHTTPS: + default: + return + } + foo := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + r.URL.Scheme = getScheme().String() + if hostname := r.URL.Hostname(); hostname != "" { + r.URL.Host = r.URL.Hostname() + s.addr + } else if hostname := r.URL.Host; hostname != "" { + r.URL.Host = r.URL.Host + s.addr + } else { + u := url.URL{Host: r.Host} + r.URL.Host = u.Hostname() + s.addr + } + http.Redirect(w, r, r.URL.String(), http.StatusSeeOther) + }) + log.Println("redirecting from", s.altaddr) + if err := http.ListenAndServe(s.altaddr, foo); err != nil { + panic(err) + } +} + +func getScheme() listenerScheme { + scheme := schemeHTTP + if _, _, ok := config.GetSSL(); ok { + scheme = schemeHTTPS + } + if _, ok := config.GetTCP(); ok { + scheme = schemeTCP + } + return scheme +}