mirror of https://github.com/docker/docs.git
61 lines
1.9 KiB
Go
61 lines
1.9 KiB
Go
package utils
|
|
|
|
import (
|
|
"net/http"
|
|
|
|
"github.com/endophage/go-tuf/signed"
|
|
"github.com/gorilla/mux"
|
|
|
|
"github.com/docker/vetinari/errors"
|
|
)
|
|
|
|
// contextHandler defines an alterate HTTP handler interface which takes in
|
|
// a context for authorization and returns an HTTP application error.
|
|
type contextHandler func(ctx Context, w http.ResponseWriter, r *http.Request) *errors.HTTPError
|
|
|
|
// rootHandler is an implementation of an HTTP request handler which handles
|
|
// authorization and calling out to the defined alternate http handler.
|
|
type rootHandler struct {
|
|
handler contextHandler
|
|
auth Authorizer
|
|
scopes []Scope
|
|
context ContextFactory
|
|
trust signed.TrustService
|
|
}
|
|
|
|
// RootHandlerFactory creates a new rootHandler factory using the given
|
|
// Context creator and authorizer. The returned factory allows creating
|
|
// new rootHandlers from the alternate http handler contextHandler and
|
|
// a scope.
|
|
func RootHandlerFactory(auth Authorizer, ctxFac ContextFactory, trust signed.TrustService) func(contextHandler, ...Scope) *rootHandler {
|
|
return func(handler contextHandler, scopes ...Scope) *rootHandler {
|
|
return &rootHandler{handler, auth, scopes, ctxFac, trust}
|
|
}
|
|
}
|
|
|
|
// ServeHTTP serves an HTTP request and implements the http.Handler interface.
|
|
func (root *rootHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
|
ctx := root.context(r, root.trust)
|
|
if err := root.auth.Authorize(ctx, root.scopes...); err != nil {
|
|
http.Error(w, err.Error(), http.StatusUnauthorized)
|
|
return
|
|
}
|
|
if err := root.handler(ctx, w, r); err != nil {
|
|
// TODO: Log error
|
|
http.Error(w, err.Error(), err.HTTPStatus)
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
// ResourceName parses the name of the resource being accessed from the request.
|
|
// It relies on gorilla mux being used and will need to be updated if that
|
|
// changes
|
|
func ResourceName(r *http.Request) string {
|
|
params := mux.Vars(r)
|
|
if resource, ok := params["imageName"]; ok {
|
|
return resource
|
|
}
|
|
return ""
|
|
}
|