| // Copyright 2019 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 QUICHE_QUIC_MASQUE_MASQUE_SERVER_BACKEND_H_ | 
 | #define QUICHE_QUIC_MASQUE_MASQUE_SERVER_BACKEND_H_ | 
 |  | 
 | #include "absl/container/flat_hash_map.h" | 
 | #include "quic/masque/masque_utils.h" | 
 | #include "quic/platform/api/quic_export.h" | 
 | #include "quic/tools/quic_memory_cache_backend.h" | 
 |  | 
 | namespace quic { | 
 |  | 
 | // QUIC server backend that understands MASQUE requests, but otherwise answers | 
 | // HTTP queries using an in-memory cache. | 
 | class QUIC_NO_EXPORT MasqueServerBackend : public QuicMemoryCacheBackend { | 
 |  public: | 
 |   // Interface meant to be implemented by the owner of the MasqueServerBackend | 
 |   // instance. | 
 |   class QUIC_NO_EXPORT BackendClient { | 
 |    public: | 
 |     virtual std::unique_ptr<QuicBackendResponse> HandleMasqueRequest( | 
 |         const std::string& masque_path, | 
 |         const spdy::Http2HeaderBlock& request_headers, | 
 |         const std::string& request_body, | 
 |         QuicSimpleServerBackend::RequestHandler* request_handler) = 0; | 
 |     virtual ~BackendClient() = default; | 
 |   }; | 
 |  | 
 |   explicit MasqueServerBackend(MasqueMode masque_mode, | 
 |                                const std::string& server_authority, | 
 |                                const std::string& cache_directory); | 
 |  | 
 |   // Disallow copy and assign. | 
 |   MasqueServerBackend(const MasqueServerBackend&) = delete; | 
 |   MasqueServerBackend& operator=(const MasqueServerBackend&) = delete; | 
 |  | 
 |   // From QuicMemoryCacheBackend. | 
 |   void FetchResponseFromBackend( | 
 |       const spdy::Http2HeaderBlock& request_headers, | 
 |       const std::string& request_body, | 
 |       QuicSimpleServerBackend::RequestHandler* request_handler) override; | 
 |  | 
 |   void CloseBackendResponseStream( | 
 |       QuicSimpleServerBackend::RequestHandler* request_handler) override; | 
 |  | 
 |   // Register backend client that can handle MASQUE requests. | 
 |   void RegisterBackendClient(QuicConnectionId connection_id, | 
 |                              BackendClient* backend_client); | 
 |  | 
 |   // Unregister backend client. | 
 |   void RemoveBackendClient(QuicConnectionId connection_id); | 
 |  | 
 |  private: | 
 |   // Handle MASQUE request. | 
 |   bool MaybeHandleMasqueRequest( | 
 |       const spdy::Http2HeaderBlock& request_headers, | 
 |       const std::string& request_body, | 
 |       QuicSimpleServerBackend::RequestHandler* request_handler); | 
 |  | 
 |   MasqueMode masque_mode_; | 
 |   std::string server_authority_; | 
 |  | 
 |   struct QUIC_NO_EXPORT BackendClientState { | 
 |     BackendClient* backend_client; | 
 |     std::vector<std::unique_ptr<QuicBackendResponse>> responses; | 
 |   }; | 
 |   absl:: | 
 |       flat_hash_map<QuicConnectionId, BackendClientState, QuicConnectionIdHash> | 
 |           backend_client_states_; | 
 | }; | 
 |  | 
 | }  // namespace quic | 
 |  | 
 | #endif  // QUICHE_QUIC_MASQUE_MASQUE_SERVER_BACKEND_H_ |