Chromium Code Reviews| Index: net/http/http_broken_alternative_services_manager.h |
| diff --git a/net/http/http_broken_alternative_services_manager.h b/net/http/http_broken_alternative_services_manager.h |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..fedfbcc05d72858c26e0978b7680fade92517f35 |
| --- /dev/null |
| +++ b/net/http/http_broken_alternative_services_manager.h |
| @@ -0,0 +1,117 @@ |
| +// Copyright (c) 2017 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_HTTP_BROKEN_ALTERNATIVE_SERVICES_MANAGER_H_ |
| +#define NET_HTTP_HTTP_BROKEN_ALTERNATIVE_SERVICES_MANAGER_H_ |
| + |
| +#include <list> |
| +#include <unordered_map> |
| + |
| +#include "base/memory/weak_ptr.h" |
| +#include "base/timer/timer.h" |
| +#include "net/http/http_server_properties.h" |
| + |
| +namespace net { |
| + |
| +struct AlternativeServiceHash { |
| + size_t operator()(const net::AlternativeService& entry) const { |
| + return entry.protocol ^ std::hash<std::string>()(entry.host) ^ entry.port; |
| + } |
| +}; |
| + |
| +class NET_EXPORT HttpBrokenAlternativeServicesManager { |
|
Ryan Hamilton
2017/05/25 03:03:50
nit: This class name is a bit of a mouthful, how '
wangyix1
2017/05/26 01:14:24
Done.
|
| + public: |
| + // Interface for retrieving the current time as base::TimeTicks |
| + class NET_EXPORT Clock { |
| + public: |
| + virtual ~Clock() {} |
| + virtual base::TimeTicks Now() const = 0; |
| + }; |
| + |
| + class NET_EXPORT DefaultClock : public Clock { |
|
Ryan Hamilton
2017/05/25 03:03:50
nit: You could consider adding static method to cl
wangyix1
2017/05/26 01:14:24
Done.
|
| + public: |
| + static DefaultClock* GetInstance(); |
| + DefaultClock() {} |
| + ~DefaultClock() override {} |
| + base::TimeTicks Now() const override; |
| + |
| + private: |
| + DISALLOW_COPY_AND_ASSIGN(DefaultClock); |
| + }; |
| + |
| + // Delegate for owner to be notified when the brokenness of an |
| + // AlternativeService expires. |
| + class NET_EXPORT Delegate { |
| + public: |
| + virtual void OnExpireBrokenAlternativeService( |
| + const AlternativeService& expired_alternative_service) = 0; |
|
Ryan Hamilton
2017/05/25 03:03:50
Should we also have virtual ~Delegate() {}?
wangyix1
2017/05/26 01:14:24
Done.
|
| + }; |
| + |
| + HttpBrokenAlternativeServicesManager(Delegate* delegate, Clock* clock); |
|
Ryan Hamilton
2017/05/25 03:03:50
nit: Comment, please, and note the ownership/lifet
wangyix1
2017/05/26 01:14:24
Done.
|
| + |
| + ~HttpBrokenAlternativeServicesManager(); |
| + |
| + void MarkAlternativeServiceBroken( |
|
Ryan Hamilton
2017/05/25 03:03:50
nit: comments for all these methods, please.
wangyix1
2017/05/26 01:14:24
Done.
|
| + const AlternativeService& alternative_service); |
| + void MarkAlternativeServiceRecentlyBroken( |
| + const AlternativeService& alternative_service); |
| + bool IsAlternativeServiceBroken( |
| + const AlternativeService& alternative_service) const; |
| + bool WasAlternativeServiceRecentlyBroken( |
| + const AlternativeService& alternative_service); |
| + void ConfirmAlternativeService(const AlternativeService& alternative_service); |
| + |
| + static base::TimeDelta ComputeBrokenAltSvcExpirationDelayForTest( |
| + int broken_count); |
|
Ryan Hamilton
2017/05/25 03:03:50
Can we just put this in a test.cc file instead?
wangyix1
2017/05/26 01:14:24
Done.
|
| + |
| + private: |
| + friend class HttpServerPropertiesImplPeer; |
|
Ryan Hamilton
2017/05/25 03:03:50
We should see if we can get rid of this friend-nes
wangyix1
2017/05/26 01:14:24
Done.
|
| + |
| + struct BrokenAltSvcExpireInfo { |
|
Ryan Hamilton
2017/05/25 03:03:50
nit: comment.
wangyix1
2017/05/26 01:14:24
Done.
|
| + BrokenAltSvcExpireInfo(const AlternativeService& alt_svc, |
| + base::TimeTicks expire) |
| + : alternative_service(alt_svc), expiration(expire) {} |
| + AlternativeService alternative_service; |
|
Ryan Hamilton
2017/05/25 03:03:50
nit: newline before
wangyix1
2017/05/26 01:14:24
Done.
|
| + base::TimeTicks expiration; |
| + }; |
| + |
| + typedef std::list<BrokenAltSvcExpireInfo> BrokenAlternativeServiceList; |
| + |
| + typedef std::unordered_map<AlternativeService, |
| + BrokenAlternativeServiceList::iterator, |
| + AlternativeServiceHash> |
| + BrokenAlternativeServiceMap; |
| + |
| + // Inserts |alternative_service| and its |expiration| time into |
| + // |broken_alternative_service_list_| and |broken_alternative_service_map_|. |
| + // |it| is the position in |broken_alternative_service_list_| where it was |
| + // inserted. |
| + bool AddToBrokenAlternativeServiceListAndMap( |
| + const AlternativeService& alternative_service, |
| + base::TimeTicks expiration, |
| + BrokenAlternativeServiceList::iterator* it); |
| + |
| + void ExpireBrokenAlternateProtocolMappings(); |
| + void ScheduleBrokenAlternateProtocolMappingsExpiration(); |
| + |
| + Delegate* delegate_; |
|
Ryan Hamilton
2017/05/25 03:03:50
nit: // Unowned.
wangyix1
2017/05/26 01:14:24
Done.
|
| + |
| + BrokenAlternativeServiceMap broken_alternative_service_map_; |
| + BrokenAlternativeServiceList broken_alternative_service_list_; |
| + RecentlyBrokenAlternativeServices recently_broken_alternative_services_; |
| + |
| + Clock* clock_; // Unowned |
| + |
| + // Used for scheduling the task that expires the brokenness of alternative |
| + // services. |
| + base::OneShotTimer timer_; |
|
Ryan Hamilton
2017/05/25 03:03:50
nit: how 'bout expiration_timer_?
wangyix1
2017/05/26 01:14:24
Done.
|
| + |
| + base::WeakPtrFactory<HttpBrokenAlternativeServicesManager> weak_ptr_factory_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(HttpBrokenAlternativeServicesManager); |
|
Ryan Hamilton
2017/05/25 03:03:50
nit: I think the new hotness is using = delete for
wangyix1
2017/05/26 01:14:24
Done.
|
| +}; |
| + |
| +} // namespace net |
| + |
| +#endif // NET_HTTP_HTTP_BROKEN_ALTERNATIVE_SERVICES_MANAGER_H_ |