1*6777b538SAndroid Build Coastguard Worker // Copyright 2015 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef NET_CERT_CERT_NET_FETCHER_H_ 6*6777b538SAndroid Build Coastguard Worker #define NET_CERT_CERT_NET_FETCHER_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <stdint.h> 9*6777b538SAndroid Build Coastguard Worker 10*6777b538SAndroid Build Coastguard Worker #include <memory> 11*6777b538SAndroid Build Coastguard Worker #include <vector> 12*6777b538SAndroid Build Coastguard Worker 13*6777b538SAndroid Build Coastguard Worker #include "base/memory/ref_counted.h" 14*6777b538SAndroid Build Coastguard Worker #include "net/base/net_errors.h" 15*6777b538SAndroid Build Coastguard Worker #include "net/base/net_export.h" 16*6777b538SAndroid Build Coastguard Worker 17*6777b538SAndroid Build Coastguard Worker class GURL; 18*6777b538SAndroid Build Coastguard Worker 19*6777b538SAndroid Build Coastguard Worker namespace net { 20*6777b538SAndroid Build Coastguard Worker 21*6777b538SAndroid Build Coastguard Worker // CertNetFetcher is a synchronous interface for fetching AIA URLs and CRL 22*6777b538SAndroid Build Coastguard Worker // URLs. It is shared between a caller thread (which starts and waits for 23*6777b538SAndroid Build Coastguard Worker // fetches), and a network thread (which does the actual fetches). It can be 24*6777b538SAndroid Build Coastguard Worker // shutdown from the network thread to cancel outstanding requests. 25*6777b538SAndroid Build Coastguard Worker // 26*6777b538SAndroid Build Coastguard Worker // A Request object is returned when starting a fetch. The consumer can 27*6777b538SAndroid Build Coastguard Worker // use this as a handle for aborting the request (by freeing it), or reading 28*6777b538SAndroid Build Coastguard Worker // the result of the request (WaitForResult) 29*6777b538SAndroid Build Coastguard Worker class NET_EXPORT CertNetFetcher 30*6777b538SAndroid Build Coastguard Worker : public base::RefCountedThreadSafe<CertNetFetcher> { 31*6777b538SAndroid Build Coastguard Worker public: 32*6777b538SAndroid Build Coastguard Worker class Request { 33*6777b538SAndroid Build Coastguard Worker public: 34*6777b538SAndroid Build Coastguard Worker virtual ~Request() = default; 35*6777b538SAndroid Build Coastguard Worker 36*6777b538SAndroid Build Coastguard Worker // WaitForResult() can be called at most once. 37*6777b538SAndroid Build Coastguard Worker // 38*6777b538SAndroid Build Coastguard Worker // It will block and wait for the (network) request to complete, and 39*6777b538SAndroid Build Coastguard Worker // then write the result into the provided out-parameters. 40*6777b538SAndroid Build Coastguard Worker virtual void WaitForResult(Error* error, std::vector<uint8_t>* bytes) = 0; 41*6777b538SAndroid Build Coastguard Worker }; 42*6777b538SAndroid Build Coastguard Worker 43*6777b538SAndroid Build Coastguard Worker // This value can be used in place of timeout or max size limits. 44*6777b538SAndroid Build Coastguard Worker enum { DEFAULT = -1 }; 45*6777b538SAndroid Build Coastguard Worker 46*6777b538SAndroid Build Coastguard Worker CertNetFetcher() = default; 47*6777b538SAndroid Build Coastguard Worker 48*6777b538SAndroid Build Coastguard Worker CertNetFetcher(const CertNetFetcher&) = delete; 49*6777b538SAndroid Build Coastguard Worker CertNetFetcher& operator=(const CertNetFetcher&) = delete; 50*6777b538SAndroid Build Coastguard Worker 51*6777b538SAndroid Build Coastguard Worker // Shuts down the CertNetFetcher and cancels outstanding network requests. It 52*6777b538SAndroid Build Coastguard Worker // is not guaranteed that any outstanding or subsequent 53*6777b538SAndroid Build Coastguard Worker // Request::WaitForResult() calls will be completed. Shutdown() must be called 54*6777b538SAndroid Build Coastguard Worker // from the network thread. It can be called more than once, but must be 55*6777b538SAndroid Build Coastguard Worker // called before the CertNetFetcher is destroyed. 56*6777b538SAndroid Build Coastguard Worker virtual void Shutdown() = 0; 57*6777b538SAndroid Build Coastguard Worker 58*6777b538SAndroid Build Coastguard Worker // The Fetch*() methods start a request which can be cancelled by 59*6777b538SAndroid Build Coastguard Worker // deleting the returned Request. Here is the meaning of the common 60*6777b538SAndroid Build Coastguard Worker // parameters: 61*6777b538SAndroid Build Coastguard Worker // 62*6777b538SAndroid Build Coastguard Worker // * url -- The http:// URL to fetch. 63*6777b538SAndroid Build Coastguard Worker // * timeout_seconds -- The maximum allowed duration for the fetch job. If 64*6777b538SAndroid Build Coastguard Worker // this delay is exceeded then the request will fail. To use a default 65*6777b538SAndroid Build Coastguard Worker // timeout pass DEFAULT. 66*6777b538SAndroid Build Coastguard Worker // * max_response_bytes -- The maximum size of the response body. If this 67*6777b538SAndroid Build Coastguard Worker // size is exceeded then the request will fail. To use a default timeout 68*6777b538SAndroid Build Coastguard Worker // pass DEFAULT. 69*6777b538SAndroid Build Coastguard Worker 70*6777b538SAndroid Build Coastguard Worker [[nodiscard]] virtual std::unique_ptr<Request> FetchCaIssuers( 71*6777b538SAndroid Build Coastguard Worker const GURL& url, 72*6777b538SAndroid Build Coastguard Worker int timeout_milliseconds, 73*6777b538SAndroid Build Coastguard Worker int max_response_bytes) = 0; 74*6777b538SAndroid Build Coastguard Worker 75*6777b538SAndroid Build Coastguard Worker [[nodiscard]] virtual std::unique_ptr<Request> FetchCrl( 76*6777b538SAndroid Build Coastguard Worker const GURL& url, 77*6777b538SAndroid Build Coastguard Worker int timeout_milliseconds, 78*6777b538SAndroid Build Coastguard Worker int max_response_bytes) = 0; 79*6777b538SAndroid Build Coastguard Worker 80*6777b538SAndroid Build Coastguard Worker [[nodiscard]] virtual std::unique_ptr<Request> FetchOcsp( 81*6777b538SAndroid Build Coastguard Worker const GURL& url, 82*6777b538SAndroid Build Coastguard Worker int timeout_milliseconds, 83*6777b538SAndroid Build Coastguard Worker int max_response_bytes) = 0; 84*6777b538SAndroid Build Coastguard Worker 85*6777b538SAndroid Build Coastguard Worker protected: 86*6777b538SAndroid Build Coastguard Worker virtual ~CertNetFetcher() = default; 87*6777b538SAndroid Build Coastguard Worker 88*6777b538SAndroid Build Coastguard Worker private: 89*6777b538SAndroid Build Coastguard Worker friend class base::RefCountedThreadSafe<CertNetFetcher>; 90*6777b538SAndroid Build Coastguard Worker }; 91*6777b538SAndroid Build Coastguard Worker 92*6777b538SAndroid Build Coastguard Worker } // namespace net 93*6777b538SAndroid Build Coastguard Worker 94*6777b538SAndroid Build Coastguard Worker #endif // NET_CERT_CERT_NET_FETCHER_H_ 95