mirror of
https://github.com/dutchcoders/transfer.sh.git
synced 2024-11-24 05:00:18 +01:00
75 lines
1.6 KiB
Go
75 lines
1.6 KiB
Go
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
|
|
}
|