aboutsummaryrefslogtreecommitdiff
path: root/vendor/github.com/go-martini/martini/return_handler.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/go-martini/martini/return_handler.go')
-rw-r--r--vendor/github.com/go-martini/martini/return_handler.go43
1 files changed, 43 insertions, 0 deletions
diff --git a/vendor/github.com/go-martini/martini/return_handler.go b/vendor/github.com/go-martini/martini/return_handler.go
new file mode 100644
index 0000000..4ea8f34
--- /dev/null
+++ b/vendor/github.com/go-martini/martini/return_handler.go
@@ -0,0 +1,43 @@
+package martini
+
+import (
+ "github.com/codegangsta/inject"
+ "net/http"
+ "reflect"
+)
+
+// ReturnHandler is a service that Martini provides that is called
+// when a route handler returns something. The ReturnHandler is
+// responsible for writing to the ResponseWriter based on the values
+// that are passed into this function.
+type ReturnHandler func(Context, []reflect.Value)
+
+func defaultReturnHandler() ReturnHandler {
+ return func(ctx Context, vals []reflect.Value) {
+ rv := ctx.Get(inject.InterfaceOf((*http.ResponseWriter)(nil)))
+ res := rv.Interface().(http.ResponseWriter)
+ var responseVal reflect.Value
+ if len(vals) > 1 && vals[0].Kind() == reflect.Int {
+ res.WriteHeader(int(vals[0].Int()))
+ responseVal = vals[1]
+ } else if len(vals) > 0 {
+ responseVal = vals[0]
+ }
+ if canDeref(responseVal) {
+ responseVal = responseVal.Elem()
+ }
+ if isByteSlice(responseVal) {
+ res.Write(responseVal.Bytes())
+ } else {
+ res.Write([]byte(responseVal.String()))
+ }
+ }
+}
+
+func isByteSlice(val reflect.Value) bool {
+ return val.Kind() == reflect.Slice && val.Type().Elem().Kind() == reflect.Uint8
+}
+
+func canDeref(val reflect.Value) bool {
+ return val.Kind() == reflect.Interface || val.Kind() == reflect.Ptr
+}