| // Copyright 2013 The Go Authors. All rights reserved. |
| // |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file or at |
| // https://developers.google.com/open-source/licenses/bsd. |
| |
| package httputil |
| |
| import ( |
| "bytes" |
| "net/http" |
| "strconv" |
| ) |
| |
| // ResponseBuffer is the current response being composed by its owner. |
| // It implements http.ResponseWriter and io.WriterTo. |
| type ResponseBuffer struct { |
| buf bytes.Buffer |
| status int |
| header http.Header |
| } |
| |
| // Write implements the http.ResponseWriter interface. |
| func (rb *ResponseBuffer) Write(p []byte) (int, error) { |
| return rb.buf.Write(p) |
| } |
| |
| // WriteHeader implements the http.ResponseWriter interface. |
| func (rb *ResponseBuffer) WriteHeader(status int) { |
| rb.status = status |
| } |
| |
| // Header implements the http.ResponseWriter interface. |
| func (rb *ResponseBuffer) Header() http.Header { |
| if rb.header == nil { |
| rb.header = make(http.Header) |
| } |
| return rb.header |
| } |
| |
| // WriteTo implements the io.WriterTo interface. |
| func (rb *ResponseBuffer) WriteTo(w http.ResponseWriter) error { |
| for k, v := range rb.header { |
| w.Header()[k] = v |
| } |
| if rb.buf.Len() > 0 { |
| w.Header().Set("Content-Length", strconv.Itoa(rb.buf.Len())) |
| } |
| if rb.status != 0 { |
| w.WriteHeader(rb.status) |
| } |
| if rb.buf.Len() > 0 { |
| if _, err := w.Write(rb.buf.Bytes()); err != nil { |
| return err |
| } |
| } |
| return nil |
| } |