X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/08b96e3ff47ef0f3b147442c14d6f5e404c93540..c3c538444c15e68e96780f157935f2baa4ba0bc5:/services/keep-web/handler.go diff --git a/services/keep-web/handler.go b/services/keep-web/handler.go index 63e2f37a80..95948e3250 100644 --- a/services/keep-web/handler.go +++ b/services/keep-web/handler.go @@ -31,6 +31,7 @@ import ( type handler struct { Config *Config + MetricsAPI http.Handler clientPool *arvadosclient.ClientPool setupOnce sync.Once healthHandler http.Handler @@ -90,14 +91,7 @@ func (h *handler) setup() { } func (h *handler) serveStatus(w http.ResponseWriter, r *http.Request) { - status := struct { - cacheStats - Version string - }{ - cacheStats: h.Config.Cache.Stats(), - Version: version, - } - json.NewEncoder(w).Encode(status) + json.NewEncoder(w).Encode(struct{ Version string }{version}) } // updateOnSuccess wraps httpserver.ResponseWriter. If the handler @@ -141,6 +135,11 @@ func (uos *updateOnSuccess) WriteHeader(code int) { } var ( + corsAllowHeadersHeader = strings.Join([]string{ + "Authorization", "Content-Type", "Range", + // WebDAV request headers: + "Depth", "Destination", "If", "Lock-Token", "Overwrite", "Timeout", + }, ", ") writeMethod = map[string]bool{ "COPY": true, "DELETE": true, @@ -183,6 +182,9 @@ func (h *handler) ServeHTTP(wOrig http.ResponseWriter, r *http.Request) { if xff := r.Header.Get("X-Forwarded-For"); xff != "" { remoteAddr = xff + "," + remoteAddr } + if xfp := r.Header.Get("X-Forwarded-Proto"); xfp != "" && xfp != "http" { + r.URL.Scheme = xfp + } w := httpserver.WrapResponseWriter(wOrig) defer func() { @@ -209,7 +211,7 @@ func (h *handler) ServeHTTP(wOrig http.ResponseWriter, r *http.Request) { statusCode = http.StatusMethodNotAllowed return } - w.Header().Set("Access-Control-Allow-Headers", "Authorization, Content-Type, Range") + w.Header().Set("Access-Control-Allow-Headers", corsAllowHeadersHeader) w.Header().Set("Access-Control-Allow-Methods", "COPY, DELETE, GET, MKCOL, MOVE, OPTIONS, POST, PROPFIND, PUT, RMCOL") w.Header().Set("Access-Control-Allow-Origin", "*") w.Header().Set("Access-Control-Max-Age", "86400") @@ -256,6 +258,9 @@ func (h *handler) ServeHTTP(wOrig http.ResponseWriter, r *http.Request) { } else if r.URL.Path == "/status.json" { h.serveStatus(w, r) return + } else if strings.HasPrefix(r.URL.Path, "/metrics") { + h.MetricsAPI.ServeHTTP(w, r) + return } else if siteFSDir[pathParts[0]] { useSiteFS = true } else if len(pathParts) >= 1 && strings.HasPrefix(pathParts[0], "c=") { @@ -313,6 +318,14 @@ func (h *handler) ServeHTTP(wOrig http.ResponseWriter, r *http.Request) { return } + if useSiteFS { + if tokens == nil { + tokens = auth.CredentialsFromRequest(r).Tokens + } + h.serveSiteFS(w, r, tokens, credentialsOK, attachment) + return + } + targetPath := pathParts[stripParts:] if tokens == nil && len(targetPath) > 0 && strings.HasPrefix(targetPath[0], "t=") { // http://ID.example/t=TOKEN/PATH... @@ -329,16 +342,11 @@ func (h *handler) ServeHTTP(wOrig http.ResponseWriter, r *http.Request) { if tokens == nil { if credentialsOK { - reqTokens = auth.NewCredentialsFromHTTPRequest(r).Tokens + reqTokens = auth.CredentialsFromRequest(r).Tokens } tokens = append(reqTokens, h.Config.AnonymousTokens...) } - if useSiteFS { - h.serveSiteFS(w, r, tokens, credentialsOK, attachment) - return - } - if len(targetPath) > 0 && targetPath[0] == "_" { // If a collection has a directory called "t=foo" or // "_", it can be served at @@ -416,6 +424,7 @@ func (h *handler) ServeHTTP(wOrig http.ResponseWriter, r *http.Request) { statusCode, statusText = http.StatusInternalServerError, err.Error() return } + kc.RequestID = r.Header.Get("X-Request-Id") var basename string if len(targetPath) > 0 { @@ -528,6 +537,7 @@ func (h *handler) serveSiteFS(w http.ResponseWriter, r *http.Request, tokens []s http.Error(w, err.Error(), http.StatusInternalServerError) return } + kc.RequestID = r.Header.Get("X-Request-Id") client := (&arvados.Client{ APIHost: arv.ApiServer, AuthToken: arv.ApiToken, @@ -614,9 +624,9 @@ the entire directory tree with wget, try:

@@ -768,6 +778,7 @@ func (h *handler) seeOtherWithCookie(w http.ResponseWriter, r *http.Request, loc u = newu } redir := (&url.URL{ + Scheme: r.URL.Scheme, Host: r.Host, Path: u.Path, RawQuery: redirQuery.Encode(),