experimental.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. package router // import "github.com/docker/docker/api/server/router"
  2. import (
  3. "context"
  4. "net/http"
  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 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. }