parent
c4c37068f3
commit
61811e8e61
|
|
@ -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()
|
||||||
|
|
|
||||||
|
|
@ -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", "")
|
||||||
|
|
|
||||||
|
|
@ -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),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue