| 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;
|
| }
|
|
|