12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "net/test/embedded_test_server/http_request.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)namespace net { 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace test_server { 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(HttpRequestTest, ParseRequest) { 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HttpRequestParser parser; 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Process request in chunks to check if the parser deals with border cases. 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Also, check multi-line headers as well as multiple requests in the same 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // chunk. This basically should cover all the simplest border cases. 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parser.ProcessChunk("POST /foobar.html HTTP/1.1\r\n"); 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(HttpRequestParser::WAITING, parser.ParseRequest()); 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parser.ProcessChunk("Host: localhost:1234\r\n"); 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(HttpRequestParser::WAITING, parser.ParseRequest()); 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parser.ProcessChunk("Multi-line-header: abcd\r\n"); 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(HttpRequestParser::WAITING, parser.ParseRequest()); 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parser.ProcessChunk(" efgh\r\n"); 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(HttpRequestParser::WAITING, parser.ParseRequest()); 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parser.ProcessChunk(" ijkl\r\n"); 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(HttpRequestParser::WAITING, parser.ParseRequest()); 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parser.ProcessChunk("Content-Length: 10\r\n\r\n"); 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(HttpRequestParser::WAITING, parser.ParseRequest()); 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Content data and another request in the same chunk (possible in http/1.1). 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parser.ProcessChunk("1234567890GET /another.html HTTP/1.1\r\n\r\n"); 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(HttpRequestParser::ACCEPTED, parser.ParseRequest()); 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Fetch the first request and validate it. 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<HttpRequest> request = parser.GetRequest(); 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("/foobar.html", request->relative_url); 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(METHOD_POST, request->method); 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("1234567890", request->content); 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(3u, request->headers.size()); 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, request->headers.count("Host")); 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, request->headers.count("Multi-line-header")); 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, request->headers.count("Content-Length")); 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("localhost:1234", request->headers["Host"]); 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("abcd efgh ijkl", request->headers["Multi-line-header"]); 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("10", request->headers["Content-Length"]); 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // No other request available yet since we do not support multiple requests 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // per connection. 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(HttpRequestParser::WAITING, parser.ParseRequest()); 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(HttpRequestTest, ParseRequestWithEmptyBody) { 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HttpRequestParser parser; 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parser.ProcessChunk("POST /foobar.html HTTP/1.1\r\n"); 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parser.ProcessChunk("Content-Length: 0\r\n\r\n"); 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(HttpRequestParser::ACCEPTED, parser.ParseRequest()); 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<HttpRequest> request = parser.GetRequest(); 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("", request->content); 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(request->has_content); 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, request->headers.count("Content-Length")); 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("0", request->headers["Content-Length"]); 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(HttpRequestTest, ParseRequestWithoutBody) { 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HttpRequestParser parser; 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parser.ProcessChunk("POST /foobar.html HTTP/1.1\r\n\r\n"); 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(HttpRequestParser::ACCEPTED, parser.ParseRequest()); 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<HttpRequest> request = parser.GetRequest(); 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("", request->content); 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(request->has_content); 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace test_server 82b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)} // namespace net 83