mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
api/server/router: add Cancellable function
Signed-off-by: Alexander Morozov <lk4d4@docker.com>
This commit is contained in:
parent
7307998a44
commit
bdd9388c42
1 changed files with 36 additions and 1 deletions
|
@ -1,6 +1,11 @@
|
||||||
package router
|
package router
|
||||||
|
|
||||||
import "github.com/docker/docker/api/server/httputils"
|
import (
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"github.com/docker/docker/api/server/httputils"
|
||||||
|
"golang.org/x/net/context"
|
||||||
|
)
|
||||||
|
|
||||||
// localRoute defines an individual API route to connect
|
// localRoute defines an individual API route to connect
|
||||||
// with the docker daemon. It implements Route.
|
// with the docker daemon. It implements Route.
|
||||||
|
@ -59,3 +64,33 @@ func NewOptionsRoute(path string, handler httputils.APIFunc) Route {
|
||||||
func NewHeadRoute(path string, handler httputils.APIFunc) Route {
|
func NewHeadRoute(path string, handler httputils.APIFunc) Route {
|
||||||
return NewRoute("HEAD", path, handler)
|
return NewRoute("HEAD", path, handler)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func cancellableHandler(h httputils.APIFunc) httputils.APIFunc {
|
||||||
|
return func(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
||||||
|
if notifier, ok := w.(http.CloseNotifier); ok {
|
||||||
|
notify := notifier.CloseNotify()
|
||||||
|
notifyCtx, cancel := context.WithCancel(ctx)
|
||||||
|
finished := make(chan struct{})
|
||||||
|
defer close(finished)
|
||||||
|
ctx = notifyCtx
|
||||||
|
go func() {
|
||||||
|
select {
|
||||||
|
case <-notify:
|
||||||
|
cancel()
|
||||||
|
case <-finished:
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
return h(ctx, w, r, vars)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cancellable makes new route which embeds http.CloseNotifier feature to
|
||||||
|
// context.Context of handler.
|
||||||
|
func Cancellable(r Route) Route {
|
||||||
|
return localRoute{
|
||||||
|
method: r.Method(),
|
||||||
|
path: r.Path(),
|
||||||
|
handler: cancellableHandler(r.Handler()),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue