// 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, StreamType type, 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; // 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, std::list resources) 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(); 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_