blob: e7ca5d46c9c10229b62950e60f046258d932fc04 [file]
// Copyright 2023 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.
// Helper functions for webtransport::Stream API.
#ifndef QUICHE_COMMON_QUICHE_STREAM_H_
#define QUICHE_COMMON_QUICHE_STREAM_H_
#include "absl/status/status.h"
#include "absl/strings/string_view.h"
#include "absl/types/span.h"
#include "quiche/common/quiche_callbacks.h"
#include "quiche/common/quiche_mem_slice.h"
#include "quiche/web_transport/web_transport.h"
namespace webtransport {
// Calls `callback` for every contiguous chunk available inside the stream.
// Returns true if the FIN has been reached.
inline bool ProcessAllReadableRegions(
Stream& stream,
quiche::UnretainedCallback<void(absl::string_view)> callback) {
for (;;) {
Stream::PeekResult peek_result = stream.PeekNextReadableRegion();
if (!peek_result.has_data()) {
return false;
}
callback(peek_result.peeked_data);
bool fin = stream.SkipBytes(peek_result.peeked_data.size());
if (fin) {
return true;
}
}
}
// Convenience methods to write a single chunk of data into the stream.
inline absl::Status WriteIntoStream(
Stream& stream, quiche::QuicheMemSlice slice,
const StreamWriteOptions& options = kDefaultStreamWriteOptions) {
return stream.Writev(absl::MakeSpan(&slice, 1), options);
}
inline absl::Status WriteIntoStream(
Stream& stream, absl::string_view data,
const StreamWriteOptions& options = kDefaultStreamWriteOptions) {
quiche::QuicheMemSlice slice = quiche::QuicheMemSlice::Copy(data);
return stream.Writev(absl::MakeSpan(&slice, 1), options);
}
// Convenience methods to send a FIN on the stream.
inline absl::Status SendFinOnStream(Stream& stream) {
StreamWriteOptions options;
options.set_send_fin(true);
return stream.Writev(absl::Span<quiche::QuicheMemSlice>(), options);
}
} // namespace webtransport
#endif // QUICHE_COMMON_QUICHE_STREAM_H_