| OLD | NEW |
| 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/spdy/buffered_spdy_framer.h" | 5 #include "net/spdy/buffered_spdy_framer.h" |
| 6 | 6 |
| 7 #include <utility> |
| 8 |
| 7 #include "base/logging.h" | 9 #include "base/logging.h" |
| 8 #include "base/strings/string_util.h" | 10 #include "base/strings/string_util.h" |
| 9 | 11 |
| 10 namespace net { | 12 namespace net { |
| 11 | 13 |
| 12 namespace { | 14 namespace { |
| 13 | 15 |
| 14 // GOAWAY frame debug data is only buffered up to this many bytes. | 16 // GOAWAY frame debug data is only buffered up to this many bytes. |
| 15 size_t kGoAwayDebugDataMaxSize = 1024; | 17 size_t kGoAwayDebugDataMaxSize = 1024; |
| 16 | 18 |
| (...skipping 352 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 369 return spdy_framer_.HasError(); | 371 return spdy_framer_.HasError(); |
| 370 } | 372 } |
| 371 | 373 |
| 372 // TODO(jgraettinger): Eliminate uses of this method (prefer | 374 // TODO(jgraettinger): Eliminate uses of this method (prefer |
| 373 // SpdySynStreamIR). | 375 // SpdySynStreamIR). |
| 374 SpdySerializedFrame* BufferedSpdyFramer::CreateSynStream( | 376 SpdySerializedFrame* BufferedSpdyFramer::CreateSynStream( |
| 375 SpdyStreamId stream_id, | 377 SpdyStreamId stream_id, |
| 376 SpdyStreamId associated_stream_id, | 378 SpdyStreamId associated_stream_id, |
| 377 SpdyPriority priority, | 379 SpdyPriority priority, |
| 378 SpdyControlFlags flags, | 380 SpdyControlFlags flags, |
| 379 const SpdyHeaderBlock* headers) { | 381 SpdyHeaderBlock headers) { |
| 380 SpdySynStreamIR syn_stream(stream_id); | 382 SpdySynStreamIR syn_stream(stream_id, std::move(headers)); |
| 381 syn_stream.set_associated_to_stream_id(associated_stream_id); | 383 syn_stream.set_associated_to_stream_id(associated_stream_id); |
| 382 syn_stream.set_priority(priority); | 384 syn_stream.set_priority(priority); |
| 383 syn_stream.set_fin((flags & CONTROL_FLAG_FIN) != 0); | 385 syn_stream.set_fin((flags & CONTROL_FLAG_FIN) != 0); |
| 384 syn_stream.set_unidirectional((flags & CONTROL_FLAG_UNIDIRECTIONAL) != 0); | 386 syn_stream.set_unidirectional((flags & CONTROL_FLAG_UNIDIRECTIONAL) != 0); |
| 385 // TODO(hkhalil): Avoid copy here. | |
| 386 syn_stream.set_header_block(*headers); | |
| 387 return new SpdySerializedFrame(spdy_framer_.SerializeSynStream(syn_stream)); | 387 return new SpdySerializedFrame(spdy_framer_.SerializeSynStream(syn_stream)); |
| 388 } | 388 } |
| 389 | 389 |
| 390 // TODO(jgraettinger): Eliminate uses of this method (prefer | 390 // TODO(jgraettinger): Eliminate uses of this method (prefer |
| 391 // SpdySynReplyIR). | 391 // SpdySynReplyIR). |
| 392 SpdySerializedFrame* BufferedSpdyFramer::CreateSynReply( | 392 SpdySerializedFrame* BufferedSpdyFramer::CreateSynReply( |
| 393 SpdyStreamId stream_id, | 393 SpdyStreamId stream_id, |
| 394 SpdyControlFlags flags, | 394 SpdyControlFlags flags, |
| 395 const SpdyHeaderBlock* headers) { | 395 SpdyHeaderBlock headers) { |
| 396 SpdySynReplyIR syn_reply(stream_id); | 396 SpdySynReplyIR syn_reply(stream_id, std::move(headers)); |
| 397 syn_reply.set_fin(flags & CONTROL_FLAG_FIN); | 397 syn_reply.set_fin(flags & CONTROL_FLAG_FIN); |
| 398 // TODO(hkhalil): Avoid copy here. | |
| 399 syn_reply.set_header_block(*headers); | |
| 400 return new SpdySerializedFrame(spdy_framer_.SerializeSynReply(syn_reply)); | 398 return new SpdySerializedFrame(spdy_framer_.SerializeSynReply(syn_reply)); |
| 401 } | 399 } |
| 402 | 400 |
| 403 // TODO(jgraettinger): Eliminate uses of this method (prefer | 401 // TODO(jgraettinger): Eliminate uses of this method (prefer |
| 404 // SpdyRstStreamIR). | 402 // SpdyRstStreamIR). |
| 405 SpdySerializedFrame* BufferedSpdyFramer::CreateRstStream( | 403 SpdySerializedFrame* BufferedSpdyFramer::CreateRstStream( |
| 406 SpdyStreamId stream_id, | 404 SpdyStreamId stream_id, |
| 407 SpdyRstStreamStatus status) const { | 405 SpdyRstStreamStatus status) const { |
| 408 SpdyRstStreamIR rst_ir(stream_id, status); | 406 SpdyRstStreamIR rst_ir(stream_id, status); |
| 409 return new SpdySerializedFrame(spdy_framer_.SerializeRstStream(rst_ir)); | 407 return new SpdySerializedFrame(spdy_framer_.SerializeRstStream(rst_ir)); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 441 base::StringPiece debug_data) const { | 439 base::StringPiece debug_data) const { |
| 442 SpdyGoAwayIR go_ir(last_accepted_stream_id, status, debug_data); | 440 SpdyGoAwayIR go_ir(last_accepted_stream_id, status, debug_data); |
| 443 return new SpdySerializedFrame(spdy_framer_.SerializeGoAway(go_ir)); | 441 return new SpdySerializedFrame(spdy_framer_.SerializeGoAway(go_ir)); |
| 444 } | 442 } |
| 445 | 443 |
| 446 // TODO(jgraettinger): Eliminate uses of this method (prefer SpdyHeadersIR). | 444 // TODO(jgraettinger): Eliminate uses of this method (prefer SpdyHeadersIR). |
| 447 SpdySerializedFrame* BufferedSpdyFramer::CreateHeaders( | 445 SpdySerializedFrame* BufferedSpdyFramer::CreateHeaders( |
| 448 SpdyStreamId stream_id, | 446 SpdyStreamId stream_id, |
| 449 SpdyControlFlags flags, | 447 SpdyControlFlags flags, |
| 450 int weight, | 448 int weight, |
| 451 const SpdyHeaderBlock* headers) { | 449 SpdyHeaderBlock headers) { |
| 452 SpdyHeadersIR headers_ir(stream_id); | 450 SpdyHeadersIR headers_ir(stream_id, std::move(headers)); |
| 453 headers_ir.set_fin((flags & CONTROL_FLAG_FIN) != 0); | 451 headers_ir.set_fin((flags & CONTROL_FLAG_FIN) != 0); |
| 454 if (flags & HEADERS_FLAG_PRIORITY) { | 452 if (flags & HEADERS_FLAG_PRIORITY) { |
| 455 headers_ir.set_has_priority(true); | 453 headers_ir.set_has_priority(true); |
| 456 headers_ir.set_weight(weight); | 454 headers_ir.set_weight(weight); |
| 457 } | 455 } |
| 458 headers_ir.set_header_block(*headers); | |
| 459 return new SpdySerializedFrame(spdy_framer_.SerializeHeaders(headers_ir)); | 456 return new SpdySerializedFrame(spdy_framer_.SerializeHeaders(headers_ir)); |
| 460 } | 457 } |
| 461 | 458 |
| 462 // TODO(jgraettinger): Eliminate uses of this method (prefer | 459 // TODO(jgraettinger): Eliminate uses of this method (prefer |
| 463 // SpdyWindowUpdateIR). | 460 // SpdyWindowUpdateIR). |
| 464 SpdySerializedFrame* BufferedSpdyFramer::CreateWindowUpdate( | 461 SpdySerializedFrame* BufferedSpdyFramer::CreateWindowUpdate( |
| 465 SpdyStreamId stream_id, | 462 SpdyStreamId stream_id, |
| 466 uint32_t delta_window_size) const { | 463 uint32_t delta_window_size) const { |
| 467 SpdyWindowUpdateIR update_ir(stream_id, delta_window_size); | 464 SpdyWindowUpdateIR update_ir(stream_id, delta_window_size); |
| 468 return new SpdySerializedFrame(spdy_framer_.SerializeWindowUpdate(update_ir)); | 465 return new SpdySerializedFrame(spdy_framer_.SerializeWindowUpdate(update_ir)); |
| 469 } | 466 } |
| 470 | 467 |
| 471 // TODO(jgraettinger): Eliminate uses of this method (prefer SpdyDataIR). | 468 // TODO(jgraettinger): Eliminate uses of this method (prefer SpdyDataIR). |
| 472 SpdySerializedFrame* BufferedSpdyFramer::CreateDataFrame(SpdyStreamId stream_id, | 469 SpdySerializedFrame* BufferedSpdyFramer::CreateDataFrame(SpdyStreamId stream_id, |
| 473 const char* data, | 470 const char* data, |
| 474 uint32_t len, | 471 uint32_t len, |
| 475 SpdyDataFlags flags) { | 472 SpdyDataFlags flags) { |
| 476 SpdyDataIR data_ir(stream_id, | 473 SpdyDataIR data_ir(stream_id, |
| 477 base::StringPiece(data, len)); | 474 base::StringPiece(data, len)); |
| 478 data_ir.set_fin((flags & DATA_FLAG_FIN) != 0); | 475 data_ir.set_fin((flags & DATA_FLAG_FIN) != 0); |
| 479 return new SpdySerializedFrame(spdy_framer_.SerializeData(data_ir)); | 476 return new SpdySerializedFrame(spdy_framer_.SerializeData(data_ir)); |
| 480 } | 477 } |
| 481 | 478 |
| 482 // TODO(jgraettinger): Eliminate uses of this method (prefer SpdyPushPromiseIR). | 479 // TODO(jgraettinger): Eliminate uses of this method (prefer SpdyPushPromiseIR). |
| 483 SpdySerializedFrame* BufferedSpdyFramer::CreatePushPromise( | 480 SpdySerializedFrame* BufferedSpdyFramer::CreatePushPromise( |
| 484 SpdyStreamId stream_id, | 481 SpdyStreamId stream_id, |
| 485 SpdyStreamId promised_stream_id, | 482 SpdyStreamId promised_stream_id, |
| 486 const SpdyHeaderBlock* headers) { | 483 SpdyHeaderBlock headers) { |
| 487 SpdyPushPromiseIR push_promise_ir(stream_id, promised_stream_id); | 484 SpdyPushPromiseIR push_promise_ir(stream_id, promised_stream_id, |
| 488 push_promise_ir.set_header_block(*headers); | 485 std::move(headers)); |
| 489 return new SpdySerializedFrame( | 486 return new SpdySerializedFrame( |
| 490 spdy_framer_.SerializePushPromise(push_promise_ir)); | 487 spdy_framer_.SerializePushPromise(push_promise_ir)); |
| 491 } | 488 } |
| 492 | 489 |
| 493 SpdyPriority BufferedSpdyFramer::GetHighestPriority() const { | 490 SpdyPriority BufferedSpdyFramer::GetHighestPriority() const { |
| 494 return spdy_framer_.GetHighestPriority(); | 491 return spdy_framer_.GetHighestPriority(); |
| 495 } | 492 } |
| 496 | 493 |
| 497 void BufferedSpdyFramer::InitHeaderStreaming(SpdyStreamId stream_id) { | 494 void BufferedSpdyFramer::InitHeaderStreaming(SpdyStreamId stream_id) { |
| 498 header_buffer_.clear(); | 495 header_buffer_.clear(); |
| 499 header_buffer_valid_ = true; | 496 header_buffer_valid_ = true; |
| 500 header_stream_id_ = stream_id; | 497 header_stream_id_ = stream_id; |
| 501 DCHECK_NE(header_stream_id_, SpdyFramer::kInvalidStream); | 498 DCHECK_NE(header_stream_id_, SpdyFramer::kInvalidStream); |
| 502 } | 499 } |
| 503 | 500 |
| 504 } // namespace net | 501 } // namespace net |
| OLD | NEW |