OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/tools/quic/quic_spdy_server_stream.h" | 5 #include "net/tools/quic/quic_spdy_server_stream.h" |
6 | 6 |
7 #include "base/strings/string_number_conversions.h" | 7 #include "base/strings/string_number_conversions.h" |
8 #include "base/strings/string_piece.h" | 8 #include "base/strings/string_piece.h" |
9 #include "net/quic/quic_connection.h" | 9 #include "net/quic/quic_connection.h" |
10 #include "net/quic/quic_protocol.h" | 10 #include "net/quic/quic_protocol.h" |
11 #include "net/quic/quic_spdy_compressor.h" | |
12 #include "net/quic/quic_utils.h" | 11 #include "net/quic/quic_utils.h" |
13 #include "net/quic/test_tools/quic_test_utils.h" | 12 #include "net/quic/test_tools/quic_test_utils.h" |
14 #include "net/tools/epoll_server/epoll_server.h" | 13 #include "net/tools/epoll_server/epoll_server.h" |
15 #include "net/tools/quic/quic_in_memory_cache.h" | 14 #include "net/tools/quic/quic_in_memory_cache.h" |
16 #include "net/tools/quic/spdy_utils.h" | 15 #include "net/tools/quic/spdy_utils.h" |
17 #include "net/tools/quic/test_tools/quic_in_memory_cache_peer.h" | 16 #include "net/tools/quic/test_tools/quic_in_memory_cache_peer.h" |
18 #include "net/tools/quic/test_tools/quic_test_utils.h" | 17 #include "net/tools/quic/test_tools/quic_test_utils.h" |
19 #include "testing/gmock/include/gmock/gmock.h" | 18 #include "testing/gmock/include/gmock/gmock.h" |
20 #include "testing/gtest/include/gtest/gtest.h" | 19 #include "testing/gtest/include/gtest/gtest.h" |
21 | 20 |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
87 body_("hello world") { | 86 body_("hello world") { |
88 BalsaHeaders request_headers; | 87 BalsaHeaders request_headers; |
89 request_headers.SetRequestFirstlineFromStringPieces( | 88 request_headers.SetRequestFirstlineFromStringPieces( |
90 "POST", "https://www.google.com/", "HTTP/1.1"); | 89 "POST", "https://www.google.com/", "HTTP/1.1"); |
91 request_headers.ReplaceOrAppendHeader("content-length", "11"); | 90 request_headers.ReplaceOrAppendHeader("content-length", "11"); |
92 | 91 |
93 headers_string_ = SpdyUtils::SerializeRequestHeaders(request_headers); | 92 headers_string_ = SpdyUtils::SerializeRequestHeaders(request_headers); |
94 stream_.reset(new QuicSpdyServerStreamPeer(3, &session_)); | 93 stream_.reset(new QuicSpdyServerStreamPeer(3, &session_)); |
95 } | 94 } |
96 | 95 |
97 QuicConsumedData ValidateHeaders(const IOVector& data) { | |
98 const iovec* iov = data.iovec(); | |
99 StringPiece headers = | |
100 StringPiece(static_cast<const char*>(iov[0].iov_base), iov[0].iov_len); | |
101 headers_string_ = SpdyUtils::SerializeResponseHeaders( | |
102 response_headers_); | |
103 QuicSpdyDecompressor decompressor; | |
104 TestDecompressorVisitor visitor; | |
105 | |
106 // First the header id, then the compressed data. | |
107 EXPECT_EQ(1, headers[0]); | |
108 EXPECT_EQ(0, headers[1]); | |
109 EXPECT_EQ(0, headers[2]); | |
110 EXPECT_EQ(0, headers[3]); | |
111 EXPECT_EQ(static_cast<size_t>(headers.length() - 4), | |
112 decompressor.DecompressData(headers.substr(4), &visitor)); | |
113 | |
114 EXPECT_EQ(headers_string_, visitor.data()); | |
115 | |
116 return QuicConsumedData(headers.size(), false); | |
117 } | |
118 | |
119 static void SetUpTestCase() { | 96 static void SetUpTestCase() { |
120 QuicInMemoryCachePeer::ResetForTests(); | 97 QuicInMemoryCachePeer::ResetForTests(); |
121 } | 98 } |
122 | 99 |
123 virtual void SetUp() { | 100 virtual void SetUp() { |
124 QuicInMemoryCache* cache = QuicInMemoryCache::GetInstance(); | 101 QuicInMemoryCache* cache = QuicInMemoryCache::GetInstance(); |
125 | 102 |
126 BalsaHeaders request_headers, response_headers; | 103 BalsaHeaders request_headers, response_headers; |
127 StringPiece body("Yum"); | 104 StringPiece body("Yum"); |
128 request_headers.SetRequestFirstlineFromStringPieces( | 105 request_headers.SetRequestFirstlineFromStringPieces( |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
228 request_headers->SetRequestFirstlineFromStringPieces( | 205 request_headers->SetRequestFirstlineFromStringPieces( |
229 "GET", | 206 "GET", |
230 "https://www.google.com/foo", | 207 "https://www.google.com/foo", |
231 "HTTP/1.1"); | 208 "HTTP/1.1"); |
232 | 209 |
233 response_headers_.SetResponseFirstlineFromStringPieces( | 210 response_headers_.SetResponseFirstlineFromStringPieces( |
234 "HTTP/1.1", "200", "OK"); | 211 "HTTP/1.1", "200", "OK"); |
235 response_headers_.ReplaceOrAppendHeader("content-length", "3"); | 212 response_headers_.ReplaceOrAppendHeader("content-length", "3"); |
236 | 213 |
237 InSequence s; | 214 InSequence s; |
238 if (GetParam() > QUIC_VERSION_12) { | 215 EXPECT_CALL(session_, |
239 EXPECT_CALL(session_, | 216 WritevData(kHeadersStreamId, _, 0, false, NULL)); |
240 WritevData(kHeadersStreamId, _, 0, false, NULL)); | 217 |
241 } else { | |
242 EXPECT_CALL(session_, WritevData(_, _, _, _, _)).Times(1) | |
243 .WillOnce(WithArgs<1>(Invoke( | |
244 this, &QuicSpdyServerStreamTest::ValidateHeaders))); | |
245 } | |
246 | 218 |
247 EXPECT_CALL(session_, WritevData(_, _, _, _, _)).Times(1). | 219 EXPECT_CALL(session_, WritevData(_, _, _, _, _)).Times(1). |
248 WillOnce(Return(QuicConsumedData(3, true))); | 220 WillOnce(Return(QuicConsumedData(3, true))); |
249 | 221 |
250 QuicSpdyServerStreamPeer::SendResponse(stream_.get()); | 222 QuicSpdyServerStreamPeer::SendResponse(stream_.get()); |
251 EXPECT_TRUE(stream_->read_side_closed()); | 223 EXPECT_TRUE(stream_->read_side_closed()); |
252 EXPECT_TRUE(stream_->write_side_closed()); | 224 EXPECT_TRUE(stream_->write_side_closed()); |
253 } | 225 } |
254 | 226 |
255 TEST_P(QuicSpdyServerStreamTest, TestSendErrorResponse) { | 227 TEST_P(QuicSpdyServerStreamTest, TestSendErrorResponse) { |
256 response_headers_.SetResponseFirstlineFromStringPieces( | 228 response_headers_.SetResponseFirstlineFromStringPieces( |
257 "HTTP/1.1", "500", "Server Error"); | 229 "HTTP/1.1", "500", "Server Error"); |
258 response_headers_.ReplaceOrAppendHeader("content-length", "3"); | 230 response_headers_.ReplaceOrAppendHeader("content-length", "3"); |
259 | 231 |
260 InSequence s; | 232 InSequence s; |
261 if (GetParam() > QUIC_VERSION_12) { | 233 EXPECT_CALL(session_, |
262 EXPECT_CALL(session_, | 234 WritevData(kHeadersStreamId, _, 0, false, NULL)); |
263 WritevData(kHeadersStreamId, _, 0, false, NULL)); | |
264 } else { | |
265 EXPECT_CALL(session_, WritevData(_, _, _, _, _)).Times(1) | |
266 .WillOnce(WithArgs<1>(Invoke( | |
267 this, &QuicSpdyServerStreamTest::ValidateHeaders))); | |
268 } | |
269 | 235 |
270 EXPECT_CALL(session_, WritevData(_, _, _, _, _)).Times(1). | 236 EXPECT_CALL(session_, WritevData(_, _, _, _, _)).Times(1). |
271 WillOnce(Return(QuicConsumedData(3, true))); | 237 WillOnce(Return(QuicConsumedData(3, true))); |
272 | 238 |
273 QuicSpdyServerStreamPeer::SendErrorResponse(stream_.get()); | 239 QuicSpdyServerStreamPeer::SendErrorResponse(stream_.get()); |
274 EXPECT_TRUE(stream_->read_side_closed()); | 240 EXPECT_TRUE(stream_->read_side_closed()); |
275 EXPECT_TRUE(stream_->write_side_closed()); | 241 EXPECT_TRUE(stream_->write_side_closed()); |
276 } | 242 } |
277 | 243 |
278 TEST_P(QuicSpdyServerStreamTest, InvalidHeadersWithFin) { | 244 TEST_P(QuicSpdyServerStreamTest, InvalidHeadersWithFin) { |
279 char arr[] = { | 245 char arr[] = { |
280 0x05, 0x00, 0x00, 0x00, // .... | |
281 0x05, 0x00, 0x00, 0x00, // .... | |
282 0x3a, 0x68, 0x6f, 0x73, // :hos | 246 0x3a, 0x68, 0x6f, 0x73, // :hos |
283 0x74, 0x00, 0x00, 0x00, // t... | 247 0x74, 0x00, 0x00, 0x00, // t... |
284 0x00, 0x00, 0x00, 0x00, // .... | 248 0x00, 0x00, 0x00, 0x00, // .... |
285 0x07, 0x3a, 0x6d, 0x65, // .:me | 249 0x07, 0x3a, 0x6d, 0x65, // .:me |
286 0x74, 0x68, 0x6f, 0x64, // thod | 250 0x74, 0x68, 0x6f, 0x64, // thod |
287 0x00, 0x00, 0x00, 0x03, // .... | 251 0x00, 0x00, 0x00, 0x03, // .... |
288 0x47, 0x45, 0x54, 0x00, // GET. | 252 0x47, 0x45, 0x54, 0x00, // GET. |
289 0x00, 0x00, 0x05, 0x3a, // ...: | 253 0x00, 0x00, 0x05, 0x3a, // ...: |
290 0x70, 0x61, 0x74, 0x68, // path | 254 0x70, 0x61, 0x74, 0x68, // path |
291 0x00, 0x00, 0x00, 0x04, // .... | 255 0x00, 0x00, 0x00, 0x04, // .... |
292 0x2f, 0x66, 0x6f, 0x6f, // /foo | 256 0x2f, 0x66, 0x6f, 0x6f, // /foo |
293 0x00, 0x00, 0x00, 0x07, // .... | 257 0x00, 0x00, 0x00, 0x07, // .... |
294 0x3a, 0x73, 0x63, 0x68, // :sch | 258 0x3a, 0x73, 0x63, 0x68, // :sch |
295 0x65, 0x6d, 0x65, 0x00, // eme. | 259 0x65, 0x6d, 0x65, 0x00, // eme. |
296 0x00, 0x00, 0x00, 0x00, // .... | 260 0x00, 0x00, 0x00, 0x00, // .... |
297 0x00, 0x00, 0x08, 0x3a, // ...: | 261 0x00, 0x00, 0x08, 0x3a, // ...: |
298 0x76, 0x65, 0x72, 0x73, // vers | 262 0x76, 0x65, 0x72, 0x73, // vers |
299 '\x96', 0x6f, 0x6e, 0x00, // <i(69)>on. | 263 '\x96', 0x6f, 0x6e, 0x00, // <i(69)>on. |
300 0x00, 0x00, 0x08, 0x48, // ...H | 264 0x00, 0x00, 0x08, 0x48, // ...H |
301 0x54, 0x54, 0x50, 0x2f, // TTP/ | 265 0x54, 0x54, 0x50, 0x2f, // TTP/ |
302 0x31, 0x2e, 0x31, // 1.1 | 266 0x31, 0x2e, 0x31, // 1.1 |
303 }; | 267 }; |
304 size_t start = GetParam() > QUIC_VERSION_12 ? 8 : 0; | 268 StringPiece data(arr, arraysize(arr)); |
305 StringPiece data(arr + start, arraysize(arr) - start); | |
306 QuicStreamFrame frame(stream_->id(), true, 0, MakeIOVector(data)); | 269 QuicStreamFrame frame(stream_->id(), true, 0, MakeIOVector(data)); |
307 // Verify that we don't crash when we get a invalid headers in stream frame. | 270 // Verify that we don't crash when we get a invalid headers in stream frame. |
308 stream_->OnStreamFrame(frame); | 271 stream_->OnStreamFrame(frame); |
309 } | 272 } |
310 | 273 |
311 } // namespace | 274 } // namespace |
312 } // namespace test | 275 } // namespace test |
313 } // namespace tools | 276 } // namespace tools |
314 } // namespace net | 277 } // namespace net |
OLD | NEW |