| // Copyright 2011 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. |
| |
| // The httptest package provides utilities for HTTP testing. |
| package httptest |
| |
| import ( |
| "bytes" |
| "http" |
| "os" |
| ) |
| |
| // ResponseRecorder is an implementation of http.ResponseWriter that |
| // records its mutations for later inspection in tests. |
| type ResponseRecorder struct { |
| Code int // the HTTP response code from WriteHeader |
| Header http.Header // if non-nil, the headers to populate |
| Body *bytes.Buffer // if non-nil, the bytes.Buffer to append written data to |
| Flushed bool |
| |
| FakeRemoteAddr string // the fake RemoteAddr to return, or "" for DefaultRemoteAddr |
| FakeUsingTLS bool // whether to return true from the UsingTLS method |
| } |
| |
| // NewRecorder returns an initialized ResponseRecorder. |
| func NewRecorder() *ResponseRecorder { |
| return &ResponseRecorder{ |
| Header: http.Header(make(map[string][]string)), |
| Body: new(bytes.Buffer), |
| } |
| } |
| |
| // DefaultRemoteAddr is the default remote address to return in RemoteAddr if |
| // an explicit DefaultRemoteAddr isn't set on ResponseRecorder. |
| const DefaultRemoteAddr = "1.2.3.4" |
| |
| // RemoteAddr returns the value of rw.FakeRemoteAddr, if set, else |
| // returns DefaultRemoteAddr. |
| func (rw *ResponseRecorder) RemoteAddr() string { |
| if rw.FakeRemoteAddr != "" { |
| return rw.FakeRemoteAddr |
| } |
| return DefaultRemoteAddr |
| } |
| |
| // UsingTLS returns the fake value in rw.FakeUsingTLS |
| func (rw *ResponseRecorder) UsingTLS() bool { |
| return rw.FakeUsingTLS |
| } |
| |
| // SetHeader populates rw.Header, if non-nil. |
| func (rw *ResponseRecorder) SetHeader(k, v string) { |
| if rw.Header != nil { |
| if v == "" { |
| rw.Header.Del(k) |
| } else { |
| rw.Header.Set(k, v) |
| } |
| } |
| } |
| |
| // Write always succeeds and writes to rw.Body, if not nil. |
| func (rw *ResponseRecorder) Write(buf []byte) (int, os.Error) { |
| if rw.Body != nil { |
| rw.Body.Write(buf) |
| } |
| return len(buf), nil |
| } |
| |
| // WriteHeader sets rw.Code. |
| func (rw *ResponseRecorder) WriteHeader(code int) { |
| rw.Code = code |
| } |
| |
| // Flush sets rw.Flushed to true. |
| func (rw *ResponseRecorder) Flush() { |
| rw.Flushed = true |
| } |