Home | History | Annotate | Download | only in safe_browsing
      1 // Copyright (c) 2012 The Chromium 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 #ifndef CHROME_BROWSER_SAFE_BROWSING_MALWARE_DETAILS_CACHE_H_
      6 #define CHROME_BROWSER_SAFE_BROWSING_MALWARE_DETAILS_CACHE_H_
      7 
      8 // A class that gets malware details from the HTTP Cache.
      9 // An instance of this class is generated by MalwareDetails.
     10 
     11 #include <string>
     12 #include <vector>
     13 
     14 #include "base/callback.h"
     15 #include "base/containers/hash_tables.h"
     16 #include "base/memory/linked_ptr.h"
     17 #include "base/memory/ref_counted.h"
     18 #include "chrome/browser/safe_browsing/report.pb.h"
     19 #include "net/base/completion_callback.h"
     20 #include "net/url_request/url_fetcher_delegate.h"
     21 
     22 namespace net {
     23 class URLFetcher;
     24 class URLRequestContext;
     25 }
     26 
     27 namespace safe_browsing {
     28 
     29 // Maps a URL to its Resource.
     30 typedef base::hash_map<
     31   std::string,
     32   linked_ptr<safe_browsing::ClientMalwareReportRequest::Resource> > ResourceMap;
     33 }
     34 
     35 class MalwareDetailsCacheCollector
     36     : public base::RefCountedThreadSafe<MalwareDetailsCacheCollector>,
     37       public net::URLFetcherDelegate {
     38 
     39  public:
     40   MalwareDetailsCacheCollector();
     41 
     42   // We use |request_context_getter|, we modify |resources| and
     43   // |result|, and we call |callback|, so they must all remain alive
     44   // for the lifetime of this object.
     45   void StartCacheCollection(
     46       net::URLRequestContextGetter* request_context_getter,
     47       safe_browsing::ResourceMap* resources,
     48       bool* result,
     49       const base::Closure& callback);
     50 
     51   // Returns whether or not StartCacheCollection has been called.
     52   bool HasStarted();
     53 
     54  protected:
     55   // Implementation of URLFetcher::Delegate. Called after the request
     56   // completes (either successfully or with failure).
     57   virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE;
     58 
     59  private:
     60   friend class base::RefCountedThreadSafe<MalwareDetailsCacheCollector>;
     61 
     62   virtual ~MalwareDetailsCacheCollector();
     63 
     64   // Points to the url for which we are fetching the HTTP cache entry or
     65   // redirect chain.
     66   safe_browsing::ResourceMap::iterator resources_it_;
     67 
     68   // Points to the resources_ map in the MalwareDetails.
     69   safe_browsing::ResourceMap* resources_;
     70 
     71   // Points to the cache_result_ in the MalwareDetails.
     72   bool* result_;
     73 
     74   // Method we call when we are done. The caller must be alive for the
     75   // whole time, we are modifying its state (see above).
     76   base::Closure callback_;
     77 
     78   // Set to true as soon as StartCacheCollection is called.
     79   bool has_started_;
     80 
     81   // Used to get a pointer to the current request context.
     82   scoped_refptr<net::URLRequestContextGetter> request_context_getter_;
     83 
     84   // The current URLFetcher.
     85   scoped_ptr<net::URLFetcher> current_fetch_;
     86 
     87   // Returns the resource from resources_ that corresponds to |url|
     88   safe_browsing::ClientMalwareReportRequest::Resource* GetResource(
     89       const GURL& url);
     90 
     91   // Creates a new URLFetcher and starts it.
     92   void OpenEntry();
     93 
     94   // Read the HTTP response from |source| and add it to |pb_resource|.
     95   void ReadResponse(
     96       safe_browsing::ClientMalwareReportRequest::Resource* pb_resource,
     97       const net::URLFetcher* source);
     98 
     99   // Read the body |data| and add it to |pb_resource|.
    100   void ReadData(
    101       safe_browsing::ClientMalwareReportRequest::Resource* pb_resource,
    102       const std::string& data);
    103 
    104   // Called when we are done.
    105   void AllDone(bool success);
    106 
    107   // Advances to the next entry in resources_it_.
    108   void AdvanceEntry();
    109 };
    110 
    111 #endif  // CHROME_BROWSER_SAFE_BROWSING_MALWARE_DETAILS_CACHE_H_
    112