|
- package handlers
-
- import (
- "net/http"
- )
-
- // Interface giving easy access to the most common augmented features.
- type GhostWriter interface {
- http.ResponseWriter
- UserName() string
- User() interface{}
- Context() map[interface{}]interface{}
- Session() *Session
- }
-
- // Internal implementation of the GhostWriter interface.
- type ghostWriter struct {
- http.ResponseWriter
- userName string
- user interface{}
- ctx map[interface{}]interface{}
- ssn *Session
- }
-
- func (this *ghostWriter) UserName() string {
- return this.userName
- }
-
- func (this *ghostWriter) User() interface{} {
- return this.user
- }
-
- func (this *ghostWriter) Context() map[interface{}]interface{} {
- return this.ctx
- }
-
- func (this *ghostWriter) Session() *Session {
- return this.ssn
- }
-
- // Convenience handler that wraps a custom function with direct access to the
- // authenticated user, context and session on the writer.
- func GhostHandlerFunc(h func(w GhostWriter, r *http.Request)) http.HandlerFunc {
- return func(w http.ResponseWriter, r *http.Request) {
- if gw, ok := getGhostWriter(w); ok {
- // Self-awareness
- h(gw, r)
- return
- }
- uid, _ := GetUserName(w)
- usr, _ := GetUser(w)
- ctx, _ := GetContext(w)
- ssn, _ := GetSession(w)
- gw := &ghostWriter{
- w,
- uid,
- usr,
- ctx,
- ssn,
- }
- h(gw, r)
- }
- }
-
- // Check the writer chain to find a ghostWriter.
- func getGhostWriter(w http.ResponseWriter) (*ghostWriter, bool) {
- gw, ok := GetResponseWriter(w, func(tst http.ResponseWriter) bool {
- _, ok := tst.(*ghostWriter)
- return ok
- })
- if ok {
- return gw.(*ghostWriter), true
- }
- return nil, false
- }
|