OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "chrome/browser/chromeos/gdata/test_servers/http_test_server.h" |
| 6 |
| 7 #include "base/stl_util.h" |
| 8 #include "base/file_util.h" |
| 9 #include "chrome/browser/chromeos/gdata/test_servers/http_request.h" |
| 10 #include "chrome/browser/chromeos/gdata/test_servers/http_response.h" |
| 11 #include "content/public/browser/browser_thread.h" |
| 12 #include "net/tools/fetch/http_listen_socket.h" |
| 13 |
| 14 #include <sstream> |
| 15 |
| 16 namespace gdata { |
| 17 namespace test_servers { |
| 18 |
| 19 using content::BrowserThread; |
| 20 |
| 21 namespace { |
| 22 const int kPort = 8040; |
| 23 const std::string kIp = "127.0.0.1"; |
| 24 const int kRetries = 10; |
| 25 } // namespace |
| 26 |
| 27 DefaultResponseProvider::DefaultResponseProvider( |
| 28 const GURL& request_url, |
| 29 const HttpResponse& default_response) : |
| 30 request_url_(request_url), |
| 31 default_response_(default_response) { |
| 32 } |
| 33 |
| 34 DefaultResponseProvider::~DefaultResponseProvider() { |
| 35 } |
| 36 |
| 37 bool DefaultResponseProvider::CanHandleRequest(HttpRequest* request) { |
| 38 // TODO(mtomasz): We ignore a query string here. Is it fine? |
| 39 // TODO(mtomasz): We do not verify a host here, is it ok? |
| 40 // TODO(mtomasz): How about proxy? |
| 41 return request->url.path() == request_url_.path(); |
| 42 } |
| 43 |
| 44 scoped_ptr<HttpResponse> DefaultResponseProvider::ProcessRequest( |
| 45 HttpRequest* request) { |
| 46 return scoped_ptr<HttpResponse>( |
| 47 new HttpResponse(default_response_)).Pass(); |
| 48 } |
| 49 |
| 50 HttpTestServer::HttpTestServer(bool start_on_create) : port_(-1), |
| 51 last_unique_id_(0) { |
| 52 if (start_on_create) { |
| 53 Start(); |
| 54 } |
| 55 } |
| 56 |
| 57 HttpTestServer::~HttpTestServer() { |
| 58 STLDeleteContainerPointers(response_providers_.begin(), |
| 59 response_providers_.end()); |
| 60 } |
| 61 |
| 62 bool HttpTestServer::Start() { |
| 63 if (server_.get() != NULL) { |
| 64 LOG(ERROR) << "Server already started."; |
| 65 return false; |
| 66 } |
| 67 |
| 68 int port = kPort; |
| 69 int tries_left = kRetries + 1; |
| 70 |
| 71 // Try to create a listening socket. |
| 72 while (tries_left) { |
| 73 server_ = HttpServer::CreateServer(kIp, port, this); |
| 74 if (server_.get() != NULL) { |
| 75 port_ = port; |
| 76 std::stringstream base_url_builder; |
| 77 base_url_builder << "http://" << kIp << ":" << port; |
| 78 base_url_ = GURL(base_url_builder.str()); |
| 79 return true; |
| 80 } |
| 81 port++; |
| 82 tries_left--; |
| 83 } |
| 84 |
| 85 LOG(ERROR) << "Unabled to start the server."; |
| 86 return false; |
| 87 } |
| 88 |
| 89 bool HttpTestServer::HandleRequest(HttpConnection& connection, |
| 90 scoped_ptr<HttpRequest> request) { |
| 91 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 92 |
| 93 std::vector<ResponseProviderInterface*>::iterator current_provider = |
| 94 response_providers_.begin(); |
| 95 while (current_provider != response_providers_.end()) { |
| 96 if ((*current_provider)->CanHandleRequest(request.get())) { |
| 97 scoped_ptr<HttpResponse> response = |
| 98 (*current_provider)->ProcessRequest(request.get()); |
| 99 connection.SendResponse(response.Pass()); |
| 100 return true; |
| 101 } |
| 102 current_provider++; |
| 103 } |
| 104 |
| 105 // TODO(mtomasz): Important. Return 404 here instead of just closing |
| 106 // the socket. |
| 107 LOG(ERROR) << "Request not handled. Closing the connection."; |
| 108 return false; |
| 109 } |
| 110 |
| 111 GURL HttpTestServer::GetBaseURL() { |
| 112 return base_url_; |
| 113 } |
| 114 |
| 115 GURL HttpTestServer::GetErrorURL(RESPONSE_CODE code) { |
| 116 // TODO(mtomasz): Implement this. |
| 117 return base_url_; |
| 118 } |
| 119 |
| 120 void HttpTestServer::RegisterResponseProvider( |
| 121 ResponseProviderInterface& provider) { |
| 122 response_providers_.push_back(&provider); |
| 123 } |
| 124 |
| 125 GURL HttpTestServer::RegisterDefaultResponse( |
| 126 const std::string& relative_path, |
| 127 const HttpResponse& default_response) { |
| 128 GURL request_url = base_url_.Resolve(relative_path); |
| 129 response_providers_.push_back(new DefaultResponseProvider(request_url, |
| 130 default_response)); |
| 131 return request_url; |
| 132 } |
| 133 |
| 134 GURL HttpTestServer::RegisterTextResponse( |
| 135 const std::string& relative_path, |
| 136 const std::string& content, |
| 137 const std::string& content_type, |
| 138 const RESPONSE_CODE response_code) { |
| 139 HttpResponse default_response; |
| 140 // TODO(mtomasz): Handle content. |
| 141 default_response.content_type = content_type; |
| 142 default_response.code = response_code; |
| 143 |
| 144 return RegisterDefaultResponse(relative_path, |
| 145 default_response); |
| 146 } |
| 147 |
| 148 GURL HttpTestServer::RegisterTextResponse( |
| 149 const std::string& content, |
| 150 const std::string& content_type) { |
| 151 return RegisterTextResponse(GenerateUniqueIdentifier(), |
| 152 content, |
| 153 content_type, |
| 154 SUCCESS); |
| 155 } |
| 156 |
| 157 GURL HttpTestServer::RegisterFileResponse( |
| 158 const std::string& relative_path, |
| 159 const FilePath& file_path, |
| 160 const std::string& content_type, |
| 161 const RESPONSE_CODE response_code) { |
| 162 HttpResponse default_response; |
| 163 |
| 164 // TODO(mtomasz): Handle errors. |
| 165 file_util::ReadFileToString(file_path, &default_response.content); |
| 166 |
| 167 default_response.content_type = content_type; |
| 168 default_response.code = response_code; |
| 169 |
| 170 return RegisterDefaultResponse(relative_path, |
| 171 default_response); |
| 172 } |
| 173 |
| 174 GURL HttpTestServer::RegisterFileResponse( |
| 175 const FilePath& file_path, |
| 176 const std::string& content_type) { |
| 177 return RegisterFileResponse( |
| 178 GenerateUniqueIdentifier() + "/" + file_path.BaseName().value(), |
| 179 file_path, |
| 180 content_type, |
| 181 SUCCESS); |
| 182 } |
| 183 |
| 184 std::string HttpTestServer::GenerateUniqueIdentifier() { |
| 185 std::stringstream result_builder; |
| 186 result_builder << ++last_unique_id_; |
| 187 return result_builder.str(); |
| 188 } |
| 189 |
| 190 } // namespace test_servers |
| 191 } // namespace gdata |
OLD | NEW |