1 // Copyright 2021 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef QUICHE_QUIC_CORE_HTTP_WEB_TRANSPORT_STREAM_ADAPTER_H_ 6 #define QUICHE_QUIC_CORE_HTTP_WEB_TRANSPORT_STREAM_ADAPTER_H_ 7 8 #include <cstddef> 9 #include <memory> 10 #include <string> 11 #include <utility> 12 13 #include "absl/base/attributes.h" 14 #include "absl/status/status.h" 15 #include "absl/strings/string_view.h" 16 #include "absl/types/span.h" 17 #include "quiche/quic/core/quic_error_codes.h" 18 #include "quiche/quic/core/quic_session.h" 19 #include "quiche/quic/core/quic_stream.h" 20 #include "quiche/quic/core/quic_stream_sequencer.h" 21 #include "quiche/quic/core/quic_types.h" 22 #include "quiche/quic/core/web_transport_interface.h" 23 #include "quiche/common/platform/api/quiche_export.h" 24 #include "quiche/common/quiche_stream.h" 25 #include "quiche/web_transport/web_transport.h" 26 27 namespace quic { 28 29 // Converts WebTransportStream API calls into QuicStream API calls. The users 30 // of this class can either subclass it, or wrap around it. 31 class QUICHE_EXPORT WebTransportStreamAdapter : public webtransport::Stream { 32 public: 33 WebTransportStreamAdapter(QuicSession* session, QuicStream* stream, 34 QuicStreamSequencer* sequencer); 35 36 // WebTransportStream implementation. 37 ABSL_MUST_USE_RESULT ReadResult Read(absl::Span<char> output) override; 38 ABSL_MUST_USE_RESULT ReadResult Read(std::string* output) override; 39 absl::Status Writev(absl::Span<const absl::string_view> data, 40 const quiche::StreamWriteOptions& options) override; 41 bool CanWrite() const override; 42 void AbruptlyTerminate(absl::Status error) override; 43 size_t ReadableBytes() const override; 44 PeekResult PeekNextReadableRegion() const override; 45 bool SkipBytes(size_t bytes) override; SetVisitor(std::unique_ptr<WebTransportStreamVisitor> visitor)46 void SetVisitor(std::unique_ptr<WebTransportStreamVisitor> visitor) override { 47 visitor_ = std::move(visitor); 48 } GetStreamId()49 QuicStreamId GetStreamId() const override { return stream_->id(); } 50 51 void ResetWithUserCode(WebTransportStreamError error) override; ResetDueToInternalError()52 void ResetDueToInternalError() override { 53 stream_->Reset(QUIC_STREAM_INTERNAL_ERROR); 54 } 55 void SendStopSending(WebTransportStreamError error) override; MaybeResetDueToStreamObjectGone()56 void MaybeResetDueToStreamObjectGone() override { 57 if (stream_->write_side_closed() && stream_->read_side_closed()) { 58 return; 59 } 60 stream_->Reset(QUIC_STREAM_CANCELLED); 61 } 62 visitor()63 WebTransportStreamVisitor* visitor() override { return visitor_.get(); } 64 65 // Calls that need to be passed from the corresponding QuicStream methods. 66 void OnDataAvailable(); 67 void OnCanWriteNewData(); 68 69 private: 70 absl::Status CheckBeforeStreamWrite() const; 71 72 QuicSession* session_; // Unowned. 73 QuicStream* stream_; // Unowned. 74 QuicStreamSequencer* sequencer_; // Unowned. 75 std::unique_ptr<WebTransportStreamVisitor> visitor_; 76 bool fin_read_ = false; 77 }; 78 79 } // namespace quic 80 81 #endif // QUICHE_QUIC_CORE_HTTP_WEB_TRANSPORT_STREAM_ADAPTER_H_ 82