4 "github.com/bradfitz/http2/hpack"
5 "golang.org/x/net/spdy"
10 // TestS3H1PlainGET tests whether simple SPDY GET request works.
11 func TestS3H1PlainGET(t *testing.T) {
12 st := newServerTesterTLS([]string{"--npn-list=spdy/3.1"}, t, noopHandler)
15 res, err := st.spdy(requestParam{
16 name: "TestS3H1PlainGET",
19 t.Fatalf("Error st.spdy() = %v", err)
23 if got := res.status; got != want {
24 t.Errorf("status = %v; want %v", got, want)
28 // TestS3H1BadRequestCL tests that server rejects request whose
29 // content-length header field value does not match its request body
31 func TestS3H1BadRequestCL(t *testing.T) {
32 st := newServerTesterTLS([]string{"--npn-list=spdy/3.1"}, t, noopHandler)
35 // we set content-length: 1024, but the actual request body is
37 res, err := st.spdy(requestParam{
38 name: "TestS3H1BadRequestCL",
40 header: []hpack.HeaderField{
41 pair("content-length", "1024"),
46 t.Fatalf("Error st.spdy() = %v", err)
49 want := spdy.ProtocolError
50 if got := res.spdyRstErrCode; got != want {
51 t.Errorf("res.spdyRstErrCode = %v; want %v", got, want)
55 // TestS3H1MultipleRequestCL tests that server rejects request with
56 // multiple Content-Length request header fields.
57 func TestS3H1MultipleRequestCL(t *testing.T) {
58 st := newServerTesterTLS([]string{"--npn-list=spdy/3.1"}, t, func(w http.ResponseWriter, r *http.Request) {
59 t.Errorf("server should not forward bad request")
63 res, err := st.spdy(requestParam{
64 name: "TestS3H1MultipleRequestCL",
65 header: []hpack.HeaderField{
66 pair("content-length", "1"),
67 pair("content-length", "1"),
71 t.Fatalf("Error st.spdy() = %v", err)
74 if got := res.status; got != want {
75 t.Errorf("status: %v; want %v", got, want)
79 // TestS3H1InvalidRequestCL tests that server rejects request with
80 // Content-Length which cannot be parsed as a number.
81 func TestS3H1InvalidRequestCL(t *testing.T) {
82 st := newServerTesterTLS([]string{"--npn-list=spdy/3.1"}, t, func(w http.ResponseWriter, r *http.Request) {
83 t.Errorf("server should not forward bad request")
87 res, err := st.spdy(requestParam{
88 name: "TestS3H1InvalidRequestCL",
89 header: []hpack.HeaderField{
90 pair("content-length", ""),
94 t.Fatalf("Error st.spdy() = %v", err)
97 if got := res.status; got != want {
98 t.Errorf("status: %v; want %v", got, want)
102 // TestS3H1GenerateVia tests that server generates Via header field to and
103 // from backend server.
104 func TestS3H1GenerateVia(t *testing.T) {
105 st := newServerTesterTLS([]string{"--npn-list=spdy/3.1"}, t, func(w http.ResponseWriter, r *http.Request) {
106 if got, want := r.Header.Get("Via"), "1.1 nghttpx"; got != want {
107 t.Errorf("Via: %v; want %v", got, want)
112 res, err := st.spdy(requestParam{
113 name: "TestS3H1GenerateVia",
116 t.Fatalf("Error st.spdy() = %v", err)
118 if got, want := res.header.Get("Via"), "1.1 nghttpx"; got != want {
119 t.Errorf("Via: %v; want %v", got, want)
123 // TestS3H1AppendVia tests that server adds value to existing Via
124 // header field to and from backend server.
125 func TestS3H1AppendVia(t *testing.T) {
126 st := newServerTesterTLS([]string{"--npn-list=spdy/3.1"}, t, func(w http.ResponseWriter, r *http.Request) {
127 if got, want := r.Header.Get("Via"), "foo, 1.1 nghttpx"; got != want {
128 t.Errorf("Via: %v; want %v", got, want)
130 w.Header().Add("Via", "bar")
134 res, err := st.spdy(requestParam{
135 name: "TestS3H1AppendVia",
136 header: []hpack.HeaderField{
141 t.Fatalf("Error st.spdy() = %v", err)
143 if got, want := res.header.Get("Via"), "bar, 1.1 nghttpx"; got != want {
144 t.Errorf("Via: %v; want %v", got, want)
148 // TestS3H1NoVia tests that server does not add value to existing Via
149 // header field to and from backend server.
150 func TestS3H1NoVia(t *testing.T) {
151 st := newServerTesterTLS([]string{"--npn-list=spdy/3.1", "--no-via"}, t, func(w http.ResponseWriter, r *http.Request) {
152 if got, want := r.Header.Get("Via"), "foo"; got != want {
153 t.Errorf("Via: %v; want %v", got, want)
155 w.Header().Add("Via", "bar")
159 res, err := st.spdy(requestParam{
160 name: "TestS3H1NoVia",
161 header: []hpack.HeaderField{
166 t.Fatalf("Error st.spdy() = %v", err)
168 if got, want := res.header.Get("Via"), "bar"; got != want {
169 t.Errorf("Via: %v; want %v", got, want)
173 // TestS3H2ConnectFailure tests that server handles the situation that
174 // connection attempt to HTTP/2 backend failed.
175 func TestS3H2ConnectFailure(t *testing.T) {
176 st := newServerTesterTLS([]string{"--npn-list=spdy/3.1", "--http2-bridge"}, t, noopHandler)
179 // simulate backend connect attempt failure
182 res, err := st.spdy(requestParam{
183 name: "TestS3H2ConnectFailure",
186 t.Fatalf("Error st.spdy() = %v", err)
189 if got := res.status; got != want {
190 t.Errorf("status: %v; want %v", got, want)