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) }