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

Side by Side 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 unified diff | Download patch
OLDNEW
(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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698