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/spdy_framer.h" | 5 #include "net/spdy/spdy_framer.h" |
6 | 6 |
7 #include <string.h> | 7 #include <string.h> |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 #include <iterator> | 10 #include <iterator> |
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
230 size_t SpdyFramer::GetControlFrameHeaderSize() const { | 230 size_t SpdyFramer::GetControlFrameHeaderSize() const { |
231 return SpdyConstants::GetControlFrameHeaderSize(protocol_version()); | 231 return SpdyConstants::GetControlFrameHeaderSize(protocol_version()); |
232 } | 232 } |
233 | 233 |
234 size_t SpdyFramer::GetSynStreamMinimumSize() const { | 234 size_t SpdyFramer::GetSynStreamMinimumSize() const { |
235 // Size, in bytes, of a SYN_STREAM frame not including the variable-length | 235 // Size, in bytes, of a SYN_STREAM frame not including the variable-length |
236 // header block. | 236 // header block. |
237 if (protocol_version() <= SPDY3) { | 237 if (protocol_version() <= SPDY3) { |
238 // Calculated as: | 238 // Calculated as: |
239 // control frame header + 2 * 4 (stream IDs) + 1 (priority) | 239 // control frame header + 2 * 4 (stream IDs) + 1 (priority) |
240 // + 1 (unused, was credential slot) | 240 // + 1 (unused) |
241 return GetControlFrameHeaderSize() + 10; | 241 return GetControlFrameHeaderSize() + 10; |
242 } else { | 242 } else { |
243 return GetControlFrameHeaderSize() + | 243 return GetControlFrameHeaderSize() + |
244 kPriorityDependencyPayloadSize + | 244 kPriorityDependencyPayloadSize + |
245 kPriorityWeightPayloadSize; | 245 kPriorityWeightPayloadSize; |
246 } | 246 } |
247 } | 247 } |
248 | 248 |
249 size_t SpdyFramer::GetSynReplyMinimumSize() const { | 249 size_t SpdyFramer::GetSynReplyMinimumSize() const { |
250 // Size, in bytes, of a SYN_REPLY frame not including the variable-length | 250 // Size, in bytes, of a SYN_REPLY frame not including the variable-length |
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
490 case RST_STREAM_CANCEL: | 490 case RST_STREAM_CANCEL: |
491 return "CANCEL"; | 491 return "CANCEL"; |
492 case RST_STREAM_INTERNAL_ERROR: | 492 case RST_STREAM_INTERNAL_ERROR: |
493 return "INTERNAL_ERROR"; | 493 return "INTERNAL_ERROR"; |
494 case RST_STREAM_FLOW_CONTROL_ERROR: | 494 case RST_STREAM_FLOW_CONTROL_ERROR: |
495 return "FLOW_CONTROL_ERROR"; | 495 return "FLOW_CONTROL_ERROR"; |
496 case RST_STREAM_STREAM_IN_USE: | 496 case RST_STREAM_STREAM_IN_USE: |
497 return "STREAM_IN_USE"; | 497 return "STREAM_IN_USE"; |
498 case RST_STREAM_STREAM_ALREADY_CLOSED: | 498 case RST_STREAM_STREAM_ALREADY_CLOSED: |
499 return "STREAM_ALREADY_CLOSED"; | 499 return "STREAM_ALREADY_CLOSED"; |
500 case RST_STREAM_INVALID_CREDENTIALS: | |
501 return "INVALID_CREDENTIALS"; | |
502 case RST_STREAM_FRAME_TOO_LARGE: | 500 case RST_STREAM_FRAME_TOO_LARGE: |
503 return "FRAME_TOO_LARGE"; | 501 return "FRAME_TOO_LARGE"; |
504 case RST_STREAM_CONNECT_ERROR: | 502 case RST_STREAM_CONNECT_ERROR: |
505 return "CONNECT_ERROR"; | 503 return "CONNECT_ERROR"; |
506 case RST_STREAM_ENHANCE_YOUR_CALM: | 504 case RST_STREAM_ENHANCE_YOUR_CALM: |
507 return "ENHANCE_YOUR_CALM"; | 505 return "ENHANCE_YOUR_CALM"; |
508 case RST_STREAM_INADEQUATE_SECURITY: | 506 case RST_STREAM_INADEQUATE_SECURITY: |
509 return "INADEQUATE_SECURITY"; | 507 return "INADEQUATE_SECURITY"; |
510 case RST_STREAM_HTTP_1_1_REQUIRED: | 508 case RST_STREAM_HTTP_1_1_REQUIRED: |
511 return "HTTP_1_1_REQUIRED"; | 509 return "HTTP_1_1_REQUIRED"; |
(...skipping 14 matching lines...) Expand all Loading... |
526 case SETTINGS: | 524 case SETTINGS: |
527 return "SETTINGS"; | 525 return "SETTINGS"; |
528 case PING: | 526 case PING: |
529 return "PING"; | 527 return "PING"; |
530 case GOAWAY: | 528 case GOAWAY: |
531 return "GOAWAY"; | 529 return "GOAWAY"; |
532 case HEADERS: | 530 case HEADERS: |
533 return "HEADERS"; | 531 return "HEADERS"; |
534 case WINDOW_UPDATE: | 532 case WINDOW_UPDATE: |
535 return "WINDOW_UPDATE"; | 533 return "WINDOW_UPDATE"; |
536 case CREDENTIAL: | |
537 return "CREDENTIAL"; | |
538 case PUSH_PROMISE: | 534 case PUSH_PROMISE: |
539 return "PUSH_PROMISE"; | 535 return "PUSH_PROMISE"; |
540 case CONTINUATION: | 536 case CONTINUATION: |
541 return "CONTINUATION"; | 537 return "CONTINUATION"; |
542 case PRIORITY: | 538 case PRIORITY: |
543 return "PRIORITY"; | 539 return "PRIORITY"; |
544 case ALTSVC: | 540 case ALTSVC: |
545 return "ALTSVC"; | 541 return "ALTSVC"; |
546 case BLOCKED: | 542 case BLOCKED: |
547 return "BLOCKED"; | 543 return "BLOCKED"; |
(...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
883 ProcessControlFrameHeader(control_frame_type_field); | 879 ProcessControlFrameHeader(control_frame_type_field); |
884 } | 880 } |
885 | 881 |
886 return original_len - len; | 882 return original_len - len; |
887 } | 883 } |
888 | 884 |
889 void SpdyFramer::ProcessControlFrameHeader(int control_frame_type_field) { | 885 void SpdyFramer::ProcessControlFrameHeader(int control_frame_type_field) { |
890 DCHECK_EQ(SPDY_NO_ERROR, error_code_); | 886 DCHECK_EQ(SPDY_NO_ERROR, error_code_); |
891 DCHECK_LE(GetControlFrameHeaderSize(), current_frame_buffer_.len()); | 887 DCHECK_LE(GetControlFrameHeaderSize(), current_frame_buffer_.len()); |
892 | 888 |
893 // TODO(mlavan): Either remove credential frames from the code entirely, | |
894 // or add them to parsing + serialization methods for SPDY3. | |
895 // Early detection of deprecated frames that we ignore. | |
896 if (protocol_version() <= SPDY3) { | |
897 if (control_frame_type_field == CREDENTIAL) { | |
898 current_frame_type_ = CREDENTIAL; | |
899 DCHECK_EQ(SPDY3, protocol_version()); | |
900 DVLOG(1) << "CREDENTIAL control frame found. Ignoring."; | |
901 CHANGE_STATE(SPDY_IGNORE_REMAINING_PAYLOAD); | |
902 return; | |
903 } | |
904 } | |
905 | |
906 if (!SpdyConstants::IsValidFrameType(protocol_version(), | 889 if (!SpdyConstants::IsValidFrameType(protocol_version(), |
907 control_frame_type_field)) { | 890 control_frame_type_field)) { |
908 if (protocol_version() <= SPDY3) { | 891 if (protocol_version() <= SPDY3) { |
909 DLOG(WARNING) << "Invalid control frame type " << control_frame_type_field | 892 DLOG(WARNING) << "Invalid control frame type " << control_frame_type_field |
910 << " (protocol version: " << protocol_version() << ")"; | 893 << " (protocol version: " << protocol_version() << ")"; |
911 set_error(SPDY_INVALID_CONTROL_FRAME); | 894 set_error(SPDY_INVALID_CONTROL_FRAME); |
912 return; | 895 return; |
913 } else { | 896 } else { |
914 // In HTTP2 we ignore unknown frame types for extensibility, as long as | 897 // In HTTP2 we ignore unknown frame types for extensibility, as long as |
915 // the rest of the control frame header is valid. | 898 // the rest of the control frame header is valid. |
(...skipping 541 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1457 | 1440 |
1458 SpdyPriority priority = 0; | 1441 SpdyPriority priority = 0; |
1459 successful_read = reader.ReadUInt8(&priority); | 1442 successful_read = reader.ReadUInt8(&priority); |
1460 DCHECK(successful_read); | 1443 DCHECK(successful_read); |
1461 if (protocol_version() <= SPDY2) { | 1444 if (protocol_version() <= SPDY2) { |
1462 priority = priority >> 6; | 1445 priority = priority >> 6; |
1463 } else { | 1446 } else { |
1464 priority = priority >> 5; | 1447 priority = priority >> 5; |
1465 } | 1448 } |
1466 | 1449 |
1467 // Seek past unused byte; used to be credential slot in SPDY 3. | 1450 // Seek past unused byte. |
1468 reader.Seek(1); | 1451 reader.Seek(1); |
1469 | 1452 |
1470 DCHECK(reader.IsDoneReading()); | 1453 DCHECK(reader.IsDoneReading()); |
1471 if (debug_visitor_) { | 1454 if (debug_visitor_) { |
1472 debug_visitor_->OnReceiveCompressedFrame( | 1455 debug_visitor_->OnReceiveCompressedFrame( |
1473 current_frame_stream_id_, | 1456 current_frame_stream_id_, |
1474 current_frame_type_, | 1457 current_frame_type_, |
1475 current_frame_length_); | 1458 current_frame_length_); |
1476 } | 1459 } |
1477 visitor_->OnSynStream( | 1460 visitor_->OnSynStream( |
(...skipping 892 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2370 | 2353 |
2371 // The size of this frame, including variable-length header block. | 2354 // The size of this frame, including variable-length header block. |
2372 size_t size = GetSynStreamMinimumSize() + | 2355 size_t size = GetSynStreamMinimumSize() + |
2373 GetSerializedLength(syn_stream.header_block()); | 2356 GetSerializedLength(syn_stream.header_block()); |
2374 | 2357 |
2375 SpdyFrameBuilder builder(size, protocol_version()); | 2358 SpdyFrameBuilder builder(size, protocol_version()); |
2376 builder.WriteControlFrameHeader(*this, SYN_STREAM, flags); | 2359 builder.WriteControlFrameHeader(*this, SYN_STREAM, flags); |
2377 builder.WriteUInt32(syn_stream.stream_id()); | 2360 builder.WriteUInt32(syn_stream.stream_id()); |
2378 builder.WriteUInt32(syn_stream.associated_to_stream_id()); | 2361 builder.WriteUInt32(syn_stream.associated_to_stream_id()); |
2379 builder.WriteUInt8(priority << ((protocol_version() <= SPDY2) ? 6 : 5)); | 2362 builder.WriteUInt8(priority << ((protocol_version() <= SPDY2) ? 6 : 5)); |
2380 builder.WriteUInt8(0); // Unused byte where credential slot used to be. | 2363 builder.WriteUInt8(0); // Unused byte. |
2381 DCHECK_EQ(GetSynStreamMinimumSize(), builder.length()); | 2364 DCHECK_EQ(GetSynStreamMinimumSize(), builder.length()); |
2382 SerializeHeaderBlock(&builder, syn_stream); | 2365 SerializeHeaderBlock(&builder, syn_stream); |
2383 | 2366 |
2384 if (debug_visitor_) { | 2367 if (debug_visitor_) { |
2385 const size_t payload_len = | 2368 const size_t payload_len = |
2386 GetSerializedLength(protocol_version(), &(syn_stream.header_block())); | 2369 GetSerializedLength(protocol_version(), &(syn_stream.header_block())); |
2387 debug_visitor_->OnSendCompressedFrame(syn_stream.stream_id(), | 2370 debug_visitor_->OnSendCompressedFrame(syn_stream.stream_id(), |
2388 SYN_STREAM, | 2371 SYN_STREAM, |
2389 payload_len, | 2372 payload_len, |
2390 builder.length()); | 2373 builder.length()); |
(...skipping 849 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3240 #else | 3223 #else |
3241 WriteHeaderBlockToZ(&frame.header_block(), compressor); | 3224 WriteHeaderBlockToZ(&frame.header_block(), compressor); |
3242 #endif // defined(USE_SYSTEM_ZLIB) | 3225 #endif // defined(USE_SYSTEM_ZLIB) |
3243 | 3226 |
3244 int compressed_size = compressed_max_size - compressor->avail_out; | 3227 int compressed_size = compressed_max_size - compressor->avail_out; |
3245 builder->Seek(compressed_size); | 3228 builder->Seek(compressed_size); |
3246 builder->RewriteLength(*this); | 3229 builder->RewriteLength(*this); |
3247 } | 3230 } |
3248 | 3231 |
3249 } // namespace net | 3232 } // namespace net |
OLD | NEW |