in src/main/java/com/twitter/http2/HttpFrameDecoder.java [526:584]
private static boolean isValidFrameHeader(int length, short type, byte flags, int streamId) {
if (length > HTTP_MAX_LENGTH) {
return false;
}
int minLength;
switch (type) {
case HTTP_DATA_FRAME:
if (hasFlag(flags, HTTP_FLAG_PADDED)) {
minLength = 1;
} else {
minLength = 0;
}
return length >= minLength && streamId != 0;
case HTTP_HEADERS_FRAME:
if (hasFlag(flags, HTTP_FLAG_PADDED)) {
minLength = 1;
} else {
minLength = 0;
}
if (hasFlag(flags, HTTP_FLAG_PRIORITY)) {
minLength += 5;
}
return length >= minLength && streamId != 0;
case HTTP_PRIORITY_FRAME:
return length == 5 && streamId != 0;
case HTTP_RST_STREAM_FRAME:
return length == 4 && streamId != 0;
case HTTP_SETTINGS_FRAME:
boolean lengthValid = hasFlag(flags, HTTP_FLAG_ACK) ? length == 0 : (length % 6) == 0;
return lengthValid && streamId == 0;
case HTTP_PUSH_PROMISE_FRAME:
if (hasFlag(flags, HTTP_FLAG_PADDED)) {
minLength = 5;
} else {
minLength = 4;
}
return length >= minLength && streamId != 0;
case HTTP_PING_FRAME:
return length == 8 && streamId == 0;
case HTTP_GOAWAY_FRAME:
return length >= 8 && streamId == 0;
case HTTP_WINDOW_UPDATE_FRAME:
return length == 4;
case HTTP_CONTINUATION_FRAME:
return false;
default:
return true;
}
}