1aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//
2aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// Copyright (C) 2010 The Android Open Source Project
3aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//
4aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// Licensed under the Apache License, Version 2.0 (the "License");
5aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// you may not use this file except in compliance with the License.
6aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// You may obtain a copy of the License at
7aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//
8aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//      http://www.apache.org/licenses/LICENSE-2.0
9aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//
10aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// Unless required by applicable law or agreed to in writing, software
11aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// distributed under the License is distributed on an "AS IS" BASIS,
12aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// See the License for the specific language governing permissions and
14aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// limitations under the License.
15aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//
169cd120d525cffe25fcf8af65be991bca04e3bfb1Andrew de los Reyes
17cf175a098081f3f0e9ca52d997a7ce1585c14c2dGilad Arnold#ifndef UPDATE_ENGINE_PROXY_RESOLVER_H_
18cf175a098081f3f0e9ca52d997a7ce1585c14c2dGilad Arnold#define UPDATE_ENGINE_PROXY_RESOLVER_H_
199cd120d525cffe25fcf8af65be991bca04e3bfb1Andrew de los Reyes
204516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes#include <deque>
219cd120d525cffe25fcf8af65be991bca04e3bfb1Andrew de los Reyes#include <string>
229cd120d525cffe25fcf8af65be991bca04e3bfb1Andrew de los Reyes
23f3ed8e7d4ad456a3c841d8a530f308b6fcb2a4ccAndrew de los Reyes#include <base/logging.h>
243f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenko#include <brillo/message_loops/message_loop.h>
25f3ed8e7d4ad456a3c841d8a530f308b6fcb2a4ccAndrew de los Reyes
2639910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/common/utils.h"
27f3ed8e7d4ad456a3c841d8a530f308b6fcb2a4ccAndrew de los Reyes
289cd120d525cffe25fcf8af65be991bca04e3bfb1Andrew de los Reyesnamespace chromeos_update_engine {
299cd120d525cffe25fcf8af65be991bca04e3bfb1Andrew de los Reyes
309cd120d525cffe25fcf8af65be991bca04e3bfb1Andrew de los Reyesextern const char kNoProxy[];
319cd120d525cffe25fcf8af65be991bca04e3bfb1Andrew de los Reyes
32f3ed8e7d4ad456a3c841d8a530f308b6fcb2a4ccAndrew de los Reyes// Callback for a call to GetProxiesForUrl().
33f3ed8e7d4ad456a3c841d8a530f308b6fcb2a4ccAndrew de los Reyes// Resultant proxies are in |out_proxy|. Each will be in one of the
34f3ed8e7d4ad456a3c841d8a530f308b6fcb2a4ccAndrew de los Reyes// following forms:
35f3ed8e7d4ad456a3c841d8a530f308b6fcb2a4ccAndrew de los Reyes// http://<host>[:<port>] - HTTP proxy
36f3ed8e7d4ad456a3c841d8a530f308b6fcb2a4ccAndrew de los Reyes// socks{4,5}://<host>[:<port>] - SOCKS4/5 proxy
37f3ed8e7d4ad456a3c841d8a530f308b6fcb2a4ccAndrew de los Reyes// kNoProxy - no proxy
38f3ed8e7d4ad456a3c841d8a530f308b6fcb2a4ccAndrew de los Reyestypedef void (*ProxiesResolvedFn)(const std::deque<std::string>& proxies,
39f3ed8e7d4ad456a3c841d8a530f308b6fcb2a4ccAndrew de los Reyes                                  void* data);
40f3ed8e7d4ad456a3c841d8a530f308b6fcb2a4ccAndrew de los Reyes
419cd120d525cffe25fcf8af65be991bca04e3bfb1Andrew de los Reyesclass ProxyResolver {
429cd120d525cffe25fcf8af65be991bca04e3bfb1Andrew de los Reyes public:
439cd120d525cffe25fcf8af65be991bca04e3bfb1Andrew de los Reyes  ProxyResolver() {}
449cd120d525cffe25fcf8af65be991bca04e3bfb1Andrew de los Reyes  virtual ~ProxyResolver() {}
459cd120d525cffe25fcf8af65be991bca04e3bfb1Andrew de los Reyes
46f3ed8e7d4ad456a3c841d8a530f308b6fcb2a4ccAndrew de los Reyes  // Finds proxies for the given URL and returns them via the callback.
47f3ed8e7d4ad456a3c841d8a530f308b6fcb2a4ccAndrew de los Reyes  // |data| will be passed to the callback.
48f3ed8e7d4ad456a3c841d8a530f308b6fcb2a4ccAndrew de los Reyes  // Returns true on success.
499cd120d525cffe25fcf8af65be991bca04e3bfb1Andrew de los Reyes  virtual bool GetProxiesForUrl(const std::string& url,
50f3ed8e7d4ad456a3c841d8a530f308b6fcb2a4ccAndrew de los Reyes                                ProxiesResolvedFn callback,
51f3ed8e7d4ad456a3c841d8a530f308b6fcb2a4ccAndrew de los Reyes                                void* data) = 0;
529cd120d525cffe25fcf8af65be991bca04e3bfb1Andrew de los Reyes
539cd120d525cffe25fcf8af65be991bca04e3bfb1Andrew de los Reyes private:
549cd120d525cffe25fcf8af65be991bca04e3bfb1Andrew de los Reyes  DISALLOW_COPY_AND_ASSIGN(ProxyResolver);
559cd120d525cffe25fcf8af65be991bca04e3bfb1Andrew de los Reyes};
569cd120d525cffe25fcf8af65be991bca04e3bfb1Andrew de los Reyes
579cd120d525cffe25fcf8af65be991bca04e3bfb1Andrew de los Reyes// Always says to not use a proxy
589cd120d525cffe25fcf8af65be991bca04e3bfb1Andrew de los Reyesclass DirectProxyResolver : public ProxyResolver {
599cd120d525cffe25fcf8af65be991bca04e3bfb1Andrew de los Reyes public:
6060ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  DirectProxyResolver() = default;
61610277efc6f7e5239158dfa4bb3b1021804326e0Alex Deymo  ~DirectProxyResolver() override;
62610277efc6f7e5239158dfa4bb3b1021804326e0Alex Deymo  bool GetProxiesForUrl(const std::string& url,
63610277efc6f7e5239158dfa4bb3b1021804326e0Alex Deymo                        ProxiesResolvedFn callback,
64610277efc6f7e5239158dfa4bb3b1021804326e0Alex Deymo                        void* data) override;
659cd120d525cffe25fcf8af65be991bca04e3bfb1Andrew de los Reyes
669bedeb51f80c9547269eef6c2ec09596033bb818Gilad Arnold  // Set the number of direct (non-) proxies to be returned by resolver.
679bedeb51f80c9547269eef6c2ec09596033bb818Gilad Arnold  // The default value is 1; higher numbers are currently used in testing.
689bedeb51f80c9547269eef6c2ec09596033bb818Gilad Arnold  inline void set_num_proxies(size_t num_proxies) {
699bedeb51f80c9547269eef6c2ec09596033bb818Gilad Arnold    num_proxies_ = num_proxies;
709bedeb51f80c9547269eef6c2ec09596033bb818Gilad Arnold  }
719bedeb51f80c9547269eef6c2ec09596033bb818Gilad Arnold
729cd120d525cffe25fcf8af65be991bca04e3bfb1Andrew de los Reyes private:
7360ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  // The ID of the main loop callback.
743f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenko  brillo::MessageLoop::TaskId idle_callback_id_{
753f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenko      brillo::MessageLoop::kTaskIdNull};
76f3ed8e7d4ad456a3c841d8a530f308b6fcb2a4ccAndrew de los Reyes
779bedeb51f80c9547269eef6c2ec09596033bb818Gilad Arnold  // Number of direct proxies to return on resolved list; currently used for
789bedeb51f80c9547269eef6c2ec09596033bb818Gilad Arnold  // testing.
7960ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  size_t num_proxies_{1};
809bedeb51f80c9547269eef6c2ec09596033bb818Gilad Arnold
81f3ed8e7d4ad456a3c841d8a530f308b6fcb2a4ccAndrew de los Reyes  // The MainLoop callback, from here we return to the client.
82f3ed8e7d4ad456a3c841d8a530f308b6fcb2a4ccAndrew de los Reyes  void ReturnCallback(ProxiesResolvedFn callback, void* data);
839cd120d525cffe25fcf8af65be991bca04e3bfb1Andrew de los Reyes  DISALLOW_COPY_AND_ASSIGN(DirectProxyResolver);
849cd120d525cffe25fcf8af65be991bca04e3bfb1Andrew de los Reyes};
859cd120d525cffe25fcf8af65be991bca04e3bfb1Andrew de los Reyes
869cd120d525cffe25fcf8af65be991bca04e3bfb1Andrew de los Reyes}  // namespace chromeos_update_engine
879cd120d525cffe25fcf8af65be991bca04e3bfb1Andrew de los Reyes
88cf175a098081f3f0e9ca52d997a7ce1585c14c2dGilad Arnold#endif  // UPDATE_ENGINE_PROXY_RESOLVER_H_
89