Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(352)

Side by Side Diff: net/server/http_server_unittest.cc

Issue 274813002: HttpServer: Handling of multiple header fields with the same name and multiple values of "Connectio… (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: HasHeaderValue always worked as if header_value=="upgrade" Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/server/http_server_request_info.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 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 <utility> 5 #include <utility>
6 #include <vector> 6 #include <vector>
7 7
8 #include "base/bind.h" 8 #include "base/bind.h"
9 #include "base/bind_helpers.h" 9 #include "base/bind_helpers.h"
10 #include "base/compiler_specific.h" 10 #include "base/compiler_specific.h"
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after
202 protected: 202 protected:
203 scoped_refptr<HttpServer> server_; 203 scoped_refptr<HttpServer> server_;
204 IPEndPoint server_address_; 204 IPEndPoint server_address_;
205 base::Closure run_loop_quit_func_; 205 base::Closure run_loop_quit_func_;
206 std::vector<std::pair<HttpServerRequestInfo, int> > requests_; 206 std::vector<std::pair<HttpServerRequestInfo, int> > requests_;
207 207
208 private: 208 private:
209 size_t quit_after_request_count_; 209 size_t quit_after_request_count_;
210 }; 210 };
211 211
212 class WebSocketTest : public HttpServerTest {
213 virtual void OnHttpRequest(int connection_id,
214 const HttpServerRequestInfo& info) OVERRIDE {
215 NOTREACHED();
216 }
217
218 virtual void OnWebSocketRequest(int connection_id,
219 const HttpServerRequestInfo& info) OVERRIDE {
220 HttpServerTest::OnHttpRequest(connection_id, info);
221 }
222
223 virtual void OnWebSocketMessage(int connection_id,
224 const std::string& data) OVERRIDE {
225 }
226 };
227
212 TEST_F(HttpServerTest, Request) { 228 TEST_F(HttpServerTest, Request) {
213 TestHttpClient client; 229 TestHttpClient client;
214 ASSERT_EQ(OK, client.ConnectAndWait(server_address_)); 230 ASSERT_EQ(OK, client.ConnectAndWait(server_address_));
215 client.Send("GET /test HTTP/1.1\r\n\r\n"); 231 client.Send("GET /test HTTP/1.1\r\n\r\n");
216 ASSERT_TRUE(RunUntilRequestsReceived(1)); 232 ASSERT_TRUE(RunUntilRequestsReceived(1));
217 ASSERT_EQ("GET", GetRequest(0).method); 233 ASSERT_EQ("GET", GetRequest(0).method);
218 ASSERT_EQ("/test", GetRequest(0).path); 234 ASSERT_EQ("/test", GetRequest(0).path);
219 ASSERT_EQ("", GetRequest(0).data); 235 ASSERT_EQ("", GetRequest(0).data);
220 ASSERT_EQ(0u, GetRequest(0).headers.size()); 236 ASSERT_EQ(0u, GetRequest(0).headers.size());
221 ASSERT_TRUE(StartsWithASCII(GetRequest(0).peer.ToString(), 237 ASSERT_TRUE(StartsWithASCII(GetRequest(0).peer.ToString(),
(...skipping 24 matching lines...) Expand all
246 ASSERT_EQ("", GetRequest(0).data); 262 ASSERT_EQ("", GetRequest(0).data);
247 263
248 for (size_t i = 0; i < arraysize(kHeaders); ++i) { 264 for (size_t i = 0; i < arraysize(kHeaders); ++i) {
249 std::string field = StringToLowerASCII(std::string(kHeaders[i][0])); 265 std::string field = StringToLowerASCII(std::string(kHeaders[i][0]));
250 std::string value = kHeaders[i][2]; 266 std::string value = kHeaders[i][2];
251 ASSERT_EQ(1u, GetRequest(0).headers.count(field)) << field; 267 ASSERT_EQ(1u, GetRequest(0).headers.count(field)) << field;
252 ASSERT_EQ(value, GetRequest(0).headers[field]) << kHeaders[i][0]; 268 ASSERT_EQ(value, GetRequest(0).headers[field]) << kHeaders[i][0];
253 } 269 }
254 } 270 }
255 271
272 TEST_F(HttpServerTest, RequestWithDuplicateHeaders) {
273 TestHttpClient client;
274 ASSERT_EQ(OK, client.ConnectAndWait(server_address_));
275 const char* kHeaders[][3] = {
276 {"FirstHeader", ": ", "1"},
277 {"DuplicateHeader", ": ", "2"},
278 {"MiddleHeader", ": ", "3"},
279 {"DuplicateHeader", ": ", "4"},
280 {"LastHeader", ": ", "5"},
281 };
282 std::string headers;
283 for (size_t i = 0; i < arraysize(kHeaders); ++i) {
284 headers +=
285 std::string(kHeaders[i][0]) + kHeaders[i][1] + kHeaders[i][2] + "\r\n";
286 }
287
288 client.Send("GET /test HTTP/1.1\r\n" + headers + "\r\n");
289 ASSERT_TRUE(RunUntilRequestsReceived(1));
290 ASSERT_EQ("", GetRequest(0).data);
291
292 for (size_t i = 0; i < arraysize(kHeaders); ++i) {
293 std::string field = StringToLowerASCII(std::string(kHeaders[i][0]));
294 std::string value = (field == "duplicateheader") ? "2,4" : kHeaders[i][2];
295 ASSERT_EQ(1u, GetRequest(0).headers.count(field)) << field;
296 ASSERT_EQ(value, GetRequest(0).headers[field]) << kHeaders[i][0];
297 }
298 }
299
300 TEST_F(HttpServerTest, HasHeaderValueTest) {
301 TestHttpClient client;
302 ASSERT_EQ(OK, client.ConnectAndWait(server_address_));
303 const char* kHeaders[] = {
304 "Header: Abcd",
305 "HeaderWithNoWhitespace:E",
306 "HeaderWithWhitespace : \t f \t ",
307 "DuplicateHeader: g",
308 "HeaderWithComma: h, i ,j",
309 "DuplicateHeader: k",
310 "EmptyHeader:",
311 "EmptyHeaderWithWhitespace: \t ",
312 "HeaderWithNonASCII: \xf7",
313 };
314 std::string headers;
315 for (size_t i = 0; i < arraysize(kHeaders); ++i) {
316 headers += std::string(kHeaders[i]) + "\r\n";
317 }
318
319 client.Send("GET /test HTTP/1.1\r\n" + headers + "\r\n");
320 ASSERT_TRUE(RunUntilRequestsReceived(1));
321 ASSERT_EQ("", GetRequest(0).data);
322
323 ASSERT_TRUE(GetRequest(0).HasHeaderValue("header", "abcd"));
324 ASSERT_FALSE(GetRequest(0).HasHeaderValue("header", "bc"));
325 ASSERT_TRUE(GetRequest(0).HasHeaderValue("headerwithnowhitespace", "e"));
326 ASSERT_TRUE(GetRequest(0).HasHeaderValue("headerwithwhitespace", "f"));
327 ASSERT_TRUE(GetRequest(0).HasHeaderValue("duplicateheader", "g"));
328 ASSERT_TRUE(GetRequest(0).HasHeaderValue("headerwithcomma", "h"));
329 ASSERT_TRUE(GetRequest(0).HasHeaderValue("headerwithcomma", "i"));
330 ASSERT_TRUE(GetRequest(0).HasHeaderValue("headerwithcomma", "j"));
331 ASSERT_TRUE(GetRequest(0).HasHeaderValue("duplicateheader", "k"));
332 ASSERT_FALSE(GetRequest(0).HasHeaderValue("emptyheader", "x"));
333 ASSERT_FALSE(GetRequest(0).HasHeaderValue("emptyheaderwithwhitespace", "x"));
334 ASSERT_TRUE(GetRequest(0).HasHeaderValue("headerwithnonascii", "\xf7"));
335 }
336
256 TEST_F(HttpServerTest, RequestWithBody) { 337 TEST_F(HttpServerTest, RequestWithBody) {
257 TestHttpClient client; 338 TestHttpClient client;
258 ASSERT_EQ(OK, client.ConnectAndWait(server_address_)); 339 ASSERT_EQ(OK, client.ConnectAndWait(server_address_));
259 std::string body = "a" + std::string(1 << 10, 'b') + "c"; 340 std::string body = "a" + std::string(1 << 10, 'b') + "c";
260 client.Send(base::StringPrintf( 341 client.Send(base::StringPrintf(
261 "GET /test HTTP/1.1\r\n" 342 "GET /test HTTP/1.1\r\n"
262 "SomeHeader: 1\r\n" 343 "SomeHeader: 1\r\n"
263 "Content-Length: %" PRIuS "\r\n\r\n%s", 344 "Content-Length: %" PRIuS "\r\n\r\n%s",
264 body.length(), 345 body.length(),
265 body.c_str())); 346 body.c_str()));
266 ASSERT_TRUE(RunUntilRequestsReceived(1)); 347 ASSERT_TRUE(RunUntilRequestsReceived(1));
267 ASSERT_EQ(2u, GetRequest(0).headers.size()); 348 ASSERT_EQ(2u, GetRequest(0).headers.size());
268 ASSERT_EQ(body.length(), GetRequest(0).data.length()); 349 ASSERT_EQ(body.length(), GetRequest(0).data.length());
269 ASSERT_EQ('a', body[0]); 350 ASSERT_EQ('a', body[0]);
270 ASSERT_EQ('c', *body.rbegin()); 351 ASSERT_EQ('c', *body.rbegin());
271 } 352 }
272 353
354 TEST_F(WebSocketTest, RequestWebSocket) {
355 TestHttpClient client;
356 ASSERT_EQ(OK, client.ConnectAndWait(server_address_));
357 client.Send(
358 "GET /test HTTP/1.1\r\n"
359 "Upgrade: WebSocket\r\n"
360 "Connection: SomethingElse, Upgrade\r\n"
361 "Sec-WebSocket-Version: 8\r\n"
362 "Sec-WebSocket-Key: key\r\n"
363 "\r\n");
364 ASSERT_TRUE(RunUntilRequestsReceived(1));
365 }
366
273 TEST_F(HttpServerTest, RequestWithTooLargeBody) { 367 TEST_F(HttpServerTest, RequestWithTooLargeBody) {
274 class TestURLFetcherDelegate : public URLFetcherDelegate { 368 class TestURLFetcherDelegate : public URLFetcherDelegate {
275 public: 369 public:
276 TestURLFetcherDelegate(const base::Closure& quit_loop_func) 370 TestURLFetcherDelegate(const base::Closure& quit_loop_func)
277 : quit_loop_func_(quit_loop_func) {} 371 : quit_loop_func_(quit_loop_func) {}
278 virtual ~TestURLFetcherDelegate() {} 372 virtual ~TestURLFetcherDelegate() {}
279 373
280 virtual void OnURLFetchComplete(const URLFetcher* source) OVERRIDE { 374 virtual void OnURLFetchComplete(const URLFetcher* source) OVERRIDE {
281 EXPECT_EQ(HTTP_INTERNAL_SERVER_ERROR, source->GetResponseCode()); 375 EXPECT_EQ(HTTP_INTERNAL_SERVER_ERROR, source->GetResponseCode());
282 quit_loop_func_.Run(); 376 quit_loop_func_.Run();
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
403 497
404 ASSERT_EQ(client_connection_id, GetConnectionId(2)); 498 ASSERT_EQ(client_connection_id, GetConnectionId(2));
405 server_->Send200(client_connection_id, "Content for /test3", "text/plain"); 499 server_->Send200(client_connection_id, "Content for /test3", "text/plain");
406 std::string response3; 500 std::string response3;
407 ASSERT_TRUE(client.Read(&response3)); 501 ASSERT_TRUE(client.Read(&response3));
408 ASSERT_TRUE(StartsWithASCII(response3, "HTTP/1.1 200 OK", true)); 502 ASSERT_TRUE(StartsWithASCII(response3, "HTTP/1.1 200 OK", true));
409 ASSERT_TRUE(EndsWith(response3, "Content for /test3", true)); 503 ASSERT_TRUE(EndsWith(response3, "Content for /test3", true));
410 } 504 }
411 505
412 } // namespace net 506 } // namespace net
OLDNEW
« no previous file with comments | « net/server/http_server_request_info.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698