Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1138)

Unified Diff: net/spdy/spdy_protocol.cc

Issue 202403002: Land recent SPDY changes (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Sync and rebase. Back out commits included for trybot benefit, but separately landed upstream. Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/spdy/spdy_protocol.h ('k') | net/spdy/spdy_session.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
}
« no previous file with comments | « net/spdy/spdy_protocol.h ('k') | net/spdy/spdy_session.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698