url_request_simple_job.cc revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
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"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/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.
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MessageLoop::current()->PostTask(
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&URLRequestSimpleJob::StartAsync,
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 weak_factory_.GetWeakPtr()));
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool URLRequestSimpleJob::GetMimeType(std::string* mime_type) const {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *mime_type = mime_type_;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool URLRequestSimpleJob::GetCharset(std::string* charset) {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *charset = charset_;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)URLRequestSimpleJob::~URLRequestSimpleJob() {}
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool URLRequestSimpleJob::ReadRawData(IOBuffer* buf, int buf_size,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      int* bytes_read) {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(bytes_read);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int remaining = static_cast<int>(data_.size()) - data_offset_;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (buf_size > remaining)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buf_size = remaining;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memcpy(buf->data(), data_.data() + data_offset_, buf_size);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data_offset_ += buf_size;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *bytes_read = buf_size;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequestSimpleJob::StartAsync() {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!request_)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result = GetData(&mime_type_, &charset_, &data_,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       base::Bind(&URLRequestSimpleJob::OnGetDataCompleted,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  weak_factory_.GetWeakPtr()));
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (result != ERR_IO_PENDING)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OnGetDataCompleted(result);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequestSimpleJob::OnGetDataCompleted(int result) {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (result == OK) {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Notify that the headers are complete
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NotifyHeadersComplete();
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NotifyStartError(URLRequestStatus(URLRequestStatus::FAILED, result));
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
76