Index: net/spdy/spdy_protocol.cc |
diff --git a/net/spdy/spdy_protocol.cc b/net/spdy/spdy_protocol.cc |
index b9e458a8a83dd2f8d1beebd31ee551de196cf26e..a5f3a1c679198be225f1bb416f2b66937001f18f 100644 |
--- a/net/spdy/spdy_protocol.cc |
+++ b/net/spdy/spdy_protocol.cc |
@@ -27,6 +27,151 @@ SpdyDataIR::SpdyDataIR(SpdyStreamId stream_id) |
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; |
+ } |
+} |
+ |
+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; |
+ default: |
+ return DATA; |
+ } |
+ 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; |
+ default: |
+ return DATA; |
+ } |
+ } |
+ 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: |
+ 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: |
+ return -1; |
+ } |
+ } |
+} |
+ |
void SpdyDataIR::Visit(SpdyFrameVisitor* visitor) const { |
return visitor->VisitData(*this); |
} |