blob: b355fdbefbe7fd4a80636a4d1a222d88a7d15d9c [file] [log] [blame]
Andrew de los Reyes45168102010-11-22 11:13:50 -08001// Copyright (c) 2009 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "update_engine/http_fetcher.h"
6
Alex Deymo60ca1a72015-06-18 18:19:15 -07007#include <base/bind.h>
8
Alex Vakulenko4906c1c2014-08-21 13:17:44 -07009using base::Closure;
Alex Deymo60ca1a72015-06-18 18:19:15 -070010using chromeos::MessageLoop;
Andrew de los Reyes45168102010-11-22 11:13:50 -080011using std::deque;
12using std::string;
13
14namespace chromeos_update_engine {
15
Andrew de los Reyesf3ed8e72011-02-16 10:35:46 -080016HttpFetcher::~HttpFetcher() {
Alex Deymo60ca1a72015-06-18 18:19:15 -070017 if (no_resolver_idle_id_ != MessageLoop::kTaskIdNull) {
18 MessageLoop::current()->CancelTask(no_resolver_idle_id_);
19 no_resolver_idle_id_ = MessageLoop::kTaskIdNull;
Andrew de los Reyesf3ed8e72011-02-16 10:35:46 -080020 }
21}
22
Gilad Arnold9dd1e7c2012-02-16 12:13:36 -080023void HttpFetcher::SetPostData(const void* data, size_t size,
24 HttpContentType type) {
Andrew de los Reyes45168102010-11-22 11:13:50 -080025 post_data_set_ = true;
26 post_data_.clear();
Alex Deymo60ca1a72015-06-18 18:19:15 -070027 const char* char_data = reinterpret_cast<const char*>(data);
Andrew de los Reyes45168102010-11-22 11:13:50 -080028 post_data_.insert(post_data_.end(), char_data, char_data + size);
Gilad Arnold9dd1e7c2012-02-16 12:13:36 -080029 post_content_type_ = type;
30}
31
32void HttpFetcher::SetPostData(const void* data, size_t size) {
33 SetPostData(data, size, kHttpContentTypeUnspecified);
Andrew de los Reyes45168102010-11-22 11:13:50 -080034}
35
36// Proxy methods to set the proxies, then to pop them off.
Alex Deymo60ca1a72015-06-18 18:19:15 -070037bool HttpFetcher::ResolveProxiesForUrl(const string& url,
38 const Closure& callback) {
39 CHECK_EQ(static_cast<Closure*>(nullptr), callback_.get());
40 callback_.reset(new Closure(callback));
41
Andrew de los Reyes45168102010-11-22 11:13:50 -080042 if (!proxy_resolver_) {
43 LOG(INFO) << "Not resolving proxies (no proxy resolver).";
Alex Deymo60ca1a72015-06-18 18:19:15 -070044 no_resolver_idle_id_ = MessageLoop::current()->PostTask(
45 FROM_HERE,
46 base::Bind(&HttpFetcher::NoProxyResolverCallback,
47 base::Unretained(this)));
Andrew de los Reyesf3ed8e72011-02-16 10:35:46 -080048 return true;
Andrew de los Reyes45168102010-11-22 11:13:50 -080049 }
Andrew de los Reyesf3ed8e72011-02-16 10:35:46 -080050 return proxy_resolver_->GetProxiesForUrl(url,
51 &HttpFetcher::StaticProxiesResolved,
52 this);
53}
54
Alex Deymo60ca1a72015-06-18 18:19:15 -070055void HttpFetcher::NoProxyResolverCallback() {
56 ProxiesResolved(deque<string>());
57}
58
Alex Deymof329b932014-10-30 01:37:48 -070059void HttpFetcher::ProxiesResolved(const deque<string>& proxies) {
Alex Deymo60ca1a72015-06-18 18:19:15 -070060 no_resolver_idle_id_ = MessageLoop::kTaskIdNull;
Andrew de los Reyesf3ed8e72011-02-16 10:35:46 -080061 if (!proxies.empty())
Andrew de los Reyes45168102010-11-22 11:13:50 -080062 SetProxies(proxies);
Alex Deymo60ca1a72015-06-18 18:19:15 -070063 CHECK_NE(static_cast<Closure*>(nullptr), callback_.get());
64 Closure* callback = callback_.release();
Andrew de los Reyesffcb6d12011-04-04 09:57:38 -070065 // This may indirectly call back into ResolveProxiesForUrl():
66 callback->Run();
Alex Deymoc4acdf42014-05-28 21:07:10 -070067 delete callback;
Andrew de los Reyes45168102010-11-22 11:13:50 -080068}
69
70} // namespace chromeos_update_engine