/
filter.go
62 lines (52 loc) · 1.44 KB
/
filter.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package streamango
import (
"github.com/paulbellamy/mango"
"net/http"
)
type filteredResponseWriter struct {
filter BodyFilter
rw http.ResponseWriter
}
func (w *filteredResponseWriter) Header() (h http.Header) {
h = w.rw.Header()
h.Del("Content-Length")
return h
}
func (w *filteredResponseWriter) Write(p []byte) (int, error) {
return w.filter.Write(p)
}
func (w *filteredResponseWriter) WriteHeader(h int) {
w.rw.WriteHeader(h)
}
func newwriter(w http.ResponseWriter, env mango.Env, filter BodyFilter) (brw *filteredResponseWriter, err error) {
brw = &filteredResponseWriter{filter: filter, rw: w}
err = filter.Init(env, w)
return
}
type BodyFilter interface {
Init(env mango.Env, w http.ResponseWriter) (err error)
Write(p []byte) (int, error)
Flush() error
}
func FilteredFunc(stack *mango.Stack, streamer http.HandlerFunc, filter BodyFilter) http.HandlerFunc {
compiled_app := stack.Compile(streamerapp(streamer))
return func(w http.ResponseWriter, r *http.Request) {
env := make(map[string]interface{})
env["mango.request"] = &mango.Request{r}
env["mango.bodyfilter"] = filter
env["mango.writer"] = w
status, headers, body := compiled_app(env)
_, streaming := env["streamango.streaming"]
// streaming, so don't need to do
if streaming {
return
}
for key, values := range headers {
for _, value := range values {
w.Header().Add(key, value)
}
}
w.WriteHeader(int(status))
w.Write([]byte(body))
}
}