| // Copyright 2010 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. |
| |
| package http |
| |
| import ( |
| "bytes" |
| "testing" |
| ) |
| |
| type respWriteTest struct { |
| Resp Response |
| Raw string |
| } |
| |
| var respWriteTests = []respWriteTest{ |
| // HTTP/1.0, identity coding; no trailer |
| { |
| Response{ |
| StatusCode: 503, |
| ProtoMajor: 1, |
| ProtoMinor: 0, |
| RequestMethod: "GET", |
| Header: map[string]string{}, |
| Body: nopCloser{bytes.NewBufferString("abcdef")}, |
| ContentLength: 6, |
| }, |
| |
| "HTTP/1.0 503 Service Unavailable\r\n" + |
| "Content-Length: 6\r\n\r\n" + |
| "abcdef", |
| }, |
| // Unchunked response without Content-Length. |
| { |
| Response{ |
| StatusCode: 200, |
| ProtoMajor: 1, |
| ProtoMinor: 0, |
| RequestMethod: "GET", |
| Header: map[string]string{}, |
| Body: nopCloser{bytes.NewBufferString("abcdef")}, |
| ContentLength: -1, |
| }, |
| "HTTP/1.0 200 OK\r\n" + |
| "\r\n" + |
| "abcdef", |
| }, |
| // HTTP/1.1, chunked coding; empty trailer; close |
| { |
| Response{ |
| StatusCode: 200, |
| ProtoMajor: 1, |
| ProtoMinor: 1, |
| RequestMethod: "GET", |
| Header: map[string]string{}, |
| Body: nopCloser{bytes.NewBufferString("abcdef")}, |
| ContentLength: 6, |
| TransferEncoding: []string{"chunked"}, |
| Close: true, |
| }, |
| |
| "HTTP/1.1 200 OK\r\n" + |
| "Connection: close\r\n" + |
| "Transfer-Encoding: chunked\r\n\r\n" + |
| "6\r\nabcdef\r\n0\r\n\r\n", |
| }, |
| } |
| |
| func TestResponseWrite(t *testing.T) { |
| for i := range respWriteTests { |
| tt := &respWriteTests[i] |
| var braw bytes.Buffer |
| err := tt.Resp.Write(&braw) |
| if err != nil { |
| t.Errorf("error writing #%d: %s", i, err) |
| continue |
| } |
| sraw := braw.String() |
| if sraw != tt.Raw { |
| t.Errorf("Test %d, expecting:\n%s\nGot:\n%s\n", i, tt.Raw, sraw) |
| continue |
| } |
| } |
| } |