Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(376)

Side by Side Diff: net/quic/chromium/quic_chromium_client_stream.cc

Issue 2877063002: Add an async ReadBody method to QuicChromiumClientStream::Handle (Closed)
Patch Set: Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/quic/chromium/quic_chromium_client_stream.h" 5 #include "net/quic/chromium/quic_chromium_client_stream.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/bind_helpers.h" 9 #include "base/bind_helpers.h"
10 #include "base/callback_helpers.h" 10 #include "base/callback_helpers.h"
11 #include "base/location.h" 11 #include "base/location.h"
12 #include "base/threading/thread_task_runner_handle.h" 12 #include "base/threading/thread_task_runner_handle.h"
13 #include "net/base/io_buffer.h" 13 #include "net/base/io_buffer.h"
14 #include "net/base/net_errors.h" 14 #include "net/base/net_errors.h"
15 #include "net/log/net_log_event_type.h" 15 #include "net/log/net_log_event_type.h"
16 #include "net/quic/chromium/quic_chromium_client_session.h" 16 #include "net/quic/chromium/quic_chromium_client_session.h"
17 #include "net/quic/chromium/quic_http_utils.h" 17 #include "net/quic/chromium/quic_http_utils.h"
18 #include "net/quic/core/quic_spdy_session.h" 18 #include "net/quic/core/quic_spdy_session.h"
19 #include "net/quic/core/quic_write_blocked_list.h" 19 #include "net/quic/core/quic_write_blocked_list.h"
20 #include "net/quic/core/spdy_utils.h" 20 #include "net/quic/core/spdy_utils.h"
21 21
22 namespace net { 22 namespace net {
23 23
24 QuicChromiumClientStream::Handle::Handle(QuicChromiumClientStream* stream, 24 QuicChromiumClientStream::Handle::Handle(QuicChromiumClientStream* stream,
25 Delegate* delegate) 25 Delegate* delegate)
26 : stream_(stream), delegate_(delegate), read_headers_buffer_(nullptr) { 26 : stream_(stream), delegate_(delegate), read_headers_buffer_(nullptr) {
xunjieli 2017/05/12 15:22:22 nit: need to default initialize |read_body_buffer_
Ryan Hamilton 2017/05/12 17:26:24 Done.
27 SaveState(); 27 SaveState();
28 } 28 }
29 29
30 QuicChromiumClientStream::Handle::~Handle() { 30 QuicChromiumClientStream::Handle::~Handle() {
31 if (stream_) { 31 if (stream_) {
32 stream_->ClearHandle(); 32 stream_->ClearHandle();
33 // TODO(rch): If stream_ is still valid, it should probably be Reset() 33 // TODO(rch): If stream_ is still valid, it should probably be Reset()
34 // so that it does not leak. 34 // so that it does not leak.
35 // stream_->Reset(QUIC_STREAM_CANCELLED); 35 // stream_->Reset(QUIC_STREAM_CANCELLED);
36 } 36 }
(...skipping 14 matching lines...) Expand all
51 ResetAndReturn(&read_headers_callback_).Run(rv); 51 ResetAndReturn(&read_headers_callback_).Run(rv);
52 } 52 }
53 53
54 void QuicChromiumClientStream::Handle::OnTrailingHeadersAvailable( 54 void QuicChromiumClientStream::Handle::OnTrailingHeadersAvailable(
55 const SpdyHeaderBlock& headers, 55 const SpdyHeaderBlock& headers,
56 size_t frame_len) { 56 size_t frame_len) {
57 delegate_->OnTrailingHeadersAvailable(headers, frame_len); 57 delegate_->OnTrailingHeadersAvailable(headers, frame_len);
58 } 58 }
59 59
60 void QuicChromiumClientStream::Handle::OnDataAvailable() { 60 void QuicChromiumClientStream::Handle::OnDataAvailable() {
61 delegate_->OnDataAvailable(); 61 if (!read_body_callback_)
62 return; // Wait for ReadBody to be called.
63
64 int rv = stream_->Read(read_body_buffer_, read_body_buffer_len_);
65 if (rv == ERR_IO_PENDING)
66 return; // Spurrious, likely because of trailers?
67
68 read_body_buffer_ = nullptr;
69 read_body_buffer_len_ = 0;
70 ResetAndReturn(&read_body_callback_).Run(rv);
62 } 71 }
63 72
64 void QuicChromiumClientStream::Handle::OnClose() { 73 void QuicChromiumClientStream::Handle::OnClose() {
65 if (stream_) 74 if (stream_)
66 SaveState(); 75 SaveState();
67 stream_ = nullptr; 76 stream_ = nullptr;
68 if (delegate_) { 77 if (delegate_) {
69 auto* delegate = delegate_; 78 auto* delegate = delegate_;
70 delegate_ = nullptr; 79 delegate_ = nullptr;
71 delegate->OnClose(); 80 delegate->OnClose();
(...skipping 19 matching lines...) Expand all
91 100
92 int frame_len = 0; 101 int frame_len = 0;
93 if (stream_->DeliverInitialHeaders(header_block, &frame_len)) 102 if (stream_->DeliverInitialHeaders(header_block, &frame_len))
94 return frame_len; 103 return frame_len;
95 104
96 read_headers_buffer_ = header_block; 105 read_headers_buffer_ = header_block;
97 read_headers_callback_ = callback; 106 read_headers_callback_ = callback;
98 return ERR_IO_PENDING; 107 return ERR_IO_PENDING;
99 } 108 }
100 109
110 int QuicChromiumClientStream::Handle::ReadBody(
111 IOBuffer* buffer,
112 int buffer_len,
113 const CompletionCallback& callback) {
114 if (!stream_)
115 return ERR_CONNECTION_CLOSED;
116
117 int rv = stream_->Read(buffer, buffer_len);
118 if (rv != ERR_IO_PENDING)
119 return rv;
120
121 read_body_callback_ = callback;
122 read_body_buffer_ = buffer;
123 read_body_buffer_len_ = buffer_len;
124 return ERR_IO_PENDING;
125 }
126
101 size_t QuicChromiumClientStream::Handle::WriteHeaders( 127 size_t QuicChromiumClientStream::Handle::WriteHeaders(
102 SpdyHeaderBlock header_block, 128 SpdyHeaderBlock header_block,
103 bool fin, 129 bool fin,
104 QuicReferenceCountedPointer<QuicAckListenerInterface> 130 QuicReferenceCountedPointer<QuicAckListenerInterface>
105 ack_notifier_delegate) { 131 ack_notifier_delegate) {
106 if (!stream_) 132 if (!stream_)
107 return 0; 133 return 0;
108 return stream_->WriteHeaders(std::move(header_block), fin, 134 return stream_->WriteHeaders(std::move(header_block), fin,
109 ack_notifier_delegate); 135 ack_notifier_delegate);
110 } 136 }
(...skipping 431 matching lines...) Expand 10 before | Expand all | Expand 10 after
542 568
543 void QuicChromiumClientStream::DisableConnectionMigration() { 569 void QuicChromiumClientStream::DisableConnectionMigration() {
544 can_migrate_ = false; 570 can_migrate_ = false;
545 } 571 }
546 572
547 bool QuicChromiumClientStream::IsFirstStream() { 573 bool QuicChromiumClientStream::IsFirstStream() {
548 return id() == kHeadersStreamId + 2; 574 return id() == kHeadersStreamId + 2;
549 } 575 }
550 576
551 } // namespace net 577 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698