1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
13 "git.curoverse.com/arvados.git/sdk/go/arvados"
14 "git.curoverse.com/arvados.git/sdk/go/health"
15 "git.curoverse.com/arvados.git/sdk/go/httpserver"
19 Cluster *arvados.Cluster
23 handlerStack http.Handler
24 proxyClient *arvados.Client
27 func (h *Handler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
28 h.setupOnce.Do(h.setup)
29 h.handlerStack.ServeHTTP(w, req)
32 func (h *Handler) setup() {
33 h.mux.Handle("/_health/", &health.Handler{
34 Token: h.Cluster.ManagementToken,
37 h.mux.Handle("/", http.HandlerFunc(h.proxyRailsAPI))
38 h.handlerStack = httpserver.LogRequests(&h.mux)
41 func (h *Handler) proxyRailsAPI(w http.ResponseWriter, incomingReq *http.Request) {
42 url, err := findRailsAPI(h.Cluster)
44 http.Error(w, err.Error(), http.StatusInternalServerError)
48 req.URL.Host = url.Host
49 resp, err := arvados.InsecureHTTPClient.Do(&req)
51 http.Error(w, err.Error(), http.StatusInternalServerError)
54 for k, v := range resp.Header {
59 w.WriteHeader(resp.StatusCode)
63 // For now, findRailsAPI always uses the rails API running on this
65 func findRailsAPI(cluster *arvados.Cluster) (*url.URL, error) {
66 node, err := cluster.GetThisSystemNode()
70 return url.Parse("http://" + node.RailsAPI.Listen)