|  | // Copyright (c) 2012 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_SIMPLE_SERVER_STREAM_H_ | 
|  | #define QUICHE_QUIC_TOOLS_QUIC_SIMPLE_SERVER_STREAM_H_ | 
|  |  | 
|  | #include "absl/strings/string_view.h" | 
|  | #include "quic/core/http/quic_spdy_server_stream_base.h" | 
|  | #include "quic/core/quic_packets.h" | 
|  | #include "quic/tools/quic_backend_response.h" | 
|  | #include "quic/tools/quic_simple_server_backend.h" | 
|  | #include "spdy/core/spdy_framer.h" | 
|  |  | 
|  | namespace quic { | 
|  |  | 
|  | // All this does right now is aggregate data, and on fin, send an HTTP | 
|  | // response. | 
|  | class QuicSimpleServerStream : public QuicSpdyServerStreamBase, | 
|  | public QuicSimpleServerBackend::RequestHandler { | 
|  | public: | 
|  | QuicSimpleServerStream(QuicStreamId id, | 
|  | QuicSpdySession* session, | 
|  | StreamType type, | 
|  | QuicSimpleServerBackend* quic_simple_server_backend); | 
|  | QuicSimpleServerStream(PendingStream* pending, | 
|  | QuicSpdySession* session, | 
|  | QuicSimpleServerBackend* quic_simple_server_backend); | 
|  | QuicSimpleServerStream(const QuicSimpleServerStream&) = delete; | 
|  | QuicSimpleServerStream& operator=(const QuicSimpleServerStream&) = delete; | 
|  | ~QuicSimpleServerStream() override; | 
|  |  | 
|  | // QuicSpdyStream | 
|  | void OnInitialHeadersComplete(bool fin, | 
|  | size_t frame_len, | 
|  | const QuicHeaderList& header_list) override; | 
|  | void OnTrailingHeadersComplete(bool fin, | 
|  | size_t frame_len, | 
|  | const QuicHeaderList& header_list) override; | 
|  | void OnCanWrite() override; | 
|  |  | 
|  | // QuicStream implementation called by the sequencer when there is | 
|  | // data (or a FIN) to be read. | 
|  | void OnBodyAvailable() override; | 
|  |  | 
|  | void OnInvalidHeaders() override; | 
|  |  | 
|  | // Make this stream start from as if it just finished parsing an incoming | 
|  | // request whose headers are equivalent to |push_request_headers|. | 
|  | // Doing so will trigger this toy stream to fetch response and send it back. | 
|  | virtual void PushResponse(spdy::Http2HeaderBlock push_request_headers); | 
|  |  | 
|  | // The response body of error responses. | 
|  | static const char* const kErrorResponseBody; | 
|  | static const char* const kNotFoundResponseBody; | 
|  |  | 
|  | // Implements QuicSimpleServerBackend::RequestHandler callbacks | 
|  | QuicConnectionId connection_id() const override; | 
|  | QuicStreamId stream_id() const override; | 
|  | std::string peer_host() const override; | 
|  | void OnResponseBackendComplete(const QuicBackendResponse* response) override; | 
|  |  | 
|  | protected: | 
|  | // Sends a basic 200 response using SendHeaders for the headers and WriteData | 
|  | // for the body. | 
|  | virtual void SendResponse(); | 
|  |  | 
|  | // Sends a basic 500 response using SendHeaders for the headers and WriteData | 
|  | // for the body. | 
|  | virtual void SendErrorResponse(); | 
|  | virtual void SendErrorResponse(int resp_code); | 
|  |  | 
|  | // Sends a basic 404 response using SendHeaders for the headers and WriteData | 
|  | // for the body. | 
|  | void SendNotFoundResponse(); | 
|  |  | 
|  | // Sends the response header and body, but not the fin. | 
|  | void SendIncompleteResponse(spdy::Http2HeaderBlock response_headers, | 
|  | absl::string_view body); | 
|  |  | 
|  | void SendHeadersAndBody(spdy::Http2HeaderBlock response_headers, | 
|  | absl::string_view body); | 
|  | void SendHeadersAndBodyAndTrailers(spdy::Http2HeaderBlock response_headers, | 
|  | absl::string_view body, | 
|  | spdy::Http2HeaderBlock response_trailers); | 
|  |  | 
|  | spdy::Http2HeaderBlock* request_headers() { return &request_headers_; } | 
|  |  | 
|  | const std::string& body() { return body_; } | 
|  |  | 
|  | // Writes the body bytes for the GENERATE_BYTES response type. | 
|  | void WriteGeneratedBytes(); | 
|  |  | 
|  | // The parsed headers received from the client. | 
|  | spdy::Http2HeaderBlock request_headers_; | 
|  | int64_t content_length_; | 
|  | std::string body_; | 
|  |  | 
|  | private: | 
|  | uint64_t generate_bytes_length_; | 
|  | // Whether response headers have already been sent. | 
|  | bool response_sent_ = false; | 
|  |  | 
|  | QuicSimpleServerBackend* quic_simple_server_backend_;  // Not owned. | 
|  | }; | 
|  |  | 
|  | }  // namespace quic | 
|  |  | 
|  | #endif  // QUICHE_QUIC_TOOLS_QUIC_SIMPLE_SERVER_STREAM_H_ |