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

Unified Diff: chrome/browser/chromeos/gdata/test_servers/http_test_server.cc

Issue 11088073: HTTP server for testing Google Drive. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Addressed comments. Created 8 years, 2 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/chromeos/gdata/test_servers/http_test_server.cc
diff --git a/chrome/browser/chromeos/gdata/test_servers/http_test_server.cc b/chrome/browser/chromeos/gdata/test_servers/http_test_server.cc
new file mode 100644
index 0000000000000000000000000000000000000000..79417a36e802b0a4eaf89b9b7cf301384d00aa4b
--- /dev/null
+++ b/chrome/browser/chromeos/gdata/test_servers/http_test_server.cc
@@ -0,0 +1,191 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/chromeos/gdata/test_servers/http_test_server.h"
+
+#include "base/stl_util.h"
+#include "base/file_util.h"
+#include "chrome/browser/chromeos/gdata/test_servers/http_request.h"
+#include "chrome/browser/chromeos/gdata/test_servers/http_response.h"
+#include "content/public/browser/browser_thread.h"
+#include "net/tools/fetch/http_listen_socket.h"
+
+#include <sstream>
+
+namespace gdata {
+namespace test_servers {
+
+using content::BrowserThread;
+
+namespace {
+const int kPort = 8040;
+const std::string kIp = "127.0.0.1";
+const int kRetries = 10;
+} // namespace
+
+DefaultResponseProvider::DefaultResponseProvider(
+ const GURL& request_url,
+ const HttpResponse& default_response) :
+ request_url_(request_url),
+ default_response_(default_response) {
+}
+
+DefaultResponseProvider::~DefaultResponseProvider() {
+}
+
+bool DefaultResponseProvider::CanHandleRequest(HttpRequest* request) {
+ // TODO(mtomasz): We ignore a query string here. Is it fine?
+ // TODO(mtomasz): We do not verify a host here, is it ok?
+ // TODO(mtomasz): How about proxy?
+ return request->url.path() == request_url_.path();
+}
+
+scoped_ptr<HttpResponse> DefaultResponseProvider::ProcessRequest(
+ HttpRequest* request) {
+ return scoped_ptr<HttpResponse>(
+ new HttpResponse(default_response_)).Pass();
+}
+
+HttpTestServer::HttpTestServer(bool start_on_create) : port_(-1),
+ last_unique_id_(0) {
+ if (start_on_create) {
+ Start();
+ }
+}
+
+HttpTestServer::~HttpTestServer() {
+ STLDeleteContainerPointers(response_providers_.begin(),
+ response_providers_.end());
+}
+
+bool HttpTestServer::Start() {
+ if (server_.get() != NULL) {
+ LOG(ERROR) << "Server already started.";
+ return false;
+ }
+
+ int port = kPort;
+ int tries_left = kRetries + 1;
+
+ // Try to create a listening socket.
+ while (tries_left) {
+ server_ = HttpServer::CreateServer(kIp, port, this);
+ if (server_.get() != NULL) {
+ port_ = port;
+ std::stringstream base_url_builder;
+ base_url_builder << "http://" << kIp << ":" << port;
+ base_url_ = GURL(base_url_builder.str());
+ return true;
+ }
+ port++;
+ tries_left--;
+ }
+
+ LOG(ERROR) << "Unabled to start the server.";
+ return false;
+}
+
+bool HttpTestServer::HandleRequest(HttpConnection& connection,
+ scoped_ptr<HttpRequest> request) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+
+ std::vector<ResponseProviderInterface*>::iterator current_provider =
+ response_providers_.begin();
+ while (current_provider != response_providers_.end()) {
+ if ((*current_provider)->CanHandleRequest(request.get())) {
+ scoped_ptr<HttpResponse> response =
+ (*current_provider)->ProcessRequest(request.get());
+ connection.SendResponse(response.Pass());
+ return true;
+ }
+ current_provider++;
+ }
+
+ // TODO(mtomasz): Important. Return 404 here instead of just closing
+ // the socket.
+ LOG(ERROR) << "Request not handled. Closing the connection.";
+ return false;
+}
+
+GURL HttpTestServer::GetBaseURL() {
+ return base_url_;
+}
+
+GURL HttpTestServer::GetErrorURL(RESPONSE_CODE code) {
+ // TODO(mtomasz): Implement this.
+ return base_url_;
+}
+
+void HttpTestServer::RegisterResponseProvider(
+ ResponseProviderInterface& provider) {
+ response_providers_.push_back(&provider);
+}
+
+GURL HttpTestServer::RegisterDefaultResponse(
+ const std::string& relative_path,
+ const HttpResponse& default_response) {
+ GURL request_url = base_url_.Resolve(relative_path);
+ response_providers_.push_back(new DefaultResponseProvider(request_url,
+ default_response));
+ return request_url;
+}
+
+GURL HttpTestServer::RegisterTextResponse(
+ const std::string& relative_path,
+ const std::string& content,
+ const std::string& content_type,
+ const RESPONSE_CODE response_code) {
+ HttpResponse default_response;
+ // TODO(mtomasz): Handle content.
+ default_response.content_type = content_type;
+ default_response.code = response_code;
+
+ return RegisterDefaultResponse(relative_path,
+ default_response);
+}
+
+GURL HttpTestServer::RegisterTextResponse(
+ const std::string& content,
+ const std::string& content_type) {
+ return RegisterTextResponse(GenerateUniqueIdentifier(),
+ content,
+ content_type,
+ SUCCESS);
+}
+
+GURL HttpTestServer::RegisterFileResponse(
+ const std::string& relative_path,
+ const FilePath& file_path,
+ const std::string& content_type,
+ const RESPONSE_CODE response_code) {
+ HttpResponse default_response;
+
+ // TODO(mtomasz): Handle errors.
+ file_util::ReadFileToString(file_path, &default_response.content);
+
+ default_response.content_type = content_type;
+ default_response.code = response_code;
+
+ return RegisterDefaultResponse(relative_path,
+ default_response);
+}
+
+GURL HttpTestServer::RegisterFileResponse(
+ const FilePath& file_path,
+ const std::string& content_type) {
+ return RegisterFileResponse(
+ GenerateUniqueIdentifier() + "/" + file_path.BaseName().value(),
+ file_path,
+ content_type,
+ SUCCESS);
+}
+
+std::string HttpTestServer::GenerateUniqueIdentifier() {
+ std::stringstream result_builder;
+ result_builder << ++last_unique_id_;
+ return result_builder.str();
+}
+
+} // namespace test_servers
+} // namespace gdata

Powered by Google App Engine
This is Rietveld 408576698