Files
threshold/internal/servers/controller/handler_ui.go
T
Jeff Mitchell c05324282f Rename the UI passthrough dir flag/env var (#1600)
This puts it more in line with other upcoming options that use "dir"
instead of "directory" (plus it's easier to type), and makes it clear
that this directory and the passthrough behavior is related to the UI as
opposed to other upcoming items.
2021-10-14 12:13:07 -04:00

61 lines
1.3 KiB
Go

//go:build ui
// +build ui
package controller
import (
"net/http"
"strings"
"github.com/hashicorp/boundary/internal/ui"
)
func init() {
handleUi = handleUiWithAssets
}
func handleUiWithAssets(c *Controller) http.Handler {
var nextHandler http.Handler
if c.conf.RawConfig.DevUiPassthroughDir != "" {
nextHandler = devUiPassthroughHandler(c.conf.RawConfig.DevUiPassthroughDir)
} else {
nextHandler = ui.Handler()
}
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodGet {
w.WriteHeader(http.StatusMethodNotAllowed)
return
}
dotIndex := strings.LastIndex(r.URL.Path, ".")
switch dotIndex {
case -1:
// For all paths without an extension serve /index.html
r.URL.Path = "/"
default:
switch r.URL.Path {
case "/", "/favicon.png", "/assets/styles.css":
default:
for i := dotIndex + 1; i < len(r.URL.Path); i++ {
intVal := r.URL.Path[i]
// Current guidance from FE is if it's only alphanum after
// the last dot, treat it as an extension
if intVal < '0' ||
(intVal > '9' && intVal < 'A') ||
(intVal > 'Z' && intVal < 'a') ||
intVal > 'z' {
// Not an extension. Serve the contents of index.html
r.URL.Path = "/"
}
}
}
}
// Fall through to the next handler
nextHandler.ServeHTTP(w, r)
})
}