Home | History | Annotate | Download | only in update_engine
      1 //
      2 // Copyright (C) 2011 The Android Open Source Project
      3 //
      4 // Licensed under the Apache License, Version 2.0 (the "License");
      5 // you may not use this file except in compliance with the License.
      6 // You may obtain a copy of the License at
      7 //
      8 //      http://www.apache.org/licenses/LICENSE-2.0
      9 //
     10 // Unless required by applicable law or agreed to in writing, software
     11 // distributed under the License is distributed on an "AS IS" BASIS,
     12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13 // See the License for the specific language governing permissions and
     14 // limitations under the License.
     15 //
     16 
     17 #ifndef UPDATE_ENGINE_CHROME_BROWSER_PROXY_RESOLVER_H_
     18 #define UPDATE_ENGINE_CHROME_BROWSER_PROXY_RESOLVER_H_
     19 
     20 #include <deque>
     21 #include <string>
     22 
     23 #include <gtest/gtest_prod.h>  // for FRIEND_TEST
     24 
     25 #include <brillo/message_loops/message_loop.h>
     26 
     27 #include "update_engine/libcros_proxy.h"
     28 #include "update_engine/proxy_resolver.h"
     29 
     30 namespace chromeos_update_engine {
     31 
     32 extern const char kLibCrosServiceName[];
     33 extern const char kLibCrosProxyResolveName[];
     34 extern const char kLibCrosProxyResolveSignalInterface[];
     35 
     36 class ChromeBrowserProxyResolver : public ProxyResolver {
     37  public:
     38   explicit ChromeBrowserProxyResolver(LibCrosProxy* libcros_proxy);
     39   ~ChromeBrowserProxyResolver() override;
     40 
     41   // Initialize the ProxyResolver using the provided DBus proxies.
     42   bool Init();
     43 
     44   ProxyRequestId GetProxiesForUrl(const std::string& url,
     45                                   const ProxiesResolvedFn& callback) override;
     46   bool CancelProxyRequest(ProxyRequestId request) override;
     47 
     48  private:
     49   FRIEND_TEST(ChromeBrowserProxyResolverTest, ParseTest);
     50   FRIEND_TEST(ChromeBrowserProxyResolverTest, SuccessTest);
     51   struct ProxyRequestData {
     52     brillo::MessageLoop::TaskId timeout_id;
     53     ProxiesResolvedFn callback;
     54   };
     55   typedef std::multimap<std::string, std::unique_ptr<ProxyRequestData>>
     56       CallbacksMap;
     57 
     58   // Called when the signal in UpdateEngineLibcrosProxyResolvedInterface is
     59   // connected.
     60   void OnSignalConnected(const std::string& interface_name,
     61                          const std::string& signal_name,
     62                          bool successful);
     63 
     64   // Handle a reply from Chrome:
     65   void OnProxyResolvedSignal(const std::string& source_url,
     66                              const std::string& proxy_info,
     67                              const std::string& error_message);
     68 
     69   // Handle no reply. The |request| pointer points to the ProxyRequestData in
     70   // the |callbacks_| map that triggered this timeout.
     71   void HandleTimeout(std::string source_url, ProxyRequestData* request);
     72 
     73   // Parses a string-encoded list of proxies and returns a deque
     74   // of individual proxies. The last one will always be kNoProxy.
     75   static std::deque<std::string> ParseProxyString(const std::string& input);
     76 
     77   // Process a proxy response by calling all the callbacks associated with the
     78   // passed |source_url|. All the timeouts associated with these callbacks will
     79   // be removed.
     80   void ProcessUrlResponse(const std::string& source_url,
     81                           const std::deque<std::string>& proxies);
     82 
     83   // Shutdown the dbus proxy object.
     84   void Shutdown();
     85 
     86   // DBus proxies to request a HTTP proxy resolution. The request is done in the
     87   // service_interface_proxy() interface and the response is received as a
     88   // signal in the ue_proxy_resolved_interface().
     89   LibCrosProxy* libcros_proxy_;
     90 
     91   int timeout_;
     92   CallbacksMap callbacks_;
     93   DISALLOW_COPY_AND_ASSIGN(ChromeBrowserProxyResolver);
     94 };
     95 
     96 }  // namespace chromeos_update_engine
     97 
     98 #endif  // UPDATE_ENGINE_CHROME_BROWSER_PROXY_RESOLVER_H_
     99