experimental.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package router
  2. import (
  3. "net/http"
  4. "golang.org/x/net/context"
  5. "github.com/docker/docker/api/server/httputils"
  6. )
  7. // ExperimentalRoute defines an experimental API route that can be enabled or disabled.
  8. type ExperimentalRoute interface {
  9. Route
  10. Enable()
  11. Disable()
  12. }
  13. // experimentalRoute defines an experimental API route that can be enabled or disabled.
  14. // It implements ExperimentalRoute
  15. type experimentalRoute struct {
  16. local Route
  17. handler httputils.APIFunc
  18. }
  19. // Enable enables this experimental route
  20. func (r *experimentalRoute) Enable() {
  21. r.handler = r.local.Handler()
  22. }
  23. // Disable disables the experimental route
  24. func (r *experimentalRoute) Disable() {
  25. r.handler = experimentalHandler
  26. }
  27. type notImplementedError struct{}
  28. func (notImplementedError) Error() string {
  29. return "This experimental feature is disabled by default. Start the Docker daemon in experimental mode in order to enable it."
  30. }
  31. func (notImplementedError) NotImplemented() {}
  32. func experimentalHandler(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
  33. return notImplementedError{}
  34. }
  35. // Handler returns returns the APIFunc to let the server wrap it in middlewares.
  36. func (r *experimentalRoute) Handler() httputils.APIFunc {
  37. return r.handler
  38. }
  39. // Method returns the http method that the route responds to.
  40. func (r *experimentalRoute) Method() string {
  41. return r.local.Method()
  42. }
  43. // Path returns the subpath where the route responds to.
  44. func (r *experimentalRoute) Path() string {
  45. return r.local.Path()
  46. }
  47. // Experimental will mark a route as experimental.
  48. func Experimental(r Route) Route {
  49. return &experimentalRoute{
  50. local: r,
  51. handler: experimentalHandler,
  52. }
  53. }