blob: 724f4f8791ed3c79178bcac185fd79d44dc9365f [file] [log] [blame] [edit]
// Copyright 2024 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.
#include "quiche/web_transport/test_tools/in_memory_stream.h"
#include <cstddef>
#include <string>
#include <vector>
#include "absl/strings/cord.h"
#include "absl/strings/string_view.h"
#include "absl/types/span.h"
#include "quiche/common/platform/api/quiche_logging.h"
#include "quiche/common/quiche_stream.h"
#include "quiche/common/vectorized_io_utils.h"
namespace webtransport::test {
quiche::ReadStream::ReadResult InMemoryStream::Read(absl::Span<char> output) {
std::vector<absl::string_view> chunks;
for (absl::string_view chunk : buffer_.Chunks()) {
chunks.push_back(chunk);
}
size_t bytes_read = quiche::GatherStringViewSpan(chunks, output);
buffer_.RemovePrefix(bytes_read);
return ReadResult{bytes_read, buffer_.empty() && fin_received_};
}
quiche::ReadStream::ReadResult InMemoryStream::Read(std::string* output) {
ReadResult result;
result.bytes_read = buffer_.size();
result.fin = fin_received_;
absl::AppendCordToString(buffer_, output);
buffer_.Clear();
return result;
}
size_t InMemoryStream::ReadableBytes() const { return buffer_.size(); }
quiche::ReadStream::PeekResult InMemoryStream::PeekNextReadableRegion() const {
if (buffer_.empty()) {
return PeekResult{"", fin_received_, fin_received_};
}
absl::string_view next_chunk = *buffer_.Chunks().begin();
return PeekResult{next_chunk, false, fin_received_};
}
bool InMemoryStream::SkipBytes(size_t bytes) {
buffer_.RemovePrefix(bytes);
return buffer_.empty() && fin_received_;
}
void InMemoryStream::Receive(absl::string_view data, bool fin) {
QUICHE_DCHECK(!abruptly_terminated_);
buffer_.Append(data);
fin_received_ |= fin;
if (visitor_ != nullptr) {
visitor_->OnCanRead();
}
}
void InMemoryStream::Terminate() {
abruptly_terminated_ = true;
buffer_.Clear();
fin_received_ = false;
}
} // namespace webtransport::test