Move all http stuff into the http package
This commit is contained in:
parent
6f04353512
commit
889850c04c
@ -107,7 +107,7 @@ func (this *Handler) serveDocument (
|
|||||||
}
|
}
|
||||||
|
|
||||||
// set up HTTP response recorder
|
// set up HTTP response recorder
|
||||||
recorder := step.HTTPResponseRecorder { }
|
recorder := HTTPResponseRecorder { }
|
||||||
resetRecorder := func () {
|
resetRecorder := func () {
|
||||||
recorder.Reset()
|
recorder.Reset()
|
||||||
recorder.Head = res.Header().Clone()
|
recorder.Head = res.Header().Clone()
|
||||||
@ -122,7 +122,7 @@ func (this *Handler) serveDocument (
|
|||||||
}
|
}
|
||||||
|
|
||||||
// execute document
|
// execute document
|
||||||
data := step.HTTPData { }
|
data := HTTPData { }
|
||||||
data.Res.Header = recorder.Header()
|
data.Res.Header = recorder.Header()
|
||||||
data.Res.WriteHeader = recorder.WriteHeader
|
data.Res.WriteHeader = recorder.WriteHeader
|
||||||
data.Res.Reset = resetRecorder
|
data.Res.Reset = resetRecorder
|
||||||
|
66
http/http.go
Normal file
66
http/http.go
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
package http
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user