Index: net/spdy/spdy_protocol.cc |
diff --git a/net/spdy/spdy_protocol.cc b/net/spdy/spdy_protocol.cc |
index 6e2ddfa7e0422852ee282ab6e83856502b5cdec2..02c74ef3bd178f5d287bc525966c6e071b8a4974 100644 |
--- a/net/spdy/spdy_protocol.cc |
+++ b/net/spdy/spdy_protocol.cc |
@@ -12,15 +12,295 @@ SpdyFrameWithNameValueBlockIR::SpdyFrameWithNameValueBlockIR( |
SpdyFrameWithNameValueBlockIR::~SpdyFrameWithNameValueBlockIR() {} |
SpdyDataIR::SpdyDataIR(SpdyStreamId stream_id, const base::StringPiece& data) |
- : SpdyFrameWithFinIR(stream_id) { |
+ : SpdyFrameWithFinIR(stream_id), |
+ pad_low_(false), |
+ pad_high_(false), |
+ padding_payload_len_(0) { |
SetDataDeep(data); |
} |
SpdyDataIR::SpdyDataIR(SpdyStreamId stream_id) |
- : SpdyFrameWithFinIR(stream_id) {} |
+ : SpdyFrameWithFinIR(stream_id), |
+ pad_low_(false), |
+ pad_high_(false), |
+ padding_payload_len_(0) {} |
SpdyDataIR::~SpdyDataIR() {} |
+bool SpdyConstants::IsValidFrameType(SpdyMajorVersion version, |
+ int frame_type_field) { |
+ switch (version) { |
+ case SPDY2: |
+ case SPDY3: |
+ // SYN_STREAM is the first valid frame. |
+ if (frame_type_field < SerializeFrameType(version, SYN_STREAM)) { |
+ return false; |
+ } |
+ |
+ // WINDOW_UPDATE is the last valid frame. |
+ if (frame_type_field > SerializeFrameType(version, WINDOW_UPDATE)) { |
+ return false; |
+ } |
+ |
+ // The valid range is non-contiguous. |
+ if (frame_type_field == NOOP) { |
+ return false; |
+ } |
+ |
+ return true; |
+ case SPDY4: |
+ // DATA is the first valid frame. |
+ if (frame_type_field < SerializeFrameType(version, DATA)) { |
+ return false; |
+ } |
+ |
+ // BLOCKED is the last valid frame. |
+ if (frame_type_field > SerializeFrameType(version, BLOCKED)) { |
+ return false; |
+ } |
+ |
+ return true; |
+ } |
+ |
+ LOG(DFATAL) << "Unhandled SPDY version " << version; |
+ return false; |
+} |
+ |
+SpdyFrameType SpdyConstants::ParseFrameType(SpdyMajorVersion version, |
+ int frame_type_field) { |
+ switch (version) { |
+ case SPDY2: |
+ case SPDY3: |
+ switch (frame_type_field) { |
+ case 1: |
+ return SYN_STREAM; |
+ case 2: |
+ return SYN_REPLY; |
+ case 3: |
+ return RST_STREAM; |
+ case 4: |
+ return SETTINGS; |
+ case 6: |
+ return PING; |
+ case 7: |
+ return GOAWAY; |
+ case 8: |
+ return HEADERS; |
+ case 9: |
+ return WINDOW_UPDATE; |
+ } |
+ break; |
+ case SPDY4: |
+ switch (frame_type_field) { |
+ case 0: |
+ return DATA; |
+ case 1: |
+ return HEADERS; |
+ // TODO(hkhalil): Add PRIORITY. |
+ case 3: |
+ return RST_STREAM; |
+ case 4: |
+ return SETTINGS; |
+ case 5: |
+ return PUSH_PROMISE; |
+ case 6: |
+ return PING; |
+ case 7: |
+ return GOAWAY; |
+ case 8: |
+ return WINDOW_UPDATE; |
+ case 9: |
+ return CONTINUATION; |
+ case 10: |
+ return BLOCKED; |
+ } |
+ break; |
+ } |
+ |
+ LOG(DFATAL) << "Unhandled frame type " << frame_type_field; |
+ return DATA; |
+} |
+ |
+int SpdyConstants::SerializeFrameType(SpdyMajorVersion version, |
+ SpdyFrameType frame_type) { |
+ switch (version) { |
+ case SPDY2: |
+ case SPDY3: |
+ switch (frame_type) { |
+ case SYN_STREAM: |
+ return 1; |
+ case SYN_REPLY: |
+ return 2; |
+ case RST_STREAM: |
+ return 3; |
+ case SETTINGS: |
+ return 4; |
+ case PING: |
+ return 6; |
+ case GOAWAY: |
+ return 7; |
+ case HEADERS: |
+ return 8; |
+ case WINDOW_UPDATE: |
+ return 9; |
+ default: |
+ LOG(DFATAL) << "Serializing unhandled frame type " << frame_type; |
+ return -1; |
+ } |
+ case SPDY4: |
+ switch (frame_type) { |
+ case DATA: |
+ return 0; |
+ case HEADERS: |
+ return 1; |
+ // TODO(hkhalil): Add PRIORITY. |
+ case RST_STREAM: |
+ return 3; |
+ case SETTINGS: |
+ return 4; |
+ case PUSH_PROMISE: |
+ return 5; |
+ case PING: |
+ return 6; |
+ case GOAWAY: |
+ return 7; |
+ case WINDOW_UPDATE: |
+ return 8; |
+ case CONTINUATION: |
+ return 9; |
+ case BLOCKED: |
+ return 10; |
+ default: |
+ LOG(DFATAL) << "Serializing unhandled frame type " << frame_type; |
+ return -1; |
+ } |
+ } |
+ |
+ LOG(DFATAL) << "Unhandled SPDY version " << version; |
+ return -1; |
+} |
+ |
+bool SpdyConstants::IsValidSettingId(SpdyMajorVersion version, |
+ int setting_id_field) { |
+ switch (version) { |
+ case SPDY2: |
+ case SPDY3: |
+ // UPLOAD_BANDWIDTH is the first valid setting id. |
+ if (setting_id_field < |
+ SerializeSettingId(version, SETTINGS_UPLOAD_BANDWIDTH)) { |
+ return false; |
+ } |
+ |
+ // INITIAL_WINDOW_SIZE is the last valid setting id. |
+ if (setting_id_field > |
+ SerializeSettingId(version, SETTINGS_INITIAL_WINDOW_SIZE)) { |
+ return false; |
+ } |
+ |
+ return true; |
+ case SPDY4: |
+ // HEADER_TABLE_SIZE is the first valid setting id. |
+ if (setting_id_field < |
+ SerializeSettingId(version, SETTINGS_HEADER_TABLE_SIZE)) { |
+ return false; |
+ } |
+ |
+ // INITIAL_WINDOW_SIZE is the last valid setting id. |
+ if (setting_id_field > |
+ SerializeSettingId(version, SETTINGS_INITIAL_WINDOW_SIZE)) { |
+ return false; |
+ } |
+ |
+ return true; |
+ } |
+ |
+ LOG(DFATAL) << "Unhandled SPDY version " << version; |
+ return false; |
+} |
+ |
+SpdySettingsIds SpdyConstants::ParseSettingId(SpdyMajorVersion version, |
+ int setting_id_field) { |
+ switch (version) { |
+ case SPDY2: |
+ case SPDY3: |
+ switch (setting_id_field) { |
+ case 1: |
+ return SETTINGS_UPLOAD_BANDWIDTH; |
+ case 2: |
+ return SETTINGS_DOWNLOAD_BANDWIDTH; |
+ case 3: |
+ return SETTINGS_ROUND_TRIP_TIME; |
+ case 4: |
+ return SETTINGS_MAX_CONCURRENT_STREAMS; |
+ case 5: |
+ return SETTINGS_CURRENT_CWND; |
+ case 6: |
+ return SETTINGS_DOWNLOAD_RETRANS_RATE; |
+ case 7: |
+ return SETTINGS_INITIAL_WINDOW_SIZE; |
+ } |
+ break; |
+ case SPDY4: |
+ switch (setting_id_field) { |
+ case 1: |
+ return SETTINGS_HEADER_TABLE_SIZE; |
+ case 2: |
+ return SETTINGS_ENABLE_PUSH; |
+ case 3: |
+ return SETTINGS_MAX_CONCURRENT_STREAMS; |
+ case 4: |
+ return SETTINGS_INITIAL_WINDOW_SIZE; |
+ } |
+ break; |
+ } |
+ |
+ LOG(DFATAL) << "Unhandled setting ID " << setting_id_field; |
+ return SETTINGS_UPLOAD_BANDWIDTH; |
+} |
+ |
+int SpdyConstants::SerializeSettingId(SpdyMajorVersion version, |
+ SpdySettingsIds id) { |
+ switch (version) { |
+ case SPDY2: |
+ case SPDY3: |
+ switch (id) { |
+ case SETTINGS_UPLOAD_BANDWIDTH: |
+ return 1; |
+ case SETTINGS_DOWNLOAD_BANDWIDTH: |
+ return 2; |
+ case SETTINGS_ROUND_TRIP_TIME: |
+ return 3; |
+ case SETTINGS_MAX_CONCURRENT_STREAMS: |
+ return 4; |
+ case SETTINGS_CURRENT_CWND: |
+ return 5; |
+ case SETTINGS_DOWNLOAD_RETRANS_RATE: |
+ return 6; |
+ case SETTINGS_INITIAL_WINDOW_SIZE: |
+ return 7; |
+ default: |
+ LOG(DFATAL) << "Serializing unhandled setting id " << id; |
+ return -1; |
+ } |
+ case SPDY4: |
+ switch (id) { |
+ case SETTINGS_HEADER_TABLE_SIZE: |
+ return 1; |
+ case SETTINGS_ENABLE_PUSH: |
+ return 2; |
+ case SETTINGS_MAX_CONCURRENT_STREAMS: |
+ return 3; |
+ case SETTINGS_INITIAL_WINDOW_SIZE: |
+ return 4; |
+ default: |
+ LOG(DFATAL) << "Serializing unhandled setting id " << id; |
+ return -1; |
+ } |
+ } |
+ LOG(DFATAL) << "Unhandled SPDY version " << version; |
+ return -1; |
+} |
+ |
void SpdyDataIR::Visit(SpdyFrameVisitor* visitor) const { |
return visitor->VisitData(*this); |
} |