85 lines
1.6 KiB
Go
85 lines
1.6 KiB
Go
package server
|
|
|
|
import (
|
|
"errors"
|
|
"local/rproxy3/config"
|
|
"local/rproxy3/storage"
|
|
"local/rproxy3/storage/packable"
|
|
"log"
|
|
"net/http"
|
|
"net/url"
|
|
)
|
|
|
|
const nsRouting = "routing"
|
|
|
|
type listenerScheme int
|
|
|
|
const (
|
|
schemeHTTP listenerScheme = iota
|
|
schemeHTTPS listenerScheme = iota
|
|
)
|
|
|
|
func (ls listenerScheme) String() string {
|
|
switch ls {
|
|
case schemeHTTP:
|
|
return "http"
|
|
case schemeHTTPS:
|
|
return "https"
|
|
}
|
|
return ""
|
|
}
|
|
|
|
type Server struct {
|
|
db storage.DB
|
|
addr string
|
|
username string
|
|
password string
|
|
}
|
|
|
|
func (s *Server) Route(src, dst string) error {
|
|
log.Printf("Adding route %q -> %q...\n", src, dst)
|
|
u, err := url.Parse(dst)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return s.db.Set(nsRouting, src, packable.NewURL(u))
|
|
}
|
|
|
|
func (s *Server) Run() error {
|
|
scheme := schemeHTTP
|
|
if _, _, ok := config.GetSSL(); ok {
|
|
scheme = schemeHTTPS
|
|
}
|
|
log.Printf("Listening for %v on %v...\n", scheme, s.addr)
|
|
switch scheme {
|
|
case schemeHTTP:
|
|
return http.ListenAndServe(s.addr, s)
|
|
case schemeHTTPS:
|
|
c, k, _ := config.GetSSL()
|
|
return http.ListenAndServeTLS(s.addr, c, k, s)
|
|
}
|
|
return errors.New("did not load server")
|
|
}
|
|
|
|
func (s *Server) doAuth(foo http.HandlerFunc) http.HandlerFunc {
|
|
return func(w http.ResponseWriter, r *http.Request) {
|
|
rusr, rpwd, ok := config.GetAuth()
|
|
if ok {
|
|
usr, pwd, ok := r.BasicAuth()
|
|
if !ok || rusr != usr || rpwd != pwd {
|
|
w.WriteHeader(http.StatusUnauthorized)
|
|
return
|
|
}
|
|
}
|
|
foo(w, r)
|
|
}
|
|
}
|
|
|
|
func (s *Server) Pre(foo http.HandlerFunc) http.HandlerFunc {
|
|
return s.doAuth(foo)
|
|
}
|
|
|
|
func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
|
s.Pre(s.Proxy)(w, r)
|
|
}
|