Index: net/http/disk_cache_based_quic_server_info.h |
diff --git a/net/http/disk_cache_based_quic_server_info.h b/net/http/disk_cache_based_quic_server_info.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..2396f8c5b343c943cd06d88da9a54f4002db6274 |
--- /dev/null |
+++ b/net/http/disk_cache_based_quic_server_info.h |
@@ -0,0 +1,135 @@ |
+// Copyright 2014 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_HTTP_DISK_CACHE_BASED_QUIC_SERVER_INFO_H_ |
+#define NET_HTTP_DISK_CACHE_BASED_QUIC_SERVER_INFO_H_ |
+ |
+#include <string> |
+ |
+#include "base/macros.h" |
+#include "base/memory/ref_counted.h" |
+#include "base/memory/weak_ptr.h" |
+#include "base/threading/non_thread_safe.h" |
+#include "base/time/time.h" |
+#include "net/base/completion_callback.h" |
+#include "net/base/net_export.h" |
+#include "net/disk_cache/disk_cache.h" |
+#include "net/quic/chromium/quic_server_info.h" |
+ |
+namespace net { |
+ |
+class HttpCache; |
+class IOBufferWithSize; |
+class QuicServerId; |
+ |
+// DiskCacheBasedQuicServerInfo fetches information about a QUIC server from |
+// our standard disk cache. Since the information is defined to be |
+// non-sensitive, it's ok for us to keep it on disk. |
+class NET_EXPORT_PRIVATE DiskCacheBasedQuicServerInfo |
+ : public QuicServerInfo, |
+ public NON_EXPORTED_BASE(base::NonThreadSafe) { |
+ public: |
+ DiskCacheBasedQuicServerInfo(const QuicServerId& server_id, |
+ HttpCache* http_cache); |
+ ~DiskCacheBasedQuicServerInfo() override; |
+ |
+ // QuicServerInfo implementation. |
+ void Start() override; |
+ int WaitForDataReady(const CompletionCallback& callback) override; |
+ void ResetWaitForDataReadyCallback() override; |
+ void CancelWaitForDataReadyCallback() override; |
+ bool IsDataReady() override; |
+ bool IsReadyToPersist() override; |
+ void Persist() override; |
+ void OnExternalCacheHit() override; |
+ size_t EstimateMemoryUsage() const override; |
+ |
+ private: |
+ struct CacheOperationDataShim; |
+ |
+ enum State { |
+ GET_BACKEND, |
+ GET_BACKEND_COMPLETE, |
+ OPEN, |
+ OPEN_COMPLETE, |
+ READ, |
+ READ_COMPLETE, |
+ WAIT_FOR_DATA_READY_DONE, |
+ CREATE_OR_OPEN, |
+ CREATE_OR_OPEN_COMPLETE, |
+ WRITE, |
+ WRITE_COMPLETE, |
+ SET_DONE, |
+ NONE, |
+ }; |
+ |
+ // Persists |pending_write_data_| if it is not empty, otherwise serializes the |
+ // data and pesists it. |
+ void PersistInternal(); |
+ |
+ std::string key() const; |
+ |
+ // The |unused| parameter is a small hack so that we can have the |
+ // CacheOperationDataShim object owned by the Callback that is created for |
+ // this method. See comment above CacheOperationDataShim for details. |
+ void OnIOComplete(CacheOperationDataShim* unused, int rv); |
+ |
+ int DoLoop(int rv); |
+ |
+ int DoGetBackendComplete(int rv); |
+ int DoOpenComplete(int rv); |
+ int DoReadComplete(int rv); |
+ int DoWriteComplete(int rv); |
+ int DoCreateOrOpenComplete(int rv); |
+ |
+ int DoGetBackend(); |
+ int DoOpen(); |
+ int DoRead(); |
+ int DoWrite(); |
+ int DoCreateOrOpen(); |
+ |
+ // DoWaitForDataReadyDone is the terminal state of the read operation. |
+ int DoWaitForDataReadyDone(); |
+ |
+ // DoSetDone is the terminal state of the write operation. |
+ int DoSetDone(); |
+ |
+ // Tracks in a histogram the number of times data read/parse/write API calls |
+ // of QuicServerInfo to and from disk cache is called. |
+ void RecordQuicServerInfoStatus(QuicServerInfoAPICall call); |
+ |
+ // Tracks in a histogram the failure reasons to read/load/write of |
+ // QuicServerInfo to and from disk cache. It also saves the |failure| in |
+ // |last_failure_|. |
+ void RecordQuicServerInfoFailure(FailureReason failure); |
+ |
+ // Tracks in a histogram if |last_failure_| is not NO_FAILURE. |
+ void RecordLastFailure(); |
+ |
+ CacheOperationDataShim* data_shim_; // Owned by |io_callback_|. |
+ CompletionCallback io_callback_; |
+ State state_; |
+ bool ready_; |
+ bool found_entry_; // Controls the behavior of DoCreateOrOpen. |
+ std::string new_data_; |
+ std::string pending_write_data_; |
+ const QuicServerId server_id_; |
+ HttpCache* const http_cache_; |
+ disk_cache::Backend* backend_; |
+ disk_cache::Entry* entry_; |
+ CompletionCallback wait_for_ready_callback_; |
+ scoped_refptr<IOBufferWithSize> read_buffer_; |
+ scoped_refptr<IOBufferWithSize> write_buffer_; |
+ std::string data_; |
+ base::TimeTicks load_start_time_; |
+ FailureReason last_failure_; |
+ |
+ base::WeakPtrFactory<DiskCacheBasedQuicServerInfo> weak_factory_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(DiskCacheBasedQuicServerInfo); |
+}; |
+ |
+} // namespace net |
+ |
+#endif // NET_HTTP_DISK_CACHE_BASED_QUIC_SERVER_INFO_H_ |