Move all http stuff into the http package

This commit is contained in:
Sasha Koshka 2024-12-08 01:01:10 -05:00
parent 6f04353512
commit 889850c04c
2 changed files with 68 additions and 2 deletions

View File

@ -107,7 +107,7 @@ func (this *Handler) serveDocument (
}
// set up HTTP response recorder
recorder := step.HTTPResponseRecorder { }
recorder := HTTPResponseRecorder { }
resetRecorder := func () {
recorder.Reset()
recorder.Head = res.Header().Clone()
@ -122,7 +122,7 @@ func (this *Handler) serveDocument (
}
// execute document
data := step.HTTPData { }
data := HTTPData { }
data.Res.Header = recorder.Header()
data.Res.WriteHeader = recorder.WriteHeader
data.Res.Reset = resetRecorder

66
http/http.go Normal file
View 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
}