forked from TrueCloudLab/distribution
d08f0edcf1
Routes and errors are now all referenced from a single v2 package. This packages exports are acceptable for use in the server side as well as integration into docker core.
58 lines
1.2 KiB
Go
58 lines
1.2 KiB
Go
package registry
|
|
|
|
import (
|
|
"encoding/json"
|
|
"net/http"
|
|
|
|
"github.com/docker/docker-registry/api/v2"
|
|
"github.com/docker/docker-registry/storage"
|
|
"github.com/gorilla/handlers"
|
|
)
|
|
|
|
// tagsDispatcher constructs the tags handler api endpoint.
|
|
func tagsDispatcher(ctx *Context, r *http.Request) http.Handler {
|
|
tagsHandler := &tagsHandler{
|
|
Context: ctx,
|
|
}
|
|
|
|
return handlers.MethodHandler{
|
|
"GET": http.HandlerFunc(tagsHandler.GetTags),
|
|
}
|
|
}
|
|
|
|
// tagsHandler handles requests for lists of tags under a repository name.
|
|
type tagsHandler struct {
|
|
*Context
|
|
}
|
|
|
|
type tagsAPIResponse struct {
|
|
Name string `json:"name"`
|
|
Tags []string `json:"tags"`
|
|
}
|
|
|
|
// GetTags returns a json list of tags for a specific image name.
|
|
func (th *tagsHandler) GetTags(w http.ResponseWriter, r *http.Request) {
|
|
defer r.Body.Close()
|
|
manifests := th.services.Manifests()
|
|
|
|
tags, err := manifests.Tags(th.Name)
|
|
if err != nil {
|
|
switch err := err.(type) {
|
|
case storage.ErrUnknownRepository:
|
|
w.WriteHeader(404)
|
|
th.Errors.Push(v2.ErrorCodeNameUnknown, map[string]string{"name": th.Name})
|
|
default:
|
|
th.Errors.PushErr(err)
|
|
}
|
|
return
|
|
}
|
|
|
|
enc := json.NewEncoder(w)
|
|
if err := enc.Encode(tagsAPIResponse{
|
|
Name: th.Name,
|
|
Tags: tags,
|
|
}); err != nil {
|
|
th.Errors.PushErr(err)
|
|
return
|
|
}
|
|
}
|