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

Unified Diff: net/url_request/url_request_test_job.cc

Issue 67019: URLRequest::Interceptor enhancements... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 8 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
« no previous file with comments | « net/url_request/url_request_test_job.h ('k') | net/url_request/url_request_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/url_request/url_request_test_job.cc
===================================================================
--- net/url_request/url_request_test_job.cc (revision 13871)
+++ net/url_request/url_request_test_job.cc (working copy)
@@ -42,6 +42,32 @@
return std::string("<html><title>Test Three Three Three</title></html>");
}
+// static getter for simple response headers
+std::string URLRequestTestJob::test_headers() {
+ const char headers[] =
+ "HTTP/1.1 200 OK\0"
+ "Content-type: text/html\0"
+ "\0";
+ return std::string(headers, arraysize(headers));
+}
+
+// static getter for redirect response headers
+std::string URLRequestTestJob::test_redirect_headers() {
+ const char headers[] =
+ "HTTP/1.1 302 MOVED\0"
+ "Location: somewhere\0"
+ "\0";
+ return std::string(headers, arraysize(headers));
+}
+
+// static getter for error response headers
+std::string URLRequestTestJob::test_error_headers() {
+ const char headers[] =
+ "HTTP/1.1 500 BOO HOO\0"
+ "\0";
+ return std::string(headers, arraysize(headers));
+}
+
// static
URLRequestJob* URLRequestTestJob::Factory(URLRequest* request,
const std::string& scheme) {
@@ -50,17 +76,44 @@
URLRequestTestJob::URLRequestTestJob(URLRequest* request)
: URLRequestJob(request),
+ auto_advance_(false),
stage_(WAITING),
offset_(0),
async_buf_(NULL),
async_buf_size_(0) {
}
-// Force the response to set a reasonable MIME type
+URLRequestTestJob::URLRequestTestJob(URLRequest* request, bool auto_advance)
+ : URLRequestJob(request),
+ auto_advance_(auto_advance),
+ stage_(WAITING),
+ offset_(0),
+ async_buf_(NULL),
+ async_buf_size_(0) {
+}
+
+URLRequestTestJob::URLRequestTestJob(URLRequest* request,
+ const std::string& response_headers,
+ const std::string& response_data,
+ bool auto_advance)
+ : URLRequestJob(request),
+ auto_advance_(auto_advance),
+ stage_(WAITING),
+ response_headers_(new net::HttpResponseHeaders(response_headers)),
+ response_data_(response_data),
+ offset_(0),
+ async_buf_(NULL),
+ async_buf_size_(0) {
+}
+
+URLRequestTestJob::~URLRequestTestJob() {
+}
+
bool URLRequestTestJob::GetMimeType(std::string* mime_type) const {
DCHECK(mime_type);
- *mime_type = "text/html";
- return true;
+ if (!response_headers_)
+ return false;
+ return response_headers_->GetMimeType(mime_type);
}
void URLRequestTestJob::Start() {
@@ -71,25 +124,28 @@
}
void URLRequestTestJob::StartAsync() {
- if (request_->url().spec() == test_url_1().spec()) {
- data_ = test_data_1();
- stage_ = DATA_AVAILABLE; // Simulate a synchronous response for this one.
- } else if (request_->url().spec() == test_url_2().spec()) {
- data_ = test_data_2();
- } else if (request_->url().spec() == test_url_3().spec()) {
- data_ = test_data_3();
- } else {
- // unexpected url, return error
- // FIXME(brettw) we may want to use WININET errors or have some more types
- // of errors
- NotifyDone(URLRequestStatus(URLRequestStatus::FAILED,
- net::ERR_INVALID_URL));
- // FIXME(brettw): this should emulate a network error, and not just fail
- // initiating a connection
- return;
+ if (!response_headers_) {
+ response_headers_ = new net::HttpResponseHeaders(test_headers());
+ if (request_->url().spec() == test_url_1().spec()) {
+ response_data_ = test_data_1();
+ stage_ = DATA_AVAILABLE; // Simulate a synchronous response for this one.
+ } else if (request_->url().spec() == test_url_2().spec()) {
+ response_data_ = test_data_2();
+ } else if (request_->url().spec() == test_url_3().spec()) {
+ response_data_ = test_data_3();
+ } else {
+ // unexpected url, return error
+ // FIXME(brettw) we may want to use WININET errors or have some more types
+ // of errors
+ NotifyDone(URLRequestStatus(URLRequestStatus::FAILED,
+ net::ERR_INVALID_URL));
+ // FIXME(brettw): this should emulate a network error, and not just fail
+ // initiating a connection
+ return;
+ }
}
- pending_jobs.push_back(scoped_refptr<URLRequestTestJob>(this));
+ AdvanceJob();
this->NotifyHeadersComplete();
}
@@ -106,15 +162,15 @@
DCHECK(bytes_read);
*bytes_read = 0;
- if (offset_ >= static_cast<int>(data_.length())) {
+ if (offset_ >= static_cast<int>(response_data_.length())) {
return true; // done reading
}
int to_read = buf_size;
- if (to_read + offset_ > static_cast<int>(data_.length()))
- to_read = static_cast<int>(data_.length()) - offset_;
+ if (to_read + offset_ > static_cast<int>(response_data_.length()))
+ to_read = static_cast<int>(response_data_.length()) - offset_;
- memcpy(buf->data(), &data_.c_str()[offset_], to_read);
+ memcpy(buf->data(), &response_data_.c_str()[offset_], to_read);
offset_ += to_read;
*bytes_read = to_read;
@@ -122,19 +178,31 @@
}
void URLRequestTestJob::GetResponseInfo(net::HttpResponseInfo* info) {
- const std::string kResponseHeaders = StringPrintf(
- "HTTP/1.1 200 OK%c"
- "Content-type: text/html%c"
- "%c", 0, 0, 0);
- info->headers = new net::HttpResponseHeaders(kResponseHeaders);
+ if (response_headers_)
+ info->headers = response_headers_;
}
+bool URLRequestTestJob::IsRedirectResponse(GURL* location,
+ int* http_status_code) {
+ if (!response_headers_)
+ return false;
+
+ std::string value;
+ if (!response_headers_->IsRedirect(&value))
+ return false;
+
+ *location = request_->url().Resolve(value);
+ *http_status_code = response_headers_->response_code();
+ return true;
+}
+
+
void URLRequestTestJob::Kill() {
stage_ = DONE;
URLRequestJob::Kill();
}
-bool URLRequestTestJob::ProcessNextOperation() {
+void URLRequestTestJob::ProcessNextOperation() {
switch (stage_) {
case WAITING:
stage_ = DATA_AVAILABLE;
@@ -152,16 +220,25 @@
break;
case ALL_DATA:
stage_ = DONE;
- return false;
+ return;
case DONE:
- return false;
+ return;
default:
NOTREACHED() << "Invalid stage";
- return false;
+ return;
}
- return true;
+ AdvanceJob();
}
+void URLRequestTestJob::AdvanceJob() {
+ if (auto_advance_) {
+ MessageLoop::current()->PostTask(FROM_HERE, NewRunnableMethod(
+ this, &URLRequestTestJob::ProcessNextOperation));
+ return;
+ }
+ pending_jobs.push_back(scoped_refptr<URLRequestTestJob>(this));
+}
+
// static
bool URLRequestTestJob::ProcessOnePendingMessage() {
if (pending_jobs.empty())
@@ -170,8 +247,7 @@
scoped_refptr<URLRequestTestJob> next_job(pending_jobs[0]);
pending_jobs.erase(pending_jobs.begin());
- if (next_job->ProcessNextOperation())
- pending_jobs.push_back(next_job);
-
+ DCHECK(!next_job->auto_advance()); // auto_advance jobs should be in this q
+ next_job->ProcessNextOperation();
return true;
}
« no previous file with comments | « net/url_request/url_request_test_job.h ('k') | net/url_request/url_request_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698