Files
explorer-monorepo/backend/api/rest/routes_proxy.go

58 lines
1.5 KiB
Go

package rest
import (
"fmt"
"net/http"
"net/http/httputil"
"net/url"
"os"
"strings"
)
func (s *Server) handleRouteDecisionTree(w http.ResponseWriter, r *http.Request) {
s.proxyRouteTreeEndpoint(w, r, "/api/v1/routes/tree")
}
func (s *Server) handleRouteDepth(w http.ResponseWriter, r *http.Request) {
s.proxyRouteTreeEndpoint(w, r, "/api/v1/routes/depth")
}
func (s *Server) proxyRouteTreeEndpoint(w http.ResponseWriter, r *http.Request, path string) {
if r.Method != http.MethodGet {
writeMethodNotAllowed(w)
return
}
baseURL := strings.TrimSpace(firstNonEmptyEnv(
"TOKEN_AGGREGATION_API_BASE",
"TOKEN_AGGREGATION_URL",
"TOKEN_AGGREGATION_BASE_URL",
))
if baseURL == "" {
writeError(w, http.StatusServiceUnavailable, "service_unavailable", "token aggregation api base url is not configured")
return
}
target, err := url.Parse(strings.TrimRight(baseURL, "/"))
if err != nil {
writeError(w, http.StatusBadGateway, "bad_gateway", fmt.Sprintf("invalid token aggregation api base url: %v", err))
return
}
proxy := httputil.NewSingleHostReverseProxy(target)
proxy.ErrorHandler = func(rw http.ResponseWriter, req *http.Request, proxyErr error) {
writeError(rw, http.StatusBadGateway, "bad_gateway", fmt.Sprintf("route tree proxy failed for %s: %v", path, proxyErr))
}
proxy.ServeHTTP(w, r)
}
func firstNonEmptyEnv(keys ...string) string {
for _, key := range keys {
if value := strings.TrimSpace(os.Getenv(key)); value != "" {
return value
}
}
return ""
}