// Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef NET_CERT_CERT_NET_FETCHER_H_ #define NET_CERT_CERT_NET_FETCHER_H_ #include #include #include #include "base/macros.h" #include "base/memory/ref_counted.h" #include "net/base/net_errors.h" #include "net/base/net_export.h" class GURL; namespace net { // CertNetFetcher is a synchronous interface for fetching AIA URLs and CRL // URLs. It is shared between a caller thread (which starts and waits for // fetches), and a network thread (which does the actual fetches). It can be // shutdown from the network thread to cancel outstanding requests. // // A Request object is returned when starting a fetch. The consumer can // use this as a handle for aborting the request (by freeing it), or reading // the result of the request (WaitForResult) class NET_EXPORT CertNetFetcher : public base::RefCountedThreadSafe { public: class Request { public: virtual ~Request() {} // WaitForResult() can be called at most once. // // It will block and wait for the (network) request to complete, and // then write the result into the provided out-parameters. virtual void WaitForResult(Error* error, std::vector* bytes) = 0; }; // This value can be used in place of timeout or max size limits. enum { DEFAULT = -1 }; CertNetFetcher() {} // Shuts down the CertNetFetcher and cancels outstanding network requests. It // is not guaranteed that any outstanding or subsequent // Request::WaitForResult() calls will be completed. Shutdown() must be called // from the network thread. It can be called more than once, but must be // called before the CertNetFetcher is destroyed. virtual void Shutdown() = 0; // The Fetch*() methods start a request which can be cancelled by // deleting the returned Request. Here is the meaning of the common // parameters: // // * url -- The http:// URL to fetch. // * timeout_seconds -- The maximum allowed duration for the fetch job. If // this delay is exceeded then the request will fail. To use a default // timeout pass DEFAULT. // * max_response_bytes -- The maximum size of the response body. If this // size is exceeded then the request will fail. To use a default timeout // pass DEFAULT. virtual WARN_UNUSED_RESULT std::unique_ptr FetchCaIssuers( const GURL& url, int timeout_milliseconds, int max_response_bytes) = 0; virtual WARN_UNUSED_RESULT std::unique_ptr FetchCrl( const GURL& url, int timeout_milliseconds, int max_response_bytes) = 0; virtual WARN_UNUSED_RESULT std::unique_ptr FetchOcsp( const GURL& url, int timeout_milliseconds, int max_response_bytes) = 0; protected: virtual ~CertNetFetcher() {} private: friend class base::RefCountedThreadSafe; DISALLOW_COPY_AND_ASSIGN(CertNetFetcher); }; // TODO(eroman): Remove the need for this global. (Right now the CertVerifyProc // implementation is created in a manner that requires this to be global). // Sets/retrieves a global CertNetFetcher to be used for AIA fetches, OCSP, and // CRL by CertVerifyProc implementations. NET_EXPORT void SetGlobalCertNetFetcher( scoped_refptr cert_net_fetcher); NET_EXPORT CertNetFetcher* GetGlobalCertNetFetcher(); // Like SetGlobalCertNetFetcher, but allows the global CertNetFetcher to be set // more than once. If one has already been set, shuts it down and then sets it // to |cert_net_fetcher|. NET_EXPORT void SetGlobalCertNetFetcherForTesting( scoped_refptr cert_net_fetcher); // Shuts down the global CertNetFetcher. In-progress fetches will be cancelled // and subsequent fetches cancelled immediately. Assumes that // SetGlobalCertNetFetcher() has been called previously. NET_EXPORT void ShutdownGlobalCertNetFetcher(); } // namespace net #endif // NET_CERT_CERT_NET_FETCHER_H_