url_request_simple_job.cc revision 9ab5563a3196760eb381d102cbb2bc0f7abc6a50
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_simple_job.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
99ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/io_buffer.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_status.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)URLRequestSimpleJob::URLRequestSimpleJob(
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest* request, NetworkDelegate* network_delegate)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : URLRequestJob(request, network_delegate),
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      data_offset_(0),
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      weak_factory_(this) {}
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequestSimpleJob::Start() {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start reading asynchronously so that all error reporting and data
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // callbacks happen as they would for network requests.
2590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->PostTask(
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
2790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::Bind(&URLRequestSimpleJob::StartAsync, weak_factory_.GetWeakPtr()));
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool URLRequestSimpleJob::GetMimeType(std::string* mime_type) const {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *mime_type = mime_type_;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool URLRequestSimpleJob::GetCharset(std::string* charset) {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *charset = charset_;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)URLRequestSimpleJob::~URLRequestSimpleJob() {}
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool URLRequestSimpleJob::ReadRawData(IOBuffer* buf, int buf_size,
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      int* bytes_read) {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(bytes_read);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int remaining = static_cast<int>(data_.size()) - data_offset_;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (buf_size > remaining)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buf_size = remaining;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memcpy(buf->data(), data_.data() + data_offset_, buf_size);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data_offset_ += buf_size;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *bytes_read = buf_size;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequestSimpleJob::StartAsync() {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!request_)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result = GetData(&mime_type_, &charset_, &data_,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       base::Bind(&URLRequestSimpleJob::OnGetDataCompleted,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  weak_factory_.GetWeakPtr()));
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (result != ERR_IO_PENDING)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OnGetDataCompleted(result);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequestSimpleJob::OnGetDataCompleted(int result) {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (result == OK) {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Notify that the headers are complete
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NotifyHeadersComplete();
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NotifyStartError(URLRequestStatus(URLRequestStatus::FAILED, result));
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
75