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

Side by Side Diff: net/quic/quic_headers_stream.cc

Issue 1471583002: Add WritePushPromise() method in QuicHeadersStream for server push. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@107697347
Patch Set: Created 5 years, 1 month 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 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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/quic_headers_stream.h" 5 #include "net/quic/quic_headers_stream.h"
6 6
7 #include "base/metrics/histogram_macros.h" 7 #include "base/metrics/histogram_macros.h"
8 #include "base/strings/stringprintf.h" 8 #include "base/strings/stringprintf.h"
9 #include "net/quic/quic_flags.h" 9 #include "net/quic/quic_flags.h"
10 #include "net/quic/quic_headers_stream.h" 10 #include "net/quic/quic_headers_stream.h"
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after
197 spdy_framer_(HTTP2), 197 spdy_framer_(HTTP2),
198 spdy_framer_visitor_(new SpdyFramerVisitor(this)) { 198 spdy_framer_visitor_(new SpdyFramerVisitor(this)) {
199 spdy_framer_.set_visitor(spdy_framer_visitor_.get()); 199 spdy_framer_.set_visitor(spdy_framer_visitor_.get());
200 spdy_framer_.set_debug_visitor(spdy_framer_visitor_.get()); 200 spdy_framer_.set_debug_visitor(spdy_framer_visitor_.get());
201 // The headers stream is exempt from connection level flow control. 201 // The headers stream is exempt from connection level flow control.
202 DisableConnectionFlowControlForThisStream(); 202 DisableConnectionFlowControlForThisStream();
203 } 203 }
204 204
205 QuicHeadersStream::~QuicHeadersStream() {} 205 QuicHeadersStream::~QuicHeadersStream() {}
206 206
207 size_t QuicHeadersStream::WriteHeaders( 207 size_t QuicHeadersStream::WriteHeaders(QuicStreamId stream_id,
208 QuicStreamId stream_id, 208 const SpdyHeaderBlock& headers,
209 const SpdyHeaderBlock& headers, 209 bool fin,
210 bool fin, 210 SpdyPriority priority,
211 SpdyPriority priority, 211 QuicAckListenerInterface* ack_listener) {
212 QuicAckListenerInterface* ack_notifier_delegate) {
213 SpdyHeadersIR headers_frame(stream_id); 212 SpdyHeadersIR headers_frame(stream_id);
214 headers_frame.set_header_block(headers); 213 headers_frame.set_header_block(headers);
215 headers_frame.set_fin(fin); 214 headers_frame.set_fin(fin);
216 if (session()->perspective() == Perspective::IS_CLIENT) { 215 if (session()->perspective() == Perspective::IS_CLIENT) {
217 headers_frame.set_has_priority(true); 216 headers_frame.set_has_priority(true);
218 headers_frame.set_priority(priority); 217 headers_frame.set_priority(priority);
219 } 218 }
220 scoped_ptr<SpdySerializedFrame> frame( 219 scoped_ptr<SpdySerializedFrame> frame(
221 spdy_framer_.SerializeFrame(headers_frame)); 220 spdy_framer_.SerializeFrame(headers_frame));
222 WriteOrBufferData(StringPiece(frame->data(), frame->size()), false, 221 WriteOrBufferData(StringPiece(frame->data(), frame->size()), false,
223 ack_notifier_delegate); 222 ack_listener);
224 return frame->size(); 223 return frame->size();
225 } 224 }
226 225
226 size_t QuicHeadersStream::WritePushPromise(
227 QuicStreamId original_stream_id,
228 QuicStreamId promised_stream_id,
229 const SpdyHeaderBlock& headers,
230 QuicAckListenerInterface* ack_listener) {
231 if (session()->perspective() == Perspective::IS_CLIENT) {
232 LOG(DFATAL) << "Client shouldn't send PUSH_PROMISE";
233 return 0;
234 }
235
236 SpdyPushPromiseIR push_promise(original_stream_id,
237 promised_stream_id);
238 push_promise.set_header_block(headers);
239 // PUSH_PROMISE must not be the last frame sent out, at least followed by
240 // response headers.
241 push_promise.set_fin(false);
242
243 scoped_ptr<SpdySerializedFrame> frame(
244 spdy_framer_.SerializeFrame(push_promise));
245 WriteOrBufferData(StringPiece(frame->data(), frame->size()), false,
246 ack_listener);
247 return frame->size();
248 }
249
227 void QuicHeadersStream::OnDataAvailable() { 250 void QuicHeadersStream::OnDataAvailable() {
228 char buffer[1024]; 251 char buffer[1024];
229 struct iovec iov; 252 struct iovec iov;
230 QuicTime timestamp(QuicTime::Zero()); 253 QuicTime timestamp(QuicTime::Zero());
231 while (true) { 254 while (true) {
232 iov.iov_base = buffer; 255 iov.iov_base = buffer;
233 iov.iov_len = arraysize(buffer); 256 iov.iov_len = arraysize(buffer);
234 if (measure_headers_hol_blocking_time_) { 257 if (measure_headers_hol_blocking_time_) {
235 if (!sequencer()->GetReadableRegion(&iov, &timestamp)) { 258 if (!sequencer()->GetReadableRegion(&iov, &timestamp)) {
236 // No more data to read. 259 // No more data to read.
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
318 341
319 void QuicHeadersStream::OnCompressedFrameSize(size_t frame_len) { 342 void QuicHeadersStream::OnCompressedFrameSize(size_t frame_len) {
320 frame_len_ += frame_len; 343 frame_len_ += frame_len;
321 } 344 }
322 345
323 bool QuicHeadersStream::IsConnected() { 346 bool QuicHeadersStream::IsConnected() {
324 return session()->connection()->connected(); 347 return session()->connection()->connected();
325 } 348 }
326 349
327 } // namespace net 350 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698