aboutsummaryrefslogtreecommitdiff
path: root/src/dict2rest/vendor/github.com/rs/xhandler/middleware.go
diff options
context:
space:
mode:
authorFelix Hanley <felix@userspace.com.au>2016-05-11 07:43:19 +0000
committerFelix Hanley <felix@userspace.com.au>2016-05-11 07:43:19 +0000
commit01d4169b551675aa04e9075915113d2e94fdb72d (patch)
tree0eaad50b248928795ba6c5c24873b7b84b0bca09 /src/dict2rest/vendor/github.com/rs/xhandler/middleware.go
parenta5be2d0a2f450dd2e2c699e45773016528d43876 (diff)
downloadgo-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.go59
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)
+ }
+ })
+ }
+}