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"
18 Cluster *arvados.Cluster
21 handlerStack http.Handler
22 proxyClient *arvados.Client
25 func (h *Handler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
26 h.setupOnce.Do(h.setup)
27 h.handlerStack.ServeHTTP(w, req)
30 func (h *Handler) setup() {
31 mux := http.NewServeMux()
32 mux.Handle("/_health/", &health.Handler{
33 Token: h.Cluster.ManagementToken,
36 mux.Handle("/", http.HandlerFunc(h.proxyRailsAPI))
40 func (h *Handler) proxyRailsAPI(w http.ResponseWriter, incomingReq *http.Request) {
41 url, err := findRailsAPI(h.Cluster)
43 http.Error(w, err.Error(), http.StatusInternalServerError)
47 req.URL.Host = url.Host
48 resp, err := arvados.InsecureHTTPClient.Do(&req)
50 http.Error(w, err.Error(), http.StatusInternalServerError)
53 for k, v := range resp.Header {
58 w.WriteHeader(resp.StatusCode)
62 // For now, findRailsAPI always uses the rails API running on this
64 func findRailsAPI(cluster *arvados.Cluster) (*url.URL, error) {
65 node, err := cluster.GetThisSystemNode()
69 return url.Parse("http://" + node.RailsAPI.Listen)