| 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_frame_builder.h" | 5 #include "net/spdy/spdy_frame_builder.h" |
| 6 | 6 |
| 7 #include <limits> | 7 #include <limits> |
| 8 | 8 |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "net/spdy/spdy_bug_tracker.h" | 10 #include "net/spdy/spdy_bug_tracker.h" |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 56 return false; | 56 return false; |
| 57 } | 57 } |
| 58 | 58 |
| 59 length_ += length; | 59 length_ += length; |
| 60 return true; | 60 return true; |
| 61 } | 61 } |
| 62 | 62 |
| 63 bool SpdyFrameBuilder::WriteControlFrameHeader(const SpdyFramer& framer, | 63 bool SpdyFrameBuilder::WriteControlFrameHeader(const SpdyFramer& framer, |
| 64 SpdyFrameType type, | 64 SpdyFrameType type, |
| 65 uint8_t flags) { | 65 uint8_t flags) { |
| 66 DCHECK_EQ(SPDY3, version_); | 66 DCHECK(false); |
| 67 DCHECK(SpdyConstants::IsValidFrameType( | 67 DCHECK(SpdyConstants::IsValidFrameType( |
| 68 version_, SpdyConstants::SerializeFrameType(version_, type))); | 68 version_, SpdyConstants::SerializeFrameType(version_, type))); |
| 69 bool success = true; | 69 bool success = true; |
| 70 FlagsAndLength flags_length = | 70 FlagsAndLength flags_length = |
| 71 CreateFlagsAndLength(flags, capacity_ - framer.GetFrameHeaderSize()); | 71 CreateFlagsAndLength(flags, capacity_ - framer.GetFrameHeaderSize()); |
| 72 success &= WriteUInt16(kControlFlagMask | kSpdy3Version); | 72 success &= WriteUInt16(kControlFlagMask | kSpdy3Version); |
| 73 success &= WriteUInt16( | 73 success &= WriteUInt16( |
| 74 SpdyConstants::SerializeFrameType(framer.protocol_version(), type)); | 74 SpdyConstants::SerializeFrameType(framer.protocol_version(), type)); |
| 75 success &= WriteBytes(&flags_length, sizeof(flags_length)); | 75 success &= WriteBytes(&flags_length, sizeof(flags_length)); |
| 76 DCHECK_EQ(framer.GetFrameHeaderSize(), length()); | 76 DCHECK_EQ(framer.GetFrameHeaderSize(), length()); |
| 77 return success; | 77 return success; |
| 78 } | 78 } |
| 79 | 79 |
| 80 bool SpdyFrameBuilder::WriteDataFrameHeader(const SpdyFramer& framer, | 80 bool SpdyFrameBuilder::WriteDataFrameHeader(const SpdyFramer& framer, |
| 81 SpdyStreamId stream_id, | 81 SpdyStreamId stream_id, |
| 82 uint8_t flags) { | 82 uint8_t flags) { |
| 83 if (version_ == HTTP2) { | 83 return BeginNewFrame(framer, DATA, flags, stream_id); |
| 84 return BeginNewFrame(framer, DATA, flags, stream_id); | |
| 85 } | |
| 86 DCHECK_EQ(0u, stream_id & ~kStreamIdMask); | |
| 87 bool success = true; | |
| 88 success &= WriteUInt32(stream_id); | |
| 89 size_t length_field = capacity_ - framer.GetDataFrameMinimumSize(); | |
| 90 DCHECK_EQ(0u, length_field & ~static_cast<size_t>(kLengthMask)); | |
| 91 FlagsAndLength flags_length; | |
| 92 flags_length.length = base::HostToNet32(static_cast<uint32_t>(length_field)); | |
| 93 DCHECK_EQ(0, flags & ~kDataFlagsMask); | |
| 94 flags_length.flags[0] = flags; | |
| 95 success &= WriteBytes(&flags_length, sizeof(flags_length)); | |
| 96 DCHECK_EQ(framer.GetDataFrameMinimumSize(), length()); | |
| 97 return success; | |
| 98 } | 84 } |
| 99 | 85 |
| 100 bool SpdyFrameBuilder::BeginNewFrame(const SpdyFramer& framer, | 86 bool SpdyFrameBuilder::BeginNewFrame(const SpdyFramer& framer, |
| 101 SpdyFrameType type, | 87 SpdyFrameType type, |
| 102 uint8_t flags, | 88 uint8_t flags, |
| 103 SpdyStreamId stream_id) { | 89 SpdyStreamId stream_id) { |
| 104 DCHECK(SpdyConstants::IsValidFrameType( | 90 DCHECK(SpdyConstants::IsValidFrameType( |
| 105 version_, SpdyConstants::SerializeFrameType(version_, type))); | 91 version_, SpdyConstants::SerializeFrameType(version_, type))); |
| 106 DCHECK_EQ(0u, stream_id & ~kStreamIdMask); | 92 DCHECK_EQ(0u, stream_id & ~kStreamIdMask); |
| 107 DCHECK_EQ(HTTP2, framer.protocol_version()); | 93 DCHECK_EQ(HTTP2, framer.protocol_version()); |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 162 Seek(data_len); | 148 Seek(data_len); |
| 163 return true; | 149 return true; |
| 164 } | 150 } |
| 165 | 151 |
| 166 bool SpdyFrameBuilder::RewriteLength(const SpdyFramer& framer) { | 152 bool SpdyFrameBuilder::RewriteLength(const SpdyFramer& framer) { |
| 167 return OverwriteLength(framer, length_ - framer.GetFrameHeaderSize()); | 153 return OverwriteLength(framer, length_ - framer.GetFrameHeaderSize()); |
| 168 } | 154 } |
| 169 | 155 |
| 170 bool SpdyFrameBuilder::OverwriteLength(const SpdyFramer& framer, | 156 bool SpdyFrameBuilder::OverwriteLength(const SpdyFramer& framer, |
| 171 size_t length) { | 157 size_t length) { |
| 172 if (version_ == SPDY3) { | 158 DCHECK_GE(framer.GetFrameMaximumSize(), length); |
| 173 DCHECK_GE(framer.GetFrameMaximumSize() - framer.GetFrameMinimumSize(), | |
| 174 length); | |
| 175 } else { | |
| 176 DCHECK_GE(framer.GetFrameMaximumSize(), length); | |
| 177 } | |
| 178 bool success = false; | 159 bool success = false; |
| 179 const size_t old_length = length_; | 160 const size_t old_length = length_; |
| 180 | 161 |
| 181 if (version_ == SPDY3) { | 162 length_ = 0; |
| 182 FlagsAndLength flags_length = CreateFlagsAndLength( | 163 success = WriteUInt24(length); |
| 183 0, // We're not writing over the flags value anyway. | |
| 184 length); | |
| 185 | |
| 186 // Write into the correct location by temporarily faking the offset. | |
| 187 length_ = 5; // Offset at which the length field occurs. | |
| 188 success = WriteBytes(reinterpret_cast<char*>(&flags_length) + 1, | |
| 189 sizeof(flags_length) - 1); | |
| 190 } else { | |
| 191 length_ = 0; | |
| 192 success = WriteUInt24(length); | |
| 193 } | |
| 194 | 164 |
| 195 length_ = old_length; | 165 length_ = old_length; |
| 196 return success; | 166 return success; |
| 197 } | 167 } |
| 198 | 168 |
| 199 bool SpdyFrameBuilder::OverwriteFlags(const SpdyFramer& framer, uint8_t flags) { | 169 bool SpdyFrameBuilder::OverwriteFlags(const SpdyFramer& framer, uint8_t flags) { |
| 200 DCHECK_EQ(HTTP2, framer.protocol_version()); | 170 DCHECK_EQ(HTTP2, framer.protocol_version()); |
| 201 bool success = false; | 171 bool success = false; |
| 202 const size_t old_length = length_; | 172 const size_t old_length = length_; |
| 203 // Flags are the fifth octet in the frame prefix. | 173 // Flags are the fifth octet in the frame prefix. |
| (...skipping 11 matching lines...) Expand all Loading... |
| 215 | 185 |
| 216 if (offset_ + length_ + length > capacity_) { | 186 if (offset_ + length_ + length > capacity_) { |
| 217 DCHECK(false); | 187 DCHECK(false); |
| 218 return false; | 188 return false; |
| 219 } | 189 } |
| 220 | 190 |
| 221 return true; | 191 return true; |
| 222 } | 192 } |
| 223 | 193 |
| 224 } // namespace net | 194 } // namespace net |
| OLD | NEW |