From 640d64c3aaa54bfe0cd0ff3b174b0d96e1a8e109 Mon Sep 17 00:00:00 2001 From: Marcos Nils Date: Sun, 12 Feb 2017 02:25:25 +0200 Subject: [PATCH] Update proxy to handle port redirects (#92) --- api.go | 21 +++++++-------------- config/config.go | 13 +++++++++++++ handlers/reverseproxy.go | 9 ++++++++- services/session.go | 3 +-- 4 files changed, 29 insertions(+), 17 deletions(-) create mode 100644 config/config.go diff --git a/api.go b/api.go index a6ef909..4d6569e 100644 --- a/api.go +++ b/api.go @@ -8,9 +8,7 @@ import ( "os" "strings" - "flag" - "strconv" - + "github.com/franela/play-with-docker/config" "github.com/franela/play-with-docker/handlers" "github.com/franela/play-with-docker/services" "github.com/franela/play-with-docker/templates" @@ -21,13 +19,8 @@ import ( ) func main() { - var sslPortNumber, portNumber int - var key, cert string - flag.IntVar(&portNumber, "port", 3000, "Give a TCP port to run the application") - flag.IntVar(&sslPortNumber, "sslPort", 3001, "Give a SSL TCP port") - flag.StringVar(&key, "key", "./pwd/server-key.pem", "Server key for SSL") - flag.StringVar(&cert, "cert", "./pwd/server.pem", "Give a SSL cert") - flag.Parse() + + config.ParseFlags() bypassCaptcha := len(os.Getenv("GOOGLE_RECAPTCHA_DISABLED")) > 0 @@ -89,16 +82,16 @@ func main() { n.UseHandler(r) go func() { - log.Println("Listening on port " + strconv.Itoa(portNumber)) - log.Fatal(http.ListenAndServe("0.0.0.0:"+strconv.Itoa(portNumber), gh.CORS(gh.AllowCredentials(), gh.AllowedHeaders([]string{"x-requested-with", "content-type"}), gh.AllowedOrigins([]string{"*"}))(n))) + log.Println("Listening on port " + config.PortNumber) + log.Fatal(http.ListenAndServe("0.0.0.0:"+config.PortNumber, gh.CORS(gh.AllowCredentials(), gh.AllowedHeaders([]string{"x-requested-with", "content-type"}), gh.AllowedOrigins([]string{"*"}))(n))) }() ssl := mux.NewRouter() sslProxyHandler := handlers.NewSSLDaemonHandler() ssl.Host(`{node:ip[0-9]{1,3}_[0-9]{1,3}_[0-9]{1,3}_[0-9]{1,3}}-2375.{tld:.*}`).Handler(sslProxyHandler) - log.Println("Listening TLS on port " + strconv.Itoa(sslPortNumber)) + log.Println("Listening TLS on port " + config.SSLPortNumber) - s := &http.Server{Addr: "0.0.0.0:" + strconv.Itoa(sslPortNumber), Handler: ssl} + s := &http.Server{Addr: "0.0.0.0:" + config.SSLPortNumber, Handler: ssl} s.TLSConfig = &tls.Config{} s.TLSConfig.GetCertificate = func(clientHello *tls.ClientHelloInfo) (*tls.Certificate, error) { diff --git a/config/config.go b/config/config.go new file mode 100644 index 0000000..6c64bcd --- /dev/null +++ b/config/config.go @@ -0,0 +1,13 @@ +package config + +import "flag" + +var SSLPortNumber, PortNumber, Key, Cert string + +func ParseFlags() { + flag.StringVar(&PortNumber, "port", "3000", "Give a TCP port to run the application") + flag.StringVar(&SSLPortNumber, "sslPort", "3001", "Give a SSL TCP port") + flag.StringVar(&Key, "key", "./pwd/server-key.pem", "Server key for SSL") + flag.StringVar(&Cert, "cert", "./pwd/server.pem", "Give a SSL cert") + flag.Parse() +} diff --git a/handlers/reverseproxy.go b/handlers/reverseproxy.go index f15282a..d9860fd 100644 --- a/handlers/reverseproxy.go +++ b/handlers/reverseproxy.go @@ -9,6 +9,7 @@ import ( "strings" "time" + "github.com/franela/play-with-docker/config" "github.com/gorilla/mux" ) @@ -30,9 +31,15 @@ func NewMultipleHostReverseProxy() *httputil.ReverseProxy { v := mux.Vars(req) node := v["node"] port := v["port"] - if port == "" { + hostPort := strings.Split(req.Host, ":") + + // give priority to the URL host port + if len(hostPort) > 1 && hostPort[1] != config.PortNumber { + port = hostPort[1] + } else if port == "" { port = "80" } + if strings.HasPrefix(node, "ip") { // Node is actually an ip, need to convert underscores by dots. ip := strings.Replace(strings.TrimPrefix(node, "ip"), "_", ".", -1) diff --git a/services/session.go b/services/session.go index 993a8aa..8983106 100644 --- a/services/session.go +++ b/services/session.go @@ -205,11 +205,10 @@ var defaultDuration = 4 * time.Hour func GetDuration(reqDur string) time.Duration { if reqDur != "" { - if dur, err := time.ParseDuration(reqDur); err == nil { + if dur, err := time.ParseDuration(reqDur); err == nil && dur <= defaultDuration { return dur } return defaultDuration - } envDur := os.Getenv("EXPIRY")