1 // Copyright 2022 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "net/websockets/websocket_quic_spdy_stream.h"
6
7 #include <sys/types.h> // for struct iovec
8
9 #include "base/check.h"
10 #include "base/check_op.h"
11 #include "net/base/io_buffer.h"
12 #include "net/base/net_errors.h"
13 #include "net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_session_base.h"
14
15 namespace quic {
16 class QuicHeaderList;
17 } // namespace quic
18
19 namespace net {
20
WebSocketQuicSpdyStream(quic::QuicStreamId id,quic::QuicSpdyClientSessionBase * session,quic::StreamType type)21 WebSocketQuicSpdyStream::WebSocketQuicSpdyStream(
22 quic::QuicStreamId id,
23 quic::QuicSpdyClientSessionBase* session,
24 quic::StreamType type)
25 : quic::QuicSpdyStream(id, session, type) {}
26
~WebSocketQuicSpdyStream()27 WebSocketQuicSpdyStream::~WebSocketQuicSpdyStream() {
28 if (delegate_) {
29 delegate_->ClearStream();
30 }
31 }
32
OnBodyAvailable()33 void WebSocketQuicSpdyStream::OnBodyAvailable() {
34 if (delegate_) {
35 delegate_->OnBodyAvailable();
36 }
37 }
38
OnInitialHeadersComplete(bool fin,size_t frame_len,const quic::QuicHeaderList & header_list)39 void WebSocketQuicSpdyStream::OnInitialHeadersComplete(
40 bool fin,
41 size_t frame_len,
42 const quic::QuicHeaderList& header_list) {
43 QuicSpdyStream::OnInitialHeadersComplete(fin, frame_len, header_list);
44 if (delegate_) {
45 delegate_->OnInitialHeadersComplete(fin, frame_len, header_list);
46 }
47 }
48
Read(IOBuffer * buf,int buf_len)49 int WebSocketQuicSpdyStream::Read(IOBuffer* buf, int buf_len) {
50 DCHECK_GT(buf_len, 0);
51 DCHECK(buf->data());
52
53 if (IsDoneReading()) {
54 return 0; // EOF
55 }
56
57 if (!HasBytesToRead()) {
58 return ERR_IO_PENDING;
59 }
60
61 iovec iov;
62 iov.iov_base = buf->data();
63 iov.iov_len = buf_len;
64 size_t bytes_read = Readv(&iov, 1);
65 // Since HasBytesToRead is true, Readv() must have read some data.
66 DCHECK_NE(0u, bytes_read);
67 return bytes_read;
68 }
69
70 } // namespace net
71