< 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 >