Brad Fitzpatrick | 56bcef0 | 2012-11-13 22:38:25 -0800 | [diff] [blame] | 1 | // Copyright 2012 The Go Authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style |
| 3 | // license that can be found in the LICENSE file. |
| 4 | |
| 5 | package http |
| 6 | |
| 7 | import ( |
| 8 | "bufio" |
Brad Fitzpatrick | ff29be1 | 2014-01-29 13:44:21 +0100 | [diff] [blame] | 9 | "io" |
Brad Fitzpatrick | 56bcef0 | 2012-11-13 22:38:25 -0800 | [diff] [blame] | 10 | "strings" |
| 11 | "testing" |
| 12 | ) |
| 13 | |
| 14 | func TestBodyReadBadTrailer(t *testing.T) { |
| 15 | b := &body{ |
Brad Fitzpatrick | affab3f | 2014-01-07 10:40:56 -0800 | [diff] [blame] | 16 | src: strings.NewReader("foobar"), |
| 17 | hdr: true, // force reading the trailer |
| 18 | r: bufio.NewReader(strings.NewReader("")), |
Brad Fitzpatrick | 56bcef0 | 2012-11-13 22:38:25 -0800 | [diff] [blame] | 19 | } |
| 20 | buf := make([]byte, 7) |
| 21 | n, err := b.Read(buf[:3]) |
| 22 | got := string(buf[:n]) |
| 23 | if got != "foo" || err != nil { |
Robin Eklind | 4f25013 | 2012-11-16 17:24:43 -0800 | [diff] [blame] | 24 | t.Fatalf(`first Read = %d (%q), %v; want 3 ("foo")`, n, got, err) |
Brad Fitzpatrick | 56bcef0 | 2012-11-13 22:38:25 -0800 | [diff] [blame] | 25 | } |
| 26 | |
| 27 | n, err = b.Read(buf[:]) |
| 28 | got = string(buf[:n]) |
| 29 | if got != "bar" || err != nil { |
Robin Eklind | 4f25013 | 2012-11-16 17:24:43 -0800 | [diff] [blame] | 30 | t.Fatalf(`second Read = %d (%q), %v; want 3 ("bar")`, n, got, err) |
Brad Fitzpatrick | 56bcef0 | 2012-11-13 22:38:25 -0800 | [diff] [blame] | 31 | } |
| 32 | |
| 33 | n, err = b.Read(buf[:]) |
| 34 | got = string(buf[:n]) |
| 35 | if err == nil { |
| 36 | t.Errorf("final Read was successful (%q), expected error from trailer read", got) |
| 37 | } |
| 38 | } |
Brad Fitzpatrick | ff29be1 | 2014-01-29 13:44:21 +0100 | [diff] [blame] | 39 | |
| 40 | func TestFinalChunkedBodyReadEOF(t *testing.T) { |
| 41 | res, err := ReadResponse(bufio.NewReader(strings.NewReader( |
| 42 | "HTTP/1.1 200 OK\r\n"+ |
| 43 | "Transfer-Encoding: chunked\r\n"+ |
| 44 | "\r\n"+ |
| 45 | "0a\r\n"+ |
| 46 | "Body here\n\r\n"+ |
| 47 | "09\r\n"+ |
| 48 | "continued\r\n"+ |
| 49 | "0\r\n"+ |
| 50 | "\r\n")), nil) |
| 51 | if err != nil { |
| 52 | t.Fatal(err) |
| 53 | } |
| 54 | want := "Body here\ncontinued" |
| 55 | buf := make([]byte, len(want)) |
| 56 | n, err := res.Body.Read(buf) |
| 57 | if n != len(want) || err != io.EOF { |
| 58 | t.Logf("body = %#v", res.Body) |
| 59 | t.Errorf("Read = %v, %v; want %d, EOF", n, err, len(want)) |
| 60 | } |
| 61 | if string(buf) != want { |
| 62 | t.Errorf("buf = %q; want %q", buf, want) |
| 63 | } |
| 64 | } |