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) } // 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 { statusCode int header http.Header buffer bytes.Buffer } func (this *HTTPResponseRecorder) Header () http.Header { if this.header == nil { this.header = make(http.Header) } return this.header } func (this *HTTPResponseRecorder) SetHeader (header http.Header) { this.header = header } func (this *HTTPResponseRecorder) Write (buffer []byte) (int, error) { return this.buffer.Write(buffer) } func (this *HTTPResponseRecorder) WriteHeader (statusCode int) { this.statusCode = 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() _, 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.header = nil this.statusCode = http.StatusOK }