| // 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 "net/third_party/quiche/src/quic/tools/quic_url.h" | 
 | #include "net/third_party/quiche/src/common/platform/api/quiche_string_piece.h" | 
 | #include "net/third_party/quiche/src/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. | 
 |   struct ServerPushInfo { | 
 |     ServerPushInfo(QuicUrl request_url, | 
 |                    spdy::SpdyHeaderBlock headers, | 
 |                    spdy::SpdyPriority priority, | 
 |                    std::string body); | 
 |     ServerPushInfo(const ServerPushInfo& other); | 
 |  | 
 |     QuicUrl request_url; | 
 |     spdy::SpdyHeaderBlock 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. | 
 |     STOP_SENDING,          // Acts like INCOMPLETE_RESPONSE in that the entire | 
 |                            // response is not sent. After sending what is sent, | 
 |                            // the server will send a STOP_SENDING. | 
 |     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(); | 
 |  | 
 |   SpecialResponseType response_type() const { return response_type_; } | 
 |   const spdy::SpdyHeaderBlock& headers() const { return headers_; } | 
 |   const spdy::SpdyHeaderBlock& trailers() const { return trailers_; } | 
 |   const quiche::QuicheStringPiece body() const { | 
 |     return quiche::QuicheStringPiece(body_); | 
 |   } | 
 |  | 
 |   void set_response_type(SpecialResponseType response_type) { | 
 |     response_type_ = response_type; | 
 |   } | 
 |  | 
 |   void set_headers(spdy::SpdyHeaderBlock headers) { | 
 |     headers_ = std::move(headers); | 
 |   } | 
 |   void set_trailers(spdy::SpdyHeaderBlock trailers) { | 
 |     trailers_ = std::move(trailers); | 
 |   } | 
 |   void set_body(quiche::QuicheStringPiece body) { | 
 |     body_.assign(body.data(), body.size()); | 
 |   } | 
 |   uint16_t stop_sending_code() const { return stop_sending_code_; } | 
 |   void set_stop_sending_code(uint16_t code) { stop_sending_code_ = code; } | 
 |  | 
 |  private: | 
 |   SpecialResponseType response_type_; | 
 |   spdy::SpdyHeaderBlock headers_; | 
 |   spdy::SpdyHeaderBlock trailers_; | 
 |   std::string body_; | 
 |   uint16_t stop_sending_code_; | 
 | }; | 
 |  | 
 | }  // namespace quic | 
 |  | 
 | #endif  // QUICHE_QUIC_TOOLS_QUIC_BACKEND_RESPONSE_H_ |