1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be
3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file.
4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/url_request/url_request_simple_job.h"
6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
7ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/compiler_specific.h"
8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/message_loop.h"
9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/base/io_buffer.h"
10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/base/net_errors.h"
11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/url_request/url_request_status.h"
12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsennamespace net {
1421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
1521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenURLRequestSimpleJob::URLRequestSimpleJob(URLRequest* request)
16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    : URLRequestJob(request),
17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      data_offset_(0),
18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)) {}
19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid URLRequestSimpleJob::Start() {
21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Start reading asynchronously so that all error reporting and data
22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // callbacks happen as they would for network requests.
23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  MessageLoop::current()->PostTask(
24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      FROM_HERE,
25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      method_factory_.NewRunnableMethod(&URLRequestSimpleJob::StartAsync));
26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottbool URLRequestSimpleJob::GetMimeType(std::string* mime_type) const {
29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  *mime_type = mime_type_;
30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return true;
31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottbool URLRequestSimpleJob::GetCharset(std::string* charset) {
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  *charset = charset_;
35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return true;
36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenURLRequestSimpleJob::~URLRequestSimpleJob() {}
39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
4021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenbool URLRequestSimpleJob::ReadRawData(IOBuffer* buf, int buf_size,
41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                      int* bytes_read) {
42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DCHECK(bytes_read);
43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int remaining = static_cast<int>(data_.size()) - data_offset_;
44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (buf_size > remaining)
45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    buf_size = remaining;
46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  memcpy(buf->data(), data_.data() + data_offset_, buf_size);
47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  data_offset_ += buf_size;
48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  *bytes_read = buf_size;
49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return true;
50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid URLRequestSimpleJob::StartAsync() {
53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (!request_)
54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return;
55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (GetData(&mime_type_, &charset_, &data_)) {
57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // Notify that the headers are complete
58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    NotifyHeadersComplete();
59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  } else {
60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // what should the error code be?
61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    NotifyStartError(URLRequestStatus(URLRequestStatus::FAILED,
6221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                                      ERR_INVALID_URL));
63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
6521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
6621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}  // namespace net
67