X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/76cc598a22d58cd889ad41b47ef061bde90c9f52..be0cdc7814a49fa093b86b698a9756971ba80fcf:/services/keep-web/handler.go diff --git a/services/keep-web/handler.go b/services/keep-web/handler.go index 389ab73a0c..517ec1a2a2 100644 --- a/services/keep-web/handler.go +++ b/services/keep-web/handler.go @@ -10,10 +10,10 @@ import ( "html" "html/template" "io" - "log" "net/http" "net/url" "os" + "path/filepath" "sort" "strconv" "strings" @@ -25,6 +25,7 @@ import ( "git.curoverse.com/arvados.git/sdk/go/health" "git.curoverse.com/arvados.git/sdk/go/httpserver" "git.curoverse.com/arvados.git/sdk/go/keepclient" + log "github.com/Sirupsen/logrus" "golang.org/x/net/webdav" ) @@ -163,6 +164,12 @@ var ( "HEAD": true, "POST": true, } + // top-level dirs to serve with siteFS + siteFSDir = map[string]bool{ + "": true, // root directory + "by_id": true, + "users": true, + } ) // ServeHTTP implements http.Handler. @@ -184,13 +191,12 @@ func (h *handler) ServeHTTP(wOrig http.ResponseWriter, r *http.Request) { } else if w.WroteStatus() == 0 { w.WriteHeader(statusCode) } else if w.WroteStatus() != statusCode { - httpserver.Log(r.RemoteAddr, "WARNING", + log.WithField("RequestID", r.Header.Get("X-Request-Id")).Warn( fmt.Sprintf("Our status changed from %d to %d after we sent headers", w.WroteStatus(), statusCode)) } if statusText == "" { statusText = http.StatusText(statusCode) } - httpserver.Log(remoteAddr, statusCode, statusText, w.WroteBodyBytes(), r.Method, r.Host, r.URL.Path, r.URL.RawQuery) }() if strings.HasPrefix(r.URL.Path, "/_health/") && r.Method == "GET" { @@ -250,7 +256,7 @@ func (h *handler) ServeHTTP(wOrig http.ResponseWriter, r *http.Request) { } else if r.URL.Path == "/status.json" { h.serveStatus(w, r) return - } else if r.URL.Path == "/" || (len(pathParts) >= 1 && pathParts[0] == "users") { + } else if siteFSDir[pathParts[0]] { useSiteFS = true } else if len(pathParts) >= 1 && strings.HasPrefix(pathParts[0], "c=") { // /c=ID[/PATH...] @@ -307,6 +313,14 @@ func (h *handler) ServeHTTP(wOrig http.ResponseWriter, r *http.Request) { return } + if useSiteFS { + if tokens == nil { + tokens = auth.NewCredentialsFromHTTPRequest(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... @@ -328,11 +342,6 @@ func (h *handler) ServeHTTP(wOrig http.ResponseWriter, r *http.Request) { tokens = append(reqTokens, h.Config.AnonymousTokens...) } - if useSiteFS { - h.serveSiteFS(w, r, tokens, credentialsOK) - return - } - if len(targetPath) > 0 && targetPath[0] == "_" { // If a collection has a directory called "t=foo" or // "_", it can be served at @@ -410,6 +419,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 { @@ -417,11 +427,11 @@ func (h *handler) ServeHTTP(wOrig http.ResponseWriter, r *http.Request) { } applyContentDispositionHdr(w, r, basename, attachment) - client := &arvados.Client{ + client := (&arvados.Client{ APIHost: arv.ApiServer, AuthToken: arv.ApiToken, Insecure: arv.ApiInsecure, - } + }).WithRequestID(r.Header.Get("X-Request-Id")) fs, err := collection.FileSystem(client, kc) if err != nil { @@ -499,7 +509,7 @@ func (h *handler) ServeHTTP(wOrig http.ResponseWriter, r *http.Request) { } } -func (h *handler) serveSiteFS(w http.ResponseWriter, r *http.Request, tokens []string, credentialsOK bool) { +func (h *handler) serveSiteFS(w http.ResponseWriter, r *http.Request, tokens []string, credentialsOK, attachment bool) { if len(tokens) == 0 { w.Header().Add("WWW-Authenticate", "Basic realm=\"collections\"") http.Error(w, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized) @@ -522,11 +532,12 @@ func (h *handler) serveSiteFS(w http.ResponseWriter, r *http.Request, tokens []s http.Error(w, err.Error(), http.StatusInternalServerError) return } - client := &arvados.Client{ + kc.RequestID = r.Header.Get("X-Request-Id") + client := (&arvados.Client{ APIHost: arv.ApiServer, AuthToken: arv.ApiToken, Insecure: arv.ApiInsecure, - } + }).WithRequestID(r.Header.Get("X-Request-Id")) fs := client.SiteFileSystem(kc) f, err := fs.Open(r.URL.Path) if os.IsNotExist(err) { @@ -545,6 +556,10 @@ func (h *handler) serveSiteFS(w http.ResponseWriter, r *http.Request, tokens []s } return } + if r.Method == "GET" { + _, basename := filepath.Split(r.URL.Path) + applyContentDispositionHdr(w, r, basename, attachment) + } wh := webdav.Handler{ Prefix: "/", FileSystem: &webdavFS{ @@ -604,9 +619,9 @@ the entire directory tree with wget, try: