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

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: format 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),
27 delegate_(delegate),
28 read_headers_buffer_(nullptr),
29 read_body_buffer_len_(0) {
27 SaveState(); 30 SaveState();
28 } 31 }
29 32
30 QuicChromiumClientStream::Handle::~Handle() { 33 QuicChromiumClientStream::Handle::~Handle() {
31 if (stream_) { 34 if (stream_) {
32 stream_->ClearHandle(); 35 stream_->ClearHandle();
33 // TODO(rch): If stream_ is still valid, it should probably be Reset() 36 // TODO(rch): If stream_ is still valid, it should probably be Reset()
34 // so that it does not leak. 37 // so that it does not leak.
35 // stream_->Reset(QUIC_STREAM_CANCELLED); 38 // stream_->Reset(QUIC_STREAM_CANCELLED);
36 } 39 }
(...skipping 14 matching lines...) Expand all
51 ResetAndReturn(&read_headers_callback_).Run(rv); 54 ResetAndReturn(&read_headers_callback_).Run(rv);
52 } 55 }
53 56
54 void QuicChromiumClientStream::Handle::OnTrailingHeadersAvailable( 57 void QuicChromiumClientStream::Handle::OnTrailingHeadersAvailable(
55 const SpdyHeaderBlock& headers, 58 const SpdyHeaderBlock& headers,
56 size_t frame_len) { 59 size_t frame_len) {
57 delegate_->OnTrailingHeadersAvailable(headers, frame_len); 60 delegate_->OnTrailingHeadersAvailable(headers, frame_len);
58 } 61 }
59 62
60 void QuicChromiumClientStream::Handle::OnDataAvailable() { 63 void QuicChromiumClientStream::Handle::OnDataAvailable() {
61 delegate_->OnDataAvailable(); 64 if (!read_body_callback_)
65 return; // Wait for ReadBody to be called.
66
67 int rv = stream_->Read(read_body_buffer_, read_body_buffer_len_);
68 if (rv == ERR_IO_PENDING)
69 return; // Spurrious, likely because of trailers?
70
71 read_body_buffer_ = nullptr;
72 read_body_buffer_len_ = 0;
73 ResetAndReturn(&read_body_callback_).Run(rv);
62 } 74 }
63 75
64 void QuicChromiumClientStream::Handle::OnClose() { 76 void QuicChromiumClientStream::Handle::OnClose() {
65 if (stream_) 77 if (stream_)
66 SaveState(); 78 SaveState();
67 stream_ = nullptr; 79 stream_ = nullptr;
68 if (delegate_) { 80 if (delegate_) {
69 auto* delegate = delegate_; 81 auto* delegate = delegate_;
70 delegate_ = nullptr; 82 delegate_ = nullptr;
71 delegate->OnClose(); 83 delegate->OnClose();
(...skipping 19 matching lines...) Expand all
91 103
92 int frame_len = 0; 104 int frame_len = 0;
93 if (stream_->DeliverInitialHeaders(header_block, &frame_len)) 105 if (stream_->DeliverInitialHeaders(header_block, &frame_len))
94 return frame_len; 106 return frame_len;
95 107
96 read_headers_buffer_ = header_block; 108 read_headers_buffer_ = header_block;
97 read_headers_callback_ = callback; 109 read_headers_callback_ = callback;
98 return ERR_IO_PENDING; 110 return ERR_IO_PENDING;
99 } 111 }
100 112
113 int QuicChromiumClientStream::Handle::ReadBody(
114 IOBuffer* buffer,
115 int buffer_len,
116 const CompletionCallback& callback) {
117 if (!stream_)
118 return ERR_CONNECTION_CLOSED;
119
120 int rv = stream_->Read(buffer, buffer_len);
121 if (rv != ERR_IO_PENDING)
122 return rv;
123
124 read_body_callback_ = callback;
125 read_body_buffer_ = buffer;
126 read_body_buffer_len_ = buffer_len;
127 return ERR_IO_PENDING;
128 }
129
101 size_t QuicChromiumClientStream::Handle::WriteHeaders( 130 size_t QuicChromiumClientStream::Handle::WriteHeaders(
102 SpdyHeaderBlock header_block, 131 SpdyHeaderBlock header_block,
103 bool fin, 132 bool fin,
104 QuicReferenceCountedPointer<QuicAckListenerInterface> 133 QuicReferenceCountedPointer<QuicAckListenerInterface>
105 ack_notifier_delegate) { 134 ack_notifier_delegate) {
106 if (!stream_) 135 if (!stream_)
107 return 0; 136 return 0;
108 return stream_->WriteHeaders(std::move(header_block), fin, 137 return stream_->WriteHeaders(std::move(header_block), fin,
109 ack_notifier_delegate); 138 ack_notifier_delegate);
110 } 139 }
(...skipping 431 matching lines...) Expand 10 before | Expand all | Expand 10 after
542 571
543 void QuicChromiumClientStream::DisableConnectionMigration() { 572 void QuicChromiumClientStream::DisableConnectionMigration() {
544 can_migrate_ = false; 573 can_migrate_ = false;
545 } 574 }
546 575
547 bool QuicChromiumClientStream::IsFirstStream() { 576 bool QuicChromiumClientStream::IsFirstStream() {
548 return id() == kHeadersStreamId + 2; 577 return id() == kHeadersStreamId + 2;
549 } 578 }
550 579
551 } // namespace net 580 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/chromium/quic_chromium_client_stream.h ('k') | net/quic/chromium/quic_chromium_client_stream_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698