fix: multivalue tags
This commit is contained in:
34
http/data.go
34
http/data.go
@@ -48,9 +48,32 @@ func (d *data) Check(path string) bool {
|
||||
}
|
||||
|
||||
func handle(fn handleFunc, prefix string, store *storage.Storage, server *settings.Server) http.Handler {
|
||||
handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
// trackingWriter wraps the ResponseWriter to detect if headers/body were already written.
|
||||
type trackingWriter struct {
|
||||
http.ResponseWriter
|
||||
wroteHeader bool
|
||||
wroteBody bool
|
||||
}
|
||||
func (tw *trackingWriter) WriteHeader(code int) {
|
||||
if !tw.wroteHeader {
|
||||
tw.wroteHeader = true
|
||||
tw.ResponseWriter.WriteHeader(code)
|
||||
}
|
||||
}
|
||||
func (tw *trackingWriter) Write(b []byte) (int, error) {
|
||||
// Any Write implies headers committed (status 200 if none set)
|
||||
if !tw.wroteHeader {
|
||||
tw.wroteHeader = true
|
||||
}
|
||||
tw.wroteBody = true
|
||||
return tw.ResponseWriter.Write(b)
|
||||
}
|
||||
|
||||
handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
// Wrap writer to prevent superfluous WriteHeader calls
|
||||
tw := &trackingWriter{ResponseWriter: w}
|
||||
for k, v := range globalHeaders {
|
||||
w.Header().Set(k, v)
|
||||
tw.Header().Set(k, v)
|
||||
}
|
||||
|
||||
settings, err := store.Settings.Get()
|
||||
@@ -59,7 +82,7 @@ func handle(fn handleFunc, prefix string, store *storage.Storage, server *settin
|
||||
return
|
||||
}
|
||||
|
||||
status, err := fn(w, r, &data{
|
||||
status, err := fn(tw, r, &data{
|
||||
Runner: &runner.Runner{Enabled: server.EnableExec, Settings: settings},
|
||||
store: store,
|
||||
settings: settings,
|
||||
@@ -76,7 +99,10 @@ func handle(fn handleFunc, prefix string, store *storage.Storage, server *settin
|
||||
if status == http.StatusBadRequest && err != nil {
|
||||
txt += " (" + err.Error() + ")"
|
||||
}
|
||||
http.Error(w, strconv.Itoa(status)+" "+txt, status)
|
||||
// Only write an error response if nothing was written yet.
|
||||
if !tw.wroteHeader && !tw.wroteBody {
|
||||
http.Error(tw, strconv.Itoa(status)+" "+txt, status)
|
||||
}
|
||||
return
|
||||
}
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user