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 }