SPDY: add SETTINGS_MINOR_VERSION

This commit is contained in:
Jeff Pinner 2013-12-14 10:27:14 -08:00
parent b0da45db7a
commit 78f3ee3396
5 changed files with 29 additions and 14 deletions

View File

@ -57,7 +57,7 @@ public class DefaultSpdySettingsFrame implements SpdySettingsFrame {
@Override @Override
public SpdySettingsFrame setValue(int id, int value, boolean persistValue, boolean persisted) { public SpdySettingsFrame setValue(int id, int value, boolean persistValue, boolean persisted) {
if (id <= 0 || id > SpdyCodecUtil.SPDY_SETTINGS_MAX_ID) { if (id < 0 || id > SpdyCodecUtil.SPDY_SETTINGS_MAX_ID) {
throw new IllegalArgumentException("Setting ID is not valid: " + id); throw new IllegalArgumentException("Setting ID is not valid: " + id);
} }
Integer key = Integer.valueOf(id); Integer key = Integer.valueOf(id);

View File

@ -191,14 +191,6 @@ public class SpdyFrameDecoder extends ByteToMessageDecoder {
int value = getSignedInt(buffer, buffer.readerIndex() + 4); int value = getSignedInt(buffer, buffer.readerIndex() + 4);
buffer.skipBytes(8); buffer.skipBytes(8);
// Check for invalid ID -- avoid IllegalArgumentException in setValue
if (ID == 0) {
state = State.FRAME_ERROR;
spdySettingsFrame = null;
fireInvalidFrameException(ctx);
return;
}
if (!spdySettingsFrame.isSet(ID)) { if (!spdySettingsFrame.isSet(ID)) {
boolean persistVal = (ID_flags & SPDY_SETTINGS_PERSIST_VALUE) != 0; boolean persistVal = (ID_flags & SPDY_SETTINGS_PERSIST_VALUE) != 0;
boolean persisted = (ID_flags & SPDY_SETTINGS_PERSISTED) != 0; boolean persisted = (ID_flags & SPDY_SETTINGS_PERSISTED) != 0;

View File

@ -60,6 +60,7 @@ public class SpdySessionHandler extends ChannelHandlerAdapter {
private ChannelFutureListener closeSessionFutureListener; private ChannelFutureListener closeSessionFutureListener;
private final boolean server; private final boolean server;
private final int minorVersion;
private final boolean sessionFlowControl; private final boolean sessionFlowControl;
/** /**
@ -76,6 +77,7 @@ public class SpdySessionHandler extends ChannelHandlerAdapter {
throw new NullPointerException("version"); throw new NullPointerException("version");
} }
this.server = server; this.server = server;
minorVersion = version.getMinorVersion();
sessionFlowControl = version.useSessionFlowControl(); sessionFlowControl = version.useSessionFlowControl();
} }
@ -294,6 +296,13 @@ public class SpdySessionHandler extends ChannelHandlerAdapter {
SpdySettingsFrame spdySettingsFrame = (SpdySettingsFrame) msg; SpdySettingsFrame spdySettingsFrame = (SpdySettingsFrame) msg;
int settingsMinorVersion = spdySettingsFrame.getValue(SpdySettingsFrame.SETTINGS_MINOR_VERSION);
if (settingsMinorVersion >= 0 && settingsMinorVersion != minorVersion) {
// Settings frame had the wrong minor version
issueSessionError(ctx, SpdySessionStatus.PROTOCOL_ERROR);
return;
}
int newConcurrentStreams = int newConcurrentStreams =
spdySettingsFrame.getValue(SpdySettingsFrame.SETTINGS_MAX_CONCURRENT_STREAMS); spdySettingsFrame.getValue(SpdySettingsFrame.SETTINGS_MAX_CONCURRENT_STREAMS);
if (newConcurrentStreams >= 0) { if (newConcurrentStreams >= 0) {
@ -574,6 +583,13 @@ public class SpdySessionHandler extends ChannelHandlerAdapter {
SpdySettingsFrame spdySettingsFrame = (SpdySettingsFrame) msg; SpdySettingsFrame spdySettingsFrame = (SpdySettingsFrame) msg;
int settingsMinorVersion = spdySettingsFrame.getValue(SpdySettingsFrame.SETTINGS_MINOR_VERSION);
if (settingsMinorVersion >= 0 && settingsMinorVersion != minorVersion) {
// Settings frame had the wrong minor version
promise.setFailure(PROTOCOL_EXCEPTION);
return;
}
int newConcurrentStreams = int newConcurrentStreams =
spdySettingsFrame.getValue(SpdySettingsFrame.SETTINGS_MAX_CONCURRENT_STREAMS); spdySettingsFrame.getValue(SpdySettingsFrame.SETTINGS_MAX_CONCURRENT_STREAMS);
if (newConcurrentStreams >= 0) { if (newConcurrentStreams >= 0) {

View File

@ -22,6 +22,7 @@ import java.util.Set;
*/ */
public interface SpdySettingsFrame extends SpdyFrame { public interface SpdySettingsFrame extends SpdyFrame {
int SETTINGS_MINOR_VERSION = 0;
int SETTINGS_UPLOAD_BANDWIDTH = 1; int SETTINGS_UPLOAD_BANDWIDTH = 1;
int SETTINGS_DOWNLOAD_BANDWIDTH = 2; int SETTINGS_DOWNLOAD_BANDWIDTH = 2;
int SETTINGS_ROUND_TRIP_TIME = 3; int SETTINGS_ROUND_TRIP_TIME = 3;
@ -50,7 +51,7 @@ public interface SpdySettingsFrame extends SpdyFrame {
/** /**
* Sets the value of the setting ID. * Sets the value of the setting ID.
* The ID must be positive and cannot exceed 16777215. * The ID cannot be negative and cannot exceed 16777215.
*/ */
SpdySettingsFrame setValue(int id, int value); SpdySettingsFrame setValue(int id, int value);
@ -58,7 +59,7 @@ public interface SpdySettingsFrame extends SpdyFrame {
* Sets the value of the setting ID. * Sets the value of the setting ID.
* Sets if the setting should be persisted (should only be set by the server). * Sets if the setting should be persisted (should only be set by the server).
* Sets if the setting is persisted (should only be set by the client). * Sets if the setting is persisted (should only be set by the client).
* The ID must be positive and cannot exceed 16777215. * The ID cannot be negative and cannot exceed 16777215.
*/ */
SpdySettingsFrame setValue(int id, int value, boolean persistVal, boolean persisted); SpdySettingsFrame setValue(int id, int value, boolean persistVal, boolean persisted);

View File

@ -16,14 +16,16 @@
package io.netty.handler.codec.spdy; package io.netty.handler.codec.spdy;
public enum SpdyVersion { public enum SpdyVersion {
SPDY_3 (3, false), SPDY_3 (3, 0, false),
SPDY_3_1 (3, true); SPDY_3_1 (3, 1, true);
private final int version; private final int version;
private final int minorVersion;
private final boolean sessionFlowControl; private final boolean sessionFlowControl;
private SpdyVersion(int version, boolean sessionFlowControl) { private SpdyVersion(int version, int minorVersion, boolean sessionFlowControl) {
this.version = version; this.version = version;
this.minorVersion = minorVersion;
this.sessionFlowControl = sessionFlowControl; this.sessionFlowControl = sessionFlowControl;
} }
@ -31,6 +33,10 @@ public enum SpdyVersion {
return version; return version;
} }
int getMinorVersion() {
return minorVersion;
}
boolean useSessionFlowControl() { boolean useSessionFlowControl() {
return sessionFlowControl; return sessionFlowControl;
} }