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 // TODO(rtenhove) clean up frame buffer size calculations so that we aren't | 5 // TODO(rtenhove) clean up frame buffer size calculations so that we aren't |
6 // constantly adding and subtracting header sizes; this is ugly and error- | 6 // constantly adding and subtracting header sizes; this is ugly and error- |
7 // prone. | 7 // prone. |
8 | 8 |
9 #include "net/spdy/spdy_framer.h" | 9 #include "net/spdy/spdy_framer.h" |
10 | 10 |
(...skipping 1165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1176 size_t bytes_read = UpdateCurrentFrameBuffer(&data, &len, | 1176 size_t bytes_read = UpdateCurrentFrameBuffer(&data, &len, |
1177 remaining_control_payload_); | 1177 remaining_control_payload_); |
1178 remaining_control_payload_ -= bytes_read; | 1178 remaining_control_payload_ -= bytes_read; |
1179 remaining_data_ -= bytes_read; | 1179 remaining_data_ -= bytes_read; |
1180 if (remaining_control_payload_ == 0) { | 1180 if (remaining_control_payload_ == 0) { |
1181 SpdyControlFrame control_frame(current_frame_buffer_.get(), false); | 1181 SpdyControlFrame control_frame(current_frame_buffer_.get(), false); |
1182 DCHECK(!control_frame.has_header_block()); | 1182 DCHECK(!control_frame.has_header_block()); |
1183 // Use frame-specific handlers. | 1183 // Use frame-specific handlers. |
1184 switch (control_frame.type()) { | 1184 switch (control_frame.type()) { |
1185 case PING: { | 1185 case PING: { |
1186 SpdyPingControlFrame* ping_frame = | 1186 SpdyFrameReader reader(current_frame_buffer_.get(), |
1187 reinterpret_cast<SpdyPingControlFrame*>(&control_frame); | 1187 current_frame_len_); |
1188 visitor_->OnPing(ping_frame->unique_id()); | 1188 reader.Seek(GetControlFrameMinimumSize()); // Skip frame header. |
| 1189 SpdyPingId id = 0; |
| 1190 bool successful_read = reader.ReadUInt32(&id); |
| 1191 DCHECK(successful_read); |
| 1192 DCHECK(reader.IsDoneReading()); |
| 1193 visitor_->OnPing(id); |
1189 } | 1194 } |
1190 break; | 1195 break; |
1191 case WINDOW_UPDATE: { | 1196 case WINDOW_UPDATE: { |
1192 SpdyFrameReader reader(current_frame_buffer_.get(), | 1197 SpdyFrameReader reader(current_frame_buffer_.get(), |
1193 current_frame_len_); | 1198 current_frame_len_); |
1194 reader.Seek(SpdyFrame::kHeaderSize); // Seek past frame header. | 1199 reader.Seek(SpdyFrame::kHeaderSize); // Seek past frame header. |
1195 SpdyStreamId stream_id = kInvalidStream; | 1200 SpdyStreamId stream_id = kInvalidStream; |
1196 uint32 delta_window_size = 0; | 1201 uint32 delta_window_size = 0; |
1197 bool successful_read = reader.ReadUInt31(&stream_id); | 1202 bool successful_read = reader.ReadUInt31(&stream_id); |
1198 DCHECK(successful_read); | 1203 DCHECK(successful_read); |
(...skipping 368 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1567 } | 1572 } |
1568 SettingsFlagsAndId flags_and_id(setting_flags, it->first); | 1573 SettingsFlagsAndId flags_and_id(setting_flags, it->first); |
1569 uint32 id_and_flags_wire = flags_and_id.GetWireFormat(protocol_version()); | 1574 uint32 id_and_flags_wire = flags_and_id.GetWireFormat(protocol_version()); |
1570 builder.WriteBytes(&id_and_flags_wire, 4); | 1575 builder.WriteBytes(&id_and_flags_wire, 4); |
1571 builder.WriteUInt32(it->second.value); | 1576 builder.WriteUInt32(it->second.value); |
1572 } | 1577 } |
1573 DCHECK_EQ(size, builder.length()); | 1578 DCHECK_EQ(size, builder.length()); |
1574 return builder.take(); | 1579 return builder.take(); |
1575 } | 1580 } |
1576 | 1581 |
1577 SpdyPingControlFrame* SpdyFramer::CreatePingFrame(uint32 unique_id) const { | 1582 SpdyFrame* SpdyFramer::CreatePingFrame(uint32 unique_id) const { |
1578 SpdyPingIR ping(unique_id); | 1583 SpdyPingIR ping(unique_id); |
1579 return reinterpret_cast<SpdyPingControlFrame*>(SerializePing(ping)); | 1584 return SerializePing(ping); |
1580 } | 1585 } |
1581 | 1586 |
1582 SpdySerializedFrame* SpdyFramer::SerializePing(const SpdyPingIR& ping) const { | 1587 SpdySerializedFrame* SpdyFramer::SerializePing(const SpdyPingIR& ping) const { |
1583 SpdyFrameBuilder builder(PING, 0, protocol_version(), GetPingSize()); | 1588 SpdyFrameBuilder builder(PING, 0, protocol_version(), GetPingSize()); |
1584 builder.WriteUInt32(ping.id()); | 1589 builder.WriteUInt32(ping.id()); |
1585 DCHECK_EQ(GetPingSize(), builder.length()); | 1590 DCHECK_EQ(GetPingSize(), builder.length()); |
1586 return builder.take(); | 1591 return builder.take(); |
1587 } | 1592 } |
1588 | 1593 |
1589 SpdyFrame* SpdyFramer::CreateGoAway( | 1594 SpdyFrame* SpdyFramer::CreateGoAway( |
(...skipping 476 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2066 builder->WriteString(it->first); | 2071 builder->WriteString(it->first); |
2067 builder->WriteString(it->second); | 2072 builder->WriteString(it->second); |
2068 } else { | 2073 } else { |
2069 builder->WriteStringPiece32(it->first); | 2074 builder->WriteStringPiece32(it->first); |
2070 builder->WriteStringPiece32(it->second); | 2075 builder->WriteStringPiece32(it->second); |
2071 } | 2076 } |
2072 } | 2077 } |
2073 } | 2078 } |
2074 | 2079 |
2075 } // namespace net | 2080 } // namespace net |
OLD | NEW |