SPDY: add SETTINGS_MINOR_VERSION

This commit is contained in:
Jeff Pinner 2013-12-13 12:09:45 -08:00
parent f81b65a0ea
commit d4bdcefe17
5 changed files with 29 additions and 14 deletions

View File

@ -52,7 +52,7 @@ public class DefaultSpdySettingsFrame implements SpdySettingsFrame {
}
public void 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);
}
Integer key = id;

View File

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

View File

@ -62,6 +62,7 @@ public class SpdySessionHandler extends SimpleChannelUpstreamHandler
private volatile ChannelFutureListener closeSessionFutureListener;
private final boolean server;
private final int minorVersion;
private final boolean sessionFlowControl;
/**
@ -78,6 +79,7 @@ public class SpdySessionHandler extends SimpleChannelUpstreamHandler
throw new NullPointerException("spdyVersion");
}
this.server = server;
minorVersion = spdyVersion.getMinorVersion();
sessionFlowControl = spdyVersion.useSessionFlowControl();
}
@ -296,6 +298,13 @@ public class SpdySessionHandler extends SimpleChannelUpstreamHandler
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, e.getChannel(), e.getRemoteAddress(), SpdySessionStatus.PROTOCOL_ERROR);
return;
}
int newConcurrentStreams =
spdySettingsFrame.getValue(SpdySettingsFrame.SETTINGS_MAX_CONCURRENT_STREAMS);
if (newConcurrentStreams >= 0) {
@ -584,6 +593,13 @@ public class SpdySessionHandler extends SimpleChannelUpstreamHandler
SpdySettingsFrame spdySettingsFrame = (SpdySettingsFrame) msg;
int settingsMinorVersion = spdySettingsFrame.getValue(SpdySettingsFrame.SETTINGS_MINOR_VERSION);
if (settingsMinorVersion >= 0 && settingsMinorVersion != minorVersion) {
// Settings frame had the wrong minor version
e.getFuture().setFailure(PROTOCOL_EXCEPTION);
return;
}
int newConcurrentStreams =
spdySettingsFrame.getValue(SpdySettingsFrame.SETTINGS_MAX_CONCURRENT_STREAMS);
if (newConcurrentStreams >= 0) {

View File

@ -22,6 +22,7 @@ import java.util.Set;
*/
public interface SpdySettingsFrame extends SpdyFrame {
int SETTINGS_MINOR_VERSION = 0;
int SETTINGS_UPLOAD_BANDWIDTH = 1;
int SETTINGS_DOWNLOAD_BANDWIDTH = 2;
int SETTINGS_ROUND_TRIP_TIME = 3;
@ -50,7 +51,7 @@ public interface SpdySettingsFrame extends SpdyFrame {
/**
* 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.
*/
void setValue(int id, int value);
@ -58,7 +59,7 @@ public interface SpdySettingsFrame extends SpdyFrame {
* 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 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.
*/
void setValue(int id, int value, boolean persistVal, boolean persisted);

View File

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