From bf34e9d62dc5cbe0ad7939faaea227ae38a4a417 Mon Sep 17 00:00:00 2001 From: Alexander Neumann Date: Tue, 23 Jan 2018 23:23:16 +0100 Subject: [PATCH] Implement amended API protocol v2 The version is now selected via the HTTP request header "Accept". --- handlers.go | 21 +++++++++++++++++++++ mux.go | 2 -- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/handlers.go b/handlers.go index f4299a6..1a61a8a 100644 --- a/handlers.go +++ b/handlers.go @@ -254,11 +254,30 @@ func DeleteConfig(w http.ResponseWriter, r *http.Request) { } } +const ( + mimeTypeAPIV1 = "application/vnd.x.restic.rest.v1" + mimeTypeAPIV2 = "application/vnd.x.restic.rest.v2" +) + // ListBlobs lists all blobs of a given type in an arbitrary order. func ListBlobs(w http.ResponseWriter, r *http.Request) { if Config.Debug { log.Println("ListBlobs()") } + + switch r.Header.Get("Accept") { + case mimeTypeAPIV2: + ListBlobsV2(w, r) + default: + ListBlobsV1(w, r) + } +} + +// ListBlobsV1 lists all blobs of a given type in an arbitrary order. +func ListBlobsV1(w http.ResponseWriter, r *http.Request) { + if Config.Debug { + log.Println("ListBlobsV1()") + } fileType := pat.Param(r, "type") path, err := getPath(r, fileType) if err != nil { @@ -305,6 +324,7 @@ func ListBlobs(w http.ResponseWriter, r *http.Request) { return } + w.Header().Set("Content-Type", mimeTypeAPIV1) _, _ = w.Write(data) } @@ -365,6 +385,7 @@ func ListBlobsV2(w http.ResponseWriter, r *http.Request) { return } + w.Header().Set("Content-Type", mimeTypeAPIV2) _, _ = w.Write(data) } diff --git a/mux.go b/mux.go index 307a403..591f8b3 100644 --- a/mux.go +++ b/mux.go @@ -72,8 +72,6 @@ func NewMux() *goji.Mux { mux.HandleFunc(pat.Post("/:repo/config"), SaveConfig) mux.HandleFunc(pat.Delete("/config"), DeleteConfig) mux.HandleFunc(pat.Delete("/:repo/config"), DeleteConfig) - mux.HandleFunc(pat.Get("/v2/:type/"), ListBlobsV2) - mux.HandleFunc(pat.Get("/v2/:repo/:type/"), ListBlobsV2) mux.HandleFunc(pat.Get("/:type/"), ListBlobs) mux.HandleFunc(pat.Get("/:repo/:type/"), ListBlobs) mux.HandleFunc(pat.Head("/:type/:name"), CheckBlob)