experimental.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. package router
  2. import (
  3. "errors"
  4. "net/http"
  5. "golang.org/x/net/context"
  6. apierrors "github.com/docker/docker/api/errors"
  7. "github.com/docker/docker/api/server/httputils"
  8. )
  9. var (
  10. errExperimentalFeature = errors.New("This experimental feature is disabled by default. Start the Docker daemon with --experimental in order to enable it.")
  11. )
  12. // ExperimentalRoute defines an experimental API route that can be enabled or disabled.
  13. type ExperimentalRoute interface {
  14. Route
  15. Enable()
  16. Disable()
  17. }
  18. // experimentalRoute defines an experimental API route that can be enabled or disabled.
  19. // It implements ExperimentalRoute
  20. type experimentalRoute struct {
  21. local Route
  22. handler httputils.APIFunc
  23. }
  24. // Enable enables this experimental route
  25. func (r *experimentalRoute) Enable() {
  26. r.handler = r.local.Handler()
  27. }
  28. // Disable disables the experimental route
  29. func (r *experimentalRoute) Disable() {
  30. r.handler = experimentalHandler
  31. }
  32. func experimentalHandler(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
  33. return apierrors.NewErrorWithStatusCode(errExperimentalFeature, http.StatusNotImplemented)
  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. }