xref: /aosp_15_r20/external/cronet/net/websockets/websocket_quic_spdy_stream.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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