1
// Copyright 2016 Canonical Ltd.
2
// Licensed under the AGPLv3, see LICENCE file for details.
4
package v4 // import "gopkg.in/juju/charmstore.v5-unstable/internal/v4"
10
"gopkg.in/juju/charm.v6-unstable"
11
"gopkg.in/juju/charmrepo.v2-unstable/csclient/params"
13
"gopkg.in/juju/charmstore.v5-unstable/internal/router"
14
"gopkg.in/juju/charmstore.v5-unstable/internal/v5"
17
// serveArchive returns a handler for /archive that falls back to v5ServeArchive
18
// for all operations not handled by v4.
19
func (h ReqHandler) serveArchive(v5ServeArchive router.IdHandler) router.IdHandler {
20
get := h.ResolvedIdHandler(h.serveGetArchive)
21
return func(id *charm.URL, w http.ResponseWriter, req *http.Request) error {
22
if req.Method == "GET" {
23
return get(id, w, req)
25
return v5ServeArchive(id, w, req)
29
func (h ReqHandler) serveGetArchive(id *router.ResolvedURL, w http.ResponseWriter, req *http.Request) error {
30
if err := h.AuthorizeEntityForOp(id, req, v5.OpReadWithTerms); err != nil {
31
return errgo.Mask(err, errgo.Any)
33
blob, err := h.Store.OpenBlobPreV5(id)
35
return errgo.Mask(err, errgo.Is(params.ErrNotFound))
38
h.SendEntityArchive(id, w, req, blob)
42
// GET id/archive/path
43
// https://github.com/juju/charmstore/blob/v4/docs/API.md#get-idarchivepath
44
func (h ReqHandler) serveArchiveFile(id *router.ResolvedURL, w http.ResponseWriter, req *http.Request) error {
45
blob, err := h.Store.OpenBlobPreV5(id)
47
return errgo.Notef(err, "cannot open archive data for %v", id)
50
return h.ServeBlobFile(w, req, id, blob)