http: Make methods of .Data.Res actually work
This commit is contained in:
parent
3c9eb01790
commit
6f635825a9
66
http.go
66
http.go
@ -1,66 +0,0 @@
|
|||||||
package step
|
|
||||||
|
|
||||||
import "io"
|
|
||||||
import "bytes"
|
|
||||||
import "net/http"
|
|
||||||
|
|
||||||
// HTTPData represents information about an ongoing HTTP request that is made
|
|
||||||
// available to templates as they are being executed.
|
|
||||||
type HTTPData struct {
|
|
||||||
// Res is like an http.ResponseWriter.
|
|
||||||
Res struct {
|
|
||||||
Header http.Header
|
|
||||||
WriteHeader func (statusCode int)
|
|
||||||
Reset func ()
|
|
||||||
}
|
|
||||||
// Req is the HTTP request.
|
|
||||||
Req *http.Request
|
|
||||||
}
|
|
||||||
|
|
||||||
var _ http.ResponseWriter = new(HTTPResponseRecorder)
|
|
||||||
|
|
||||||
// HTTPResponseRecorder is an http.ResponseWriter that can buffer a response to
|
|
||||||
// be played back later.
|
|
||||||
type HTTPResponseRecorder struct {
|
|
||||||
Status int
|
|
||||||
Head http.Header
|
|
||||||
buffer bytes.Buffer
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *HTTPResponseRecorder) Header () http.Header {
|
|
||||||
if this.Head == nil {
|
|
||||||
this.Head = make(http.Header)
|
|
||||||
}
|
|
||||||
return this.Head
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *HTTPResponseRecorder) Write (buffer []byte) (int, error) {
|
|
||||||
return this.buffer.Write(buffer)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *HTTPResponseRecorder) WriteHeader (statusCode int) {
|
|
||||||
this.Status = statusCode
|
|
||||||
}
|
|
||||||
// Play replays the response to the given http.ResponseWriter. This resets the
|
|
||||||
// recorder.
|
|
||||||
func (this *HTTPResponseRecorder) Play (res http.ResponseWriter) error {
|
|
||||||
defer this.Reset()
|
|
||||||
status := this.Status
|
|
||||||
if status == 0 {
|
|
||||||
status = http.StatusOK
|
|
||||||
}
|
|
||||||
header := res.Header()
|
|
||||||
for name, value := range this.Head {
|
|
||||||
header[name] = value
|
|
||||||
}
|
|
||||||
res.WriteHeader(status)
|
|
||||||
_, err := io.Copy(res, &this.buffer)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reset resets this response recorder so it can be used again.
|
|
||||||
func (this *HTTPResponseRecorder) Reset () {
|
|
||||||
this.buffer.Reset()
|
|
||||||
this.Head = nil
|
|
||||||
this.Status = http.StatusOK
|
|
||||||
}
|
|
@ -123,9 +123,13 @@ func (this *Handler) serveDocument (
|
|||||||
|
|
||||||
// execute document
|
// execute document
|
||||||
data := HTTPData { }
|
data := HTTPData { }
|
||||||
data.Res.Header = recorder.Header()
|
data.Res = WrappedResponseWriter {
|
||||||
data.Res.WriteHeader = recorder.WriteHeader
|
responseWriter: res,
|
||||||
data.Res.Reset = resetRecorder
|
resetFunc: resetRecorder,
|
||||||
|
Header: WrappedHeader {
|
||||||
|
Header: recorder.Header(),
|
||||||
|
},
|
||||||
|
}
|
||||||
data.Req = req
|
data.Req = req
|
||||||
err = document.Execute(&recorder, step.ExecutionData {
|
err = document.Execute(&recorder, step.ExecutionData {
|
||||||
Data: data,
|
Data: data,
|
||||||
|
39
http/http.go
39
http/http.go
@ -8,15 +8,44 @@ import "net/http"
|
|||||||
// available to templates as they are being executed.
|
// available to templates as they are being executed.
|
||||||
type HTTPData struct {
|
type HTTPData struct {
|
||||||
// Res is like an http.ResponseWriter.
|
// Res is like an http.ResponseWriter.
|
||||||
Res struct {
|
Res WrappedResponseWriter
|
||||||
Header http.Header
|
|
||||||
WriteHeader func (statusCode int)
|
|
||||||
Reset func ()
|
|
||||||
}
|
|
||||||
// Req is the HTTP request.
|
// Req is the HTTP request.
|
||||||
Req *http.Request
|
Req *http.Request
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type WrappedResponseWriter struct {
|
||||||
|
responseWriter http.ResponseWriter
|
||||||
|
resetFunc func ()
|
||||||
|
Header WrappedHeader
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this WrappedResponseWriter) WriteHeader (statusCode int) string {
|
||||||
|
this.responseWriter.WriteHeader(statusCode)
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this WrappedResponseWriter) Reset () string {
|
||||||
|
this.resetFunc()
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
type WrappedHeader struct { http.Header }
|
||||||
|
|
||||||
|
func (this WrappedHeader) Add (name, value string) string {
|
||||||
|
this.Header.Add(name, value)
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this WrappedHeader) Del (name string) string {
|
||||||
|
this.Header.Del(name)
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this WrappedHeader) Set (name, value string) string {
|
||||||
|
this.Header.Set(name, value)
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
var _ http.ResponseWriter = new(HTTPResponseRecorder)
|
var _ http.ResponseWriter = new(HTTPResponseRecorder)
|
||||||
|
|
||||||
// HTTPResponseRecorder is an http.ResponseWriter that can buffer a response to
|
// HTTPResponseRecorder is an http.ResponseWriter that can buffer a response to
|
||||||
|
Loading…
Reference in New Issue
Block a user