< prev index next >
src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/Http2Connection.java
Print this page
*** 1,7 ****
/*
! * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
--- 1,7 ----
/*
! * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
*** 556,565 ****
--- 556,574 ----
}
connection.close();
}
/**
+ * Streams initiated by a client MUST use odd-numbered stream
+ * identifiers; those initiated by the server MUST use even-numbered
+ * stream identifiers.
+ */
+ private static final boolean isSeverInitiatedStream(int streamid) {
+ return (streamid & 0x1) == 0;
+ }
+
+ /**
* Handles stream 0 (common) frames that apply to whole connection and passes
* other stream specific frames to that Stream object.
*
* Invokes Stream.incoming() which is expected to process frame without
* blocking.
*** 600,614 ****
// connection-level HPACK decoding state
HeaderDecoder decoder = new LoggingHeaderDecoder(new HeaderDecoder());
decodeHeaders((HeaderFrame) frame, decoder);
}
! int sid = frame.streamid();
! if (sid >= nextstreamid && !(frame instanceof ResetFrame)) {
// otherwise the stream has already been reset/closed
resetStream(streamid, ResetFrame.PROTOCOL_ERROR);
}
return;
}
if (frame instanceof PushPromiseFrame) {
PushPromiseFrame pp = (PushPromiseFrame)frame;
handlePushPromise(stream, pp);
--- 609,632 ----
// connection-level HPACK decoding state
HeaderDecoder decoder = new LoggingHeaderDecoder(new HeaderDecoder());
decodeHeaders((HeaderFrame) frame, decoder);
}
! if (!(frame instanceof ResetFrame)) {
! if (isSeverInitiatedStream(streamid)) {
! if (streamid < nextPushStream) {
! // trailing data on a cancelled push promise stream,
! // reset will already have been sent, ignore
! Log.logTrace("Ignoring cancelled push promise frame " + frame);
! } else {
! resetStream(streamid, ResetFrame.PROTOCOL_ERROR);
! }
! } else if (streamid >= nextstreamid) {
// otherwise the stream has already been reset/closed
resetStream(streamid, ResetFrame.PROTOCOL_ERROR);
}
+ }
return;
}
if (frame instanceof PushPromiseFrame) {
PushPromiseFrame pp = (PushPromiseFrame)frame;
handlePushPromise(stream, pp);
< prev index next >