// 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 }