| Index: chrome/browser/net/url_fetcher.cc
|
| ===================================================================
|
| --- chrome/browser/net/url_fetcher.cc (revision 9942)
|
| +++ chrome/browser/net/url_fetcher.cc (working copy)
|
| @@ -12,9 +12,87 @@
|
| #include "googleurl/src/gurl.h"
|
| #include "net/base/load_flags.h"
|
| #include "net/base/io_buffer.h"
|
| +#include "net/http/http_response_headers.h"
|
| +#include "net/url_request/url_request.h"
|
| +#include "net/url_request/url_request_context.h"
|
|
|
| static const int kBufferSize = 4096;
|
|
|
| +class URLFetcher::Core
|
| + : public base::RefCountedThreadSafe<URLFetcher::Core>,
|
| + public URLRequest::Delegate {
|
| + public:
|
| + // For POST requests, set |content_type| to the MIME type of the content
|
| + // and set |content| to the data to upload. |flags| are flags to apply to
|
| + // the load operation--these should be one or more of the LOAD_* flags
|
| + // defined in url_request.h.
|
| + Core(URLFetcher* fetcher,
|
| + const GURL& original_url,
|
| + RequestType request_type,
|
| + URLFetcher::Delegate* d);
|
| +
|
| + // Starts the load. It's important that this not happen in the constructor
|
| + // because it causes the IO thread to begin AddRef()ing and Release()ing
|
| + // us. If our caller hasn't had time to fully construct us and take a
|
| + // reference, the IO thread could interrupt things, run a task, Release()
|
| + // us, and destroy us, leaving the caller with an already-destroyed object
|
| + // when construction finishes.
|
| + void Start();
|
| +
|
| + // Stops any in-progress load and ensures no callback will happen. It is
|
| + // safe to call this multiple times.
|
| + void Stop();
|
| +
|
| + // URLRequest::Delegate implementations
|
| + virtual void OnReceivedRedirect(URLRequest* request,
|
| + const GURL& new_url) { }
|
| + virtual void OnResponseStarted(URLRequest* request);
|
| + virtual void OnReadCompleted(URLRequest* request, int bytes_read);
|
| +
|
| + private:
|
| + // Wrapper functions that allow us to ensure actions happen on the right
|
| + // thread.
|
| + void StartURLRequest();
|
| + void CancelURLRequest();
|
| + void OnCompletedURLRequest(const URLRequestStatus& status);
|
| +
|
| + URLFetcher* fetcher_; // Corresponding fetcher object
|
| + GURL original_url_; // The URL we were asked to fetch
|
| + GURL url_; // The URL we eventually wound up at
|
| + RequestType request_type_; // What type of request is this?
|
| + URLFetcher::Delegate* delegate_; // Object to notify on completion
|
| + MessageLoop* delegate_loop_; // Message loop of the creating thread
|
| + MessageLoop* io_loop_; // Message loop of the IO thread
|
| + URLRequest* request_; // The actual request this wraps
|
| + int load_flags_; // Flags for the load operation
|
| + int response_code_; // HTTP status code for the request
|
| + std::string data_; // Results of the request
|
| + scoped_refptr<net::IOBuffer> buffer_;
|
| + // Read buffer
|
| + scoped_refptr<URLRequestContext> request_context_;
|
| + // Cookie/cache info for the request
|
| + ResponseCookies cookies_; // Response cookies
|
| + std::string extra_request_headers_;// Extra headers for the request, if any
|
| + scoped_refptr<net::HttpResponseHeaders> response_headers_;
|
| +
|
| + std::string upload_content_; // HTTP POST payload
|
| + std::string upload_content_type_; // MIME type of POST payload
|
| +
|
| + // The overload protection entry for this URL. This is used to
|
| + // incrementally back off how rapidly we'll send requests to a particular
|
| + // URL, to avoid placing too much demand on the remote resource. We update
|
| + // this with the status of all requests as they return, and in turn use it
|
| + // to determine how long to wait before making another request.
|
| + URLFetcherProtectEntry* protect_entry_;
|
| + // |num_retries_| indicates how many times we've failed to successfully
|
| + // fetch this URL. Once this value exceeds the maximum number of retries
|
| + // specified by the protection manager, we'll give up.
|
| + int num_retries_;
|
| +
|
| + friend class URLFetcher;
|
| + DISALLOW_COPY_AND_ASSIGN(Core);
|
| +};
|
| +
|
| URLFetcher::URLFetcher(const GURL& url,
|
| RequestType request_type,
|
| Delegate* d)
|
| @@ -184,3 +262,38 @@
|
| cookies_, data_);
|
| }
|
| }
|
| +
|
| +void URLFetcher::set_io_loop(MessageLoop* io_loop) {
|
| + core_->io_loop_ = io_loop;
|
| +}
|
| +
|
| +void URLFetcher::set_upload_data(const std::string& upload_content_type,
|
| + const std::string& upload_content) {
|
| + core_->upload_content_type_ = upload_content_type;
|
| + core_->upload_content_ = upload_content;
|
| +}
|
| +
|
| +void URLFetcher::set_load_flags(int load_flags) {
|
| + core_->load_flags_ = load_flags;
|
| +}
|
| +
|
| +void URLFetcher::set_extra_request_headers(
|
| + const std::string& extra_request_headers) {
|
| + core_->extra_request_headers_ = extra_request_headers;
|
| +}
|
| +
|
| +void URLFetcher::set_request_context(URLRequestContext* request_context) {
|
| + core_->request_context_ = request_context;
|
| +}
|
| +
|
| +net::HttpResponseHeaders* URLFetcher::response_headers() const {
|
| + return core_->response_headers_;
|
| +}
|
| +
|
| +void URLFetcher::Start() {
|
| + core_->Start();
|
| +}
|
| +
|
| +const GURL& URLFetcher::url() const {
|
| + return core_->url_;
|
| +}
|
|
|