diff --git a/chrome/browser/google_apis/test_server/http_request.cc b/chrome/browser/google_apis/test_server/http_request.cc index dc1b2ad3999c07..dfbea914941c67 100644 --- a/chrome/browser/google_apis/test_server/http_request.cc +++ b/chrome/browser/google_apis/test_server/http_request.cc @@ -96,8 +96,9 @@ HttpRequestParser::ParseResult HttpRequestParser::ParseHeaders() { http_request_->method = GetMethodType(StringToLowerASCII( header_line_tokens[0])); // Address. - const GURL host = GURL("http://localhost/"); - http_request_->url = host.Resolve(header_line_tokens[1]); + // Don't build an absolute URL as the parser does not know (should not + // know) anything about the server address. + http_request_->relative_url = header_line_tokens[1]; // Protocol. const std::string protocol = StringToLowerASCII(header_line_tokens[2]); CHECK(protocol == "http/1.0" || protocol == "http/1.1") << diff --git a/chrome/browser/google_apis/test_server/http_request.h b/chrome/browser/google_apis/test_server/http_request.h index c50de1947ffc66..adc2de20813b22 100644 --- a/chrome/browser/google_apis/test_server/http_request.h +++ b/chrome/browser/google_apis/test_server/http_request.h @@ -32,7 +32,7 @@ struct HttpRequest { HttpRequest(); ~HttpRequest(); - GURL url; + std::string relative_url; // Starts with '/'. Example: "/test?query=foo" HttpMethod method; std::map headers; std::string content; diff --git a/chrome/browser/google_apis/test_server/http_request_unittest.cc b/chrome/browser/google_apis/test_server/http_request_unittest.cc index 41ba088a6da14e..27c8ed8fd84527 100644 --- a/chrome/browser/google_apis/test_server/http_request_unittest.cc +++ b/chrome/browser/google_apis/test_server/http_request_unittest.cc @@ -34,7 +34,7 @@ TEST(HttpRequestTest, ParseRequest) { // Fetch the first request and validate it. { scoped_ptr request = parser.GetRequest(); - EXPECT_EQ("http://localhost/foobar.html", request->url.spec()); + EXPECT_EQ("/foobar.html", request->relative_url); EXPECT_EQ(METHOD_POST, request->method); EXPECT_EQ("1234567890", request->content); ASSERT_EQ(3u, request->headers.size()); diff --git a/chrome/browser/google_apis/test_server/http_server.cc b/chrome/browser/google_apis/test_server/http_server.cc index 47ba9a6c05e18d..71efd95aeb16be 100644 --- a/chrome/browser/google_apis/test_server/http_server.cc +++ b/chrome/browser/google_apis/test_server/http_server.cc @@ -31,7 +31,8 @@ const int kRetries = 10; scoped_ptr HandleDefaultRequest(const GURL& url, const HttpResponse& response, const HttpRequest& request) { - if (url.path() != request.url.path()) + const GURL request_url = url.Resolve(request.relative_url); + if (url.path() != request_url.path()) return scoped_ptr(NULL); return scoped_ptr(new HttpResponse(response)); } @@ -136,7 +137,8 @@ void HttpServer::HandleRequest(HttpConnection* connection, } } - LOG(WARNING) << "Request not handled. Returning 404."; + LOG(WARNING) << "Request not handled. Returning 404: " + << request->relative_url; scoped_ptr not_found_response(new HttpResponse()); not_found_response->set_code(NOT_FOUND); connection->SendResponse(not_found_response.Pass()); @@ -169,10 +171,9 @@ void HttpServer::RegisterDefaultResponse( DCHECK(StartsWithASCII(relative_path, "/", true /* case_sensitive */)) << relative_path; - GURL request_url = base_url_.Resolve(relative_path); const HandleRequestCallback callback = base::Bind(&HandleDefaultRequest, - request_url, + GetURL(relative_path), default_response); request_handlers_.push_back(callback); } diff --git a/chrome/browser/google_apis/test_server/http_server_unittest.cc b/chrome/browser/google_apis/test_server/http_server_unittest.cc index cc665134bd3b91..946de76bd559f4 100644 --- a/chrome/browser/google_apis/test_server/http_server_unittest.cc +++ b/chrome/browser/google_apis/test_server/http_server_unittest.cc @@ -79,9 +79,22 @@ class HttpServerTest : public testing::Test, message_loop_.Run(); // Will be terminated in OnURLFetchComplete(). } + // Handles the request and returns a simple text content. Saves the + // request URL for verification. + scoped_ptr HandleRequest(const HttpRequest& request) { + request_relative_url_ = request.relative_url; + + scoped_ptr http_response(new HttpResponse); + http_response->set_code(SUCCESS); + http_response->set_content("Worked!"); + http_response->set_content_type("text/html"); + return http_response.Pass(); + } + protected: int num_responses_received_; int num_responses_expected_; + std::string request_relative_url_; MessageLoopForUI message_loop_; content::TestBrowserThread ui_thread_; content::TestBrowserThread io_thread_; @@ -100,6 +113,26 @@ TEST_F(HttpServerTest, GetURL) { server_.GetURL("/path?query=foo").spec()); } +TEST_F(HttpServerTest, RegisterRequestHandler) { + server_.RegisterRequestHandler(base::Bind(&HttpServerTest::HandleRequest, + base::Unretained(this))); + + scoped_ptr fetcher( + net::URLFetcher::Create(server_.GetURL("/test?q=foo"), + net::URLFetcher::GET, + this)); + fetcher->SetRequestContext(request_context_getter_.get()); + fetcher->Start(); + WaitForResponses(1); + + EXPECT_EQ(net::URLRequestStatus::SUCCESS, fetcher->GetStatus().status()); + EXPECT_EQ(SUCCESS, fetcher->GetResponseCode()); + EXPECT_EQ("Worked!", GetContentFromFetcher(*fetcher)); + EXPECT_EQ("text/html", GetContentTypeFromFetcher(*fetcher)); + + EXPECT_EQ("/test?q=foo", request_relative_url_); +} + TEST_F(HttpServerTest, RegisterDefaultResponse) { HttpResponse http_response; // MOVED is chosen here, as it's rather an unusual code.