|  | // Copyright 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 QUICHE_QUIC_TOOLS_QUIC_BACKEND_RESPONSE_H_ | 
|  | #define QUICHE_QUIC_TOOLS_QUIC_BACKEND_RESPONSE_H_ | 
|  |  | 
|  | #include "absl/strings/string_view.h" | 
|  | #include "quiche/quic/core/quic_time.h" | 
|  | #include "quiche/quic/tools/quic_url.h" | 
|  | #include "quiche/spdy/core/http2_header_block.h" | 
|  | #include "quiche/spdy/core/spdy_protocol.h" | 
|  |  | 
|  | namespace quic { | 
|  |  | 
|  | // Container for HTTP response header/body pairs | 
|  | // fetched by the QuicSimpleServerBackend | 
|  | class QuicBackendResponse { | 
|  | public: | 
|  | // A ServerPushInfo contains path of the push request and everything needed in | 
|  | // comprising a response for the push request. | 
|  | // TODO(b/171463363): Remove. | 
|  | struct ServerPushInfo { | 
|  | ServerPushInfo(QuicUrl request_url, spdy::Http2HeaderBlock headers, | 
|  | spdy::SpdyPriority priority, std::string body); | 
|  | ServerPushInfo(const ServerPushInfo& other); | 
|  |  | 
|  | QuicUrl request_url; | 
|  | spdy::Http2HeaderBlock headers; | 
|  | spdy::SpdyPriority priority; | 
|  | std::string body; | 
|  | }; | 
|  |  | 
|  | enum SpecialResponseType { | 
|  | REGULAR_RESPONSE,      // Send the headers and body like a server should. | 
|  | CLOSE_CONNECTION,      // Close the connection (sending the close packet). | 
|  | IGNORE_REQUEST,        // Do nothing, expect the client to time out. | 
|  | BACKEND_ERR_RESPONSE,  // There was an error fetching the response from | 
|  | // the backend, for example as a TCP connection | 
|  | // error. | 
|  | INCOMPLETE_RESPONSE,   // The server will act as if there is a non-empty | 
|  | // trailer but it will not be sent, as a result, FIN | 
|  | // will not be sent too. | 
|  | GENERATE_BYTES         // Sends a response with a length equal to the number | 
|  | // of bytes in the URL path. | 
|  | }; | 
|  | QuicBackendResponse(); | 
|  |  | 
|  | QuicBackendResponse(const QuicBackendResponse& other) = delete; | 
|  | QuicBackendResponse& operator=(const QuicBackendResponse& other) = delete; | 
|  |  | 
|  | ~QuicBackendResponse(); | 
|  |  | 
|  | const std::vector<spdy::Http2HeaderBlock>& early_hints() const { | 
|  | return early_hints_; | 
|  | } | 
|  | SpecialResponseType response_type() const { return response_type_; } | 
|  | const spdy::Http2HeaderBlock& headers() const { return headers_; } | 
|  | const spdy::Http2HeaderBlock& trailers() const { return trailers_; } | 
|  | const absl::string_view body() const { return absl::string_view(body_); } | 
|  |  | 
|  | void AddEarlyHints(const spdy::Http2HeaderBlock& headers) { | 
|  | spdy::Http2HeaderBlock hints = headers.Clone(); | 
|  | hints[":status"] = "103"; | 
|  | early_hints_.push_back(std::move(hints)); | 
|  | } | 
|  |  | 
|  | void set_response_type(SpecialResponseType response_type) { | 
|  | response_type_ = response_type; | 
|  | } | 
|  |  | 
|  | void set_headers(spdy::Http2HeaderBlock headers) { | 
|  | headers_ = std::move(headers); | 
|  | } | 
|  | void set_trailers(spdy::Http2HeaderBlock trailers) { | 
|  | trailers_ = std::move(trailers); | 
|  | } | 
|  | void set_body(absl::string_view body) { | 
|  | body_.assign(body.data(), body.size()); | 
|  | } | 
|  |  | 
|  | // This would simulate a delay before sending the response | 
|  | // back to the client. Intended for testing purposes. | 
|  | void set_delay(QuicTime::Delta delay) { delay_ = delay; } | 
|  | QuicTime::Delta delay() const { return delay_; } | 
|  |  | 
|  | private: | 
|  | std::vector<spdy::Http2HeaderBlock> early_hints_; | 
|  | SpecialResponseType response_type_; | 
|  | spdy::Http2HeaderBlock headers_; | 
|  | spdy::Http2HeaderBlock trailers_; | 
|  | std::string body_; | 
|  | QuicTime::Delta delay_; | 
|  | }; | 
|  |  | 
|  | }  // namespace quic | 
|  |  | 
|  | #endif  // QUICHE_QUIC_TOOLS_QUIC_BACKEND_RESPONSE_H_ |