2021-09-08 18:04:56 +00:00
|
|
|
package proxyv2
|
|
|
|
|
|
|
|
import (
|
|
|
|
"net/http"
|
2021-11-10 16:16:13 +00:00
|
|
|
"strings"
|
2021-09-08 18:04:56 +00:00
|
|
|
"time"
|
|
|
|
|
|
|
|
"github.com/prometheus/client_golang/prometheus"
|
|
|
|
"goauthentik.io/internal/outpost/proxyv2/metrics"
|
|
|
|
"goauthentik.io/internal/utils/web"
|
|
|
|
staticWeb "goauthentik.io/web"
|
|
|
|
)
|
|
|
|
|
|
|
|
func (ps *ProxyServer) HandlePing(rw http.ResponseWriter, r *http.Request) {
|
|
|
|
before := time.Now()
|
|
|
|
rw.WriteHeader(204)
|
|
|
|
after := time.Since(before)
|
|
|
|
metrics.Requests.With(prometheus.Labels{
|
2021-09-16 08:03:31 +00:00
|
|
|
"outpost_name": ps.akAPI.Outpost.Name,
|
|
|
|
"method": r.Method,
|
2021-11-10 16:16:13 +00:00
|
|
|
"scheme": r.URL.Scheme,
|
2021-09-16 08:03:31 +00:00
|
|
|
"path": r.URL.Path,
|
|
|
|
"host": web.GetHost(r),
|
|
|
|
"type": "ping",
|
|
|
|
"user": "",
|
2021-09-08 18:04:56 +00:00
|
|
|
}).Observe(float64(after))
|
|
|
|
}
|
|
|
|
|
|
|
|
func (ps *ProxyServer) HandleStatic(rw http.ResponseWriter, r *http.Request) {
|
|
|
|
staticFs := http.FileServer(http.FS(staticWeb.StaticDist))
|
|
|
|
before := time.Now()
|
|
|
|
http.StripPrefix("/akprox/static", staticFs).ServeHTTP(rw, r)
|
|
|
|
after := time.Since(before)
|
|
|
|
metrics.Requests.With(prometheus.Labels{
|
2021-09-16 08:03:31 +00:00
|
|
|
"outpost_name": ps.akAPI.Outpost.Name,
|
|
|
|
"method": r.Method,
|
2021-11-10 16:16:13 +00:00
|
|
|
"scheme": r.URL.Scheme,
|
2021-09-16 08:03:31 +00:00
|
|
|
"path": r.URL.Path,
|
|
|
|
"host": web.GetHost(r),
|
|
|
|
"type": "ping",
|
|
|
|
"user": "",
|
2021-09-08 18:04:56 +00:00
|
|
|
}).Observe(float64(after))
|
|
|
|
}
|
|
|
|
|
|
|
|
func (ps *ProxyServer) Handle(rw http.ResponseWriter, r *http.Request) {
|
2021-11-10 16:16:13 +00:00
|
|
|
if strings.HasPrefix(r.URL.Path, "/akprox/static") {
|
|
|
|
ps.HandleStatic(rw, r)
|
|
|
|
return
|
|
|
|
}
|
2021-09-08 18:04:56 +00:00
|
|
|
host := web.GetHost(r)
|
|
|
|
a, ok := ps.apps[host]
|
|
|
|
if !ok {
|
2021-09-24 21:32:16 +00:00
|
|
|
// If we only have one handler, host name switching doesn't matter
|
|
|
|
if len(ps.apps) == 1 {
|
|
|
|
ps.log.WithField("host", host).Warning("passing to single app mux")
|
|
|
|
for k := range ps.apps {
|
|
|
|
ps.apps[k].ServeHTTP(rw, r)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-09-08 18:04:56 +00:00
|
|
|
ps.log.WithField("host", host).Warning("no app for hostname")
|
|
|
|
rw.WriteHeader(400)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
ps.log.WithField("host", host).Trace("passing to application mux")
|
|
|
|
a.ServeHTTP(rw, r)
|
|
|
|
}
|