Listen on second port and redirect to main

master v0.7
Bel LaPointe 2020-02-14 14:57:26 -07:00
parent c4c37068f3
commit 61811e8e61
4 changed files with 47 additions and 10 deletions

View File

@ -40,6 +40,11 @@ func GetPort() string {
return ":" + fmt.Sprint(port) return ":" + fmt.Sprint(port)
} }
func GetAltPort() string {
port := conf.Get("ap").GetInt()
return ":" + fmt.Sprint(port)
}
func GetRate() (int, int) { func GetRate() (int, int) {
rate := conf.Get("r").GetInt() rate := conf.Get("r").GetInt()
burst := conf.Get("b").GetInt() burst := conf.Get("b").GetInt()

View File

@ -39,6 +39,7 @@ func parseArgs() (*args.ArgSet, error) {
as.Append(args.STRING, "user", "username for basic auth", "") as.Append(args.STRING, "user", "username for basic auth", "")
as.Append(args.STRING, "pass", "password 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, "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, "r", "rate per second for requests", 100)
as.Append(args.INT, "b", "burst requests", 100) as.Append(args.INT, "b", "burst requests", 100)
as.Append(args.STRING, "crt", "path to crt for ssl", "") as.Append(args.STRING, "crt", "path to crt for ssl", "")

View File

@ -9,10 +9,12 @@ import (
func New() *Server { func New() *Server {
port := config.GetPort() port := config.GetPort()
altport := config.GetAltPort()
r, b := config.GetRate() r, b := config.GetRate()
return &Server{ return &Server{
db: storage.NewMap(), db: storage.NewMap(),
addr: port, addr: port,
altaddr: altport,
limiter: rate.NewLimiter(rate.Limit(r), b), limiter: rate.NewLimiter(rate.Limit(r), b),
} }
} }

View File

@ -47,6 +47,7 @@ func (ls listenerScheme) String() string {
type Server struct { type Server struct {
db storage.DB db storage.DB
addr string addr string
altaddr string
username string username string
password string password string
limiter *rate.Limiter limiter *rate.Limiter
@ -65,20 +66,13 @@ func (s *Server) Route(src string, dst config.Proxy) error {
} }
func (s *Server) Run() error { func (s *Server) Run() error {
scheme := schemeHTTP go s.alt()
if _, _, ok := config.GetSSL(); ok { scheme := getScheme()
scheme = schemeHTTPS
}
if _, ok := config.GetTCP(); ok {
scheme = schemeTCP
}
log.Printf("Listening for %v on %v...\n", scheme, s.addr) log.Printf("Listening for %v on %v...\n", scheme, s.addr)
switch scheme { switch scheme {
case schemeHTTP: case schemeHTTP:
log.Printf("Serve http")
return http.ListenAndServe(s.addr, s) return http.ListenAndServe(s.addr, s)
case schemeHTTPS: case schemeHTTPS:
log.Printf("Serve https")
c, k, _ := config.GetSSL() c, k, _ := config.GetSSL()
httpsServer := &http.Server{ httpsServer := &http.Server{
Addr: s.addr, Addr: s.addr,
@ -98,7 +92,6 @@ func (s *Server) Run() error {
} }
return httpsServer.ListenAndServeTLS(c, k) return httpsServer.ListenAndServeTLS(c, k)
case schemeTCP: case schemeTCP:
log.Printf("Serve tcp")
addr, _ := config.GetTCP() addr, _ := config.GetTCP()
return s.ServeTCP(addr) return s.ServeTCP(addr)
} }
@ -189,3 +182,39 @@ func getProxyAuth(r *http.Request) (string, string) {
proxyAuthSplit := strings.Split(proxyAuth, ":") proxyAuthSplit := strings.Split(proxyAuth, ":")
return proxyAuthSplit[0], proxyAuthSplit[1] 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
}