diff options
| author | Felix Hanley <felix@userspace.com.au> | 2016-05-11 07:43:19 +0000 |
|---|---|---|
| committer | Felix Hanley <felix@userspace.com.au> | 2016-05-11 07:43:19 +0000 |
| commit | 01d4169b551675aa04e9075915113d2e94fdb72d (patch) | |
| tree | 0eaad50b248928795ba6c5c24873b7b84b0bca09 /src/dict2rest/vendor/github.com/rs/xhandler/middleware.go | |
| parent | a5be2d0a2f450dd2e2c699e45773016528d43876 (diff) | |
| download | go-dict2rest-01d4169b551675aa04e9075915113d2e94fdb72d.tar.gz go-dict2rest-01d4169b551675aa04e9075915113d2e94fdb72d.tar.bz2 | |
Use Golang 1.6 vendor structure
Diffstat (limited to 'src/dict2rest/vendor/github.com/rs/xhandler/middleware.go')
| -rw-r--r-- | src/dict2rest/vendor/github.com/rs/xhandler/middleware.go | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/src/dict2rest/vendor/github.com/rs/xhandler/middleware.go b/src/dict2rest/vendor/github.com/rs/xhandler/middleware.go new file mode 100644 index 0000000..5de1364 --- /dev/null +++ b/src/dict2rest/vendor/github.com/rs/xhandler/middleware.go @@ -0,0 +1,59 @@ +package xhandler + +import ( + "net/http" + "time" + + "golang.org/x/net/context" +) + +// CloseHandler returns a Handler cancelling the context when the client +// connection close unexpectedly. +func CloseHandler(next HandlerC) HandlerC { + return HandlerFuncC(func(ctx context.Context, w http.ResponseWriter, r *http.Request) { + // Cancel the context if the client closes the connection + if wcn, ok := w.(http.CloseNotifier); ok { + var cancel context.CancelFunc + ctx, cancel = context.WithCancel(ctx) + defer cancel() + + notify := wcn.CloseNotify() + go func() { + select { + case <-notify: + cancel() + case <-ctx.Done(): + } + }() + } + + next.ServeHTTPC(ctx, w, r) + }) +} + +// TimeoutHandler returns a Handler which adds a timeout to the context. +// +// Child handlers have the responsability to obey the context deadline and to return +// an appropriate error (or not) response in case of timeout. +func TimeoutHandler(timeout time.Duration) func(next HandlerC) HandlerC { + return func(next HandlerC) HandlerC { + return HandlerFuncC(func(ctx context.Context, w http.ResponseWriter, r *http.Request) { + ctx, _ = context.WithTimeout(ctx, timeout) + next.ServeHTTPC(ctx, w, r) + }) + } +} + +// If is a special handler that will skip insert the condNext handler only if a condition +// applies at runtime. +func If(cond func(ctx context.Context, w http.ResponseWriter, r *http.Request) bool, condNext func(next HandlerC) HandlerC) func(next HandlerC) HandlerC { + return func(next HandlerC) HandlerC { + return HandlerFuncC(func(ctx context.Context, w http.ResponseWriter, r *http.Request) { + if cond(ctx, w, r) { + condNext(next).ServeHTTPC(ctx, w, r) + } else { + next.ServeHTTPC(ctx, w, r) + } + }) + } +} |
