| 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);
|
| }
|
|
|