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