Chromium Code Reviews| Index: net/spdy/spdy_framer.cc |
| diff --git a/net/spdy/spdy_framer.cc b/net/spdy/spdy_framer.cc |
| index 79a529f5724f172ffb4d9e07718dbd3087f8582c..48923244af7e54bd67157540558adf964d885800 100644 |
| --- a/net/spdy/spdy_framer.cc |
| +++ b/net/spdy/spdy_framer.cc |
| @@ -184,8 +184,8 @@ size_t SpdyFramer::GetSynStreamMinimumSize() const { |
| return GetControlFrameHeaderSize() + 10; |
| } else { |
| // Calculated as: |
| - // frame prefix + 4 (priority) |
| - return GetControlFrameHeaderSize() + 4; |
| + // frame prefix + 5 (priority) |
| + return GetControlFrameHeaderSize() + 5; |
|
Ryan Hamilton
2014/05/19 22:56:41
I'm not terribly in love with the magic number her
Johnny
2014/05/19 23:27:17
Done. Though, now this particularly calls attentio
|
| } |
| } |
| @@ -1047,7 +1047,7 @@ void SpdyFramer::ProcessControlFrameHeader(uint16 control_frame_type_field) { |
| frame_size_without_variable_data = GetHeadersMinimumSize(); |
| if (protocol_version() > SPDY3 && |
| current_frame_flags_ & HEADERS_FLAG_PRIORITY) { |
| - frame_size_without_variable_data += 4; // priority |
| + frame_size_without_variable_data += 5; // priority |
| } |
| break; |
| case PUSH_PROMISE: |
| @@ -1414,8 +1414,13 @@ size_t SpdyFramer::ProcessControlFrameBeforeHeaderBlock(const char* data, |
| (current_frame_flags_ & HEADERS_FLAG_PRIORITY) != 0; |
| uint32 priority = 0; |
| if (protocol_version() > SPDY3 && has_priority) { |
| - successful_read = reader.ReadUInt31(&priority); |
| - DCHECK(successful_read); |
| + // TODO(jgraettinger): Process dependency rather than ignoring it. |
| + reader.Seek(4); |
| + uint8 weight = 0; |
| + successful_read = reader.ReadUInt8(&weight); |
| + if (successful_read) { |
| + priority = MapWeightToPriority(weight); |
| + } |
| } |
| DCHECK(reader.IsDoneReading()); |
| if (debug_visitor_) { |
| @@ -2376,7 +2381,9 @@ SpdySerializedFrame* SpdyFramer::SerializeSynStream( |
| HEADERS, |
| flags, |
| syn_stream.stream_id()); |
| - builder.WriteUInt32(priority); |
| + // TODO(jgraettinger): Plumb priorities and stream dependencies. |
| + builder.WriteUInt32(0); // Non-exclusive bit and root stream ID. |
| + builder.WriteUInt8(MapPriorityToWeight(priority)); |
| } |
| DCHECK_EQ(GetSynStreamMinimumSize(), builder.length()); |
| if (protocol_version() > SPDY3) { |
| @@ -2664,7 +2671,9 @@ SpdySerializedFrame* SpdyFramer::SerializeHeaders( |
| flags, |
| headers.stream_id()); |
| if (headers.has_priority()) { |
| - builder.WriteUInt32(priority); |
| + // TODO(jgraettinger): Plumb priorities and stream dependencies. |
| + builder.WriteUInt32(0); // Non-exclusive bit and root stream ID. |
| + builder.WriteUInt8(MapPriorityToWeight(priority)); |
| } |
| } |
| if (protocol_version() <= SPDY2) { |
| @@ -3055,6 +3064,16 @@ HpackDecoder* SpdyFramer::GetHpackDecoder() { |
| return hpack_decoder_.get(); |
| } |
| +uint8 SpdyFramer::MapPriorityToWeight(SpdyPriority priority) { |
| + const float kSteps = 255.9f / 7.f; |
| + return static_cast<uint8>(kSteps * (7.f - priority)); |
| +} |
| + |
| +SpdyPriority SpdyFramer::MapWeightToPriority(uint8 weight) { |
| + const float kSteps = 255.9f / 7.f; |
| + return static_cast<SpdyPriority>(7.f - weight / kSteps); |
| +} |
| + |
| // Incrementally decompress the control frame's header block, feeding the |
| // result to the visitor in chunks. Continue this until the visitor |
| // indicates that it cannot process any more data, or (more commonly) we |