This is an automated email from the ASF dual-hosted git repository. markt pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/tomcat.git
commit bd752fe8f1b8759748989437b1d29e1451227b0d Author: Mark Thomas <ma...@apache.org> AuthorDate: Mon Oct 2 12:15:41 2023 +0100 Remove the internal plumbing that supports HTTP/2 server push --- java/org/apache/catalina/connector/Response.java | 14 ---- .../webresources/AbstractFileResourceSet.java | 13 ++-- java/org/apache/coyote/AbstractProcessor.java | 34 ---------- java/org/apache/coyote/ActionCode.java | 10 --- java/org/apache/coyote/LocalStrings.properties | 1 - java/org/apache/coyote/LocalStrings_fr.properties | 1 - java/org/apache/coyote/LocalStrings_ja.properties | 1 - java/org/apache/coyote/LocalStrings_ko.properties | 1 - .../apache/coyote/LocalStrings_zh_CN.properties | 1 - .../coyote/http2/ConnectionSettingsBase.java | 3 +- .../coyote/http2/Http2AsyncUpgradeHandler.java | 7 +- .../apache/coyote/http2/Http2UpgradeHandler.java | 74 ++-------------------- .../apache/coyote/http2/LocalStrings.properties | 1 - .../apache/coyote/http2/LocalStrings_fr.properties | 1 - .../apache/coyote/http2/LocalStrings_ja.properties | 1 - .../apache/coyote/http2/LocalStrings_ko.properties | 1 - .../coyote/http2/LocalStrings_zh_CN.properties | 1 - java/org/apache/coyote/http2/Stream.java | 56 ++-------------- java/org/apache/coyote/http2/StreamProcessor.java | 17 ----- .../apache/coyote/http2/StreamStateMachine.java | 5 -- test/org/apache/coyote/http2/Http2TestBase.java | 8 --- .../apache/coyote/http2/TestHttp2Section_6_5.java | 2 - .../org/apache/coyote/http2/TesterHttp2Parser.java | 50 --------------- 23 files changed, 24 insertions(+), 279 deletions(-) diff --git a/java/org/apache/catalina/connector/Response.java b/java/org/apache/catalina/connector/Response.java index bc6cf0bba8..e2e983b7f6 100644 --- a/java/org/apache/catalina/connector/Response.java +++ b/java/org/apache/catalina/connector/Response.java @@ -139,12 +139,6 @@ public class Response implements HttpServletResponse { protected final CharChunk redirectURLCC = new CharChunk(); - /* - * Not strictly required but it makes generating HTTP/2 push requests a lot easier if these are retained until the - * response is recycled. - */ - private final List<Cookie> cookies = new ArrayList<>(); - private HttpServletResponse applicationResponse = null; @@ -183,7 +177,6 @@ public class Response implements HttpServletResponse { */ public void recycle() { - cookies.clear(); outputBuffer.recycle(); usingOutputStream = false; usingWriter = false; @@ -212,11 +205,6 @@ public class Response implements HttpServletResponse { } - public List<Cookie> getCookies() { - return cookies; - } - - // ------------------------------------------------------- Response Methods /** @@ -896,8 +884,6 @@ public class Response implements HttpServletResponse { return; } - cookies.add(cookie); - String header = generateCookieString(cookie); // if we reached here, no exception, cookie is valid addHeader("Set-Cookie", header, getContext().getCookieProcessor().getCharset()); diff --git a/java/org/apache/catalina/webresources/AbstractFileResourceSet.java b/java/org/apache/catalina/webresources/AbstractFileResourceSet.java index 7a81b943b0..bdf51a5821 100644 --- a/java/org/apache/catalina/webresources/AbstractFileResourceSet.java +++ b/java/org/apache/catalina/webresources/AbstractFileResourceSet.java @@ -99,13 +99,12 @@ public abstract class AbstractFileResourceSet extends AbstractResourceSet { return null; } - // Ensure that the file is not outside the fileBase. This should not be - // possible for standard requests (the request is normalized early in - // the request processing) but might be possible for some access via the - // Servlet API (RequestDispatcher, HTTP/2 push etc.) therefore these - // checks are retained as an additional safety measure - // absoluteBase has been normalized so absPath needs to be normalized as - // well. + /* + * Ensure that the file is not outside the fileBase. This should not be possible for standard requests (the + * request is normalized early in the request processing) but might be possible for some access via the Servlet + * API (e.g. RequestDispatcher) therefore these checks are retained as an additional safety measure absoluteBase + * has been normalized so absPath needs to be normalized as well. + */ String absPath = normalize(file.getAbsolutePath()); if (absPath == null || absoluteBase.length() > absPath.length()) { return null; diff --git a/java/org/apache/coyote/AbstractProcessor.java b/java/org/apache/coyote/AbstractProcessor.java index e1f2347da4..4e26dca6e5 100644 --- a/java/org/apache/coyote/AbstractProcessor.java +++ b/java/org/apache/coyote/AbstractProcessor.java @@ -608,17 +608,6 @@ public abstract class AbstractProcessor extends AbstractProcessorLight implement break; } - // Servlet 4.0 Push requests - case IS_PUSH_SUPPORTED: { - AtomicBoolean result = (AtomicBoolean) param; - result.set(isPushSupported()); - break; - } - case PUSH_REQUEST: { - doPush((Request) param); - break; - } - // Servlet 4.0 Trailers case IS_TRAILER_FIELDS_READY: { AtomicBoolean result = (AtomicBoolean) param; @@ -930,29 +919,6 @@ public abstract class AbstractProcessor extends AbstractProcessorLight implement } - /** - * Protocols that support push should override this method and return {@code - * true}. - * - * @return {@code true} if push is supported by this processor, otherwise {@code false}. - */ - protected boolean isPushSupported() { - return false; - } - - - /** - * Process a push. Processors that support push should override this method and process the provided token. - * - * @param pushTarget Contains all the information necessary for the Processor to process the push request - * - * @throws UnsupportedOperationException if the protocol does not support push - */ - protected void doPush(Request pushTarget) { - throw new UnsupportedOperationException(sm.getString("abstractProcessor.pushrequest.notsupported")); - } - - protected abstract boolean isTrailerFieldsReady(); diff --git a/java/org/apache/coyote/ActionCode.java b/java/org/apache/coyote/ActionCode.java index 308d3b3eee..94c2933353 100644 --- a/java/org/apache/coyote/ActionCode.java +++ b/java/org/apache/coyote/ActionCode.java @@ -232,16 +232,6 @@ public enum ActionCode { */ DISPATCH_EXECUTE, - /** - * Is server push supported and allowed for the current request? - */ - IS_PUSH_SUPPORTED, - - /** - * Push a request on behalf of the client of the current request. - */ - PUSH_REQUEST, - /** * Are the request trailer fields ready to be read? Note that this returns true if it is known that request trailer * fields are not supported so an empty collection of trailers can then be read. diff --git a/java/org/apache/coyote/LocalStrings.properties b/java/org/apache/coyote/LocalStrings.properties index e99009cf3b..36198bb0aa 100644 --- a/java/org/apache/coyote/LocalStrings.properties +++ b/java/org/apache/coyote/LocalStrings.properties @@ -30,7 +30,6 @@ abstractProcessor.fallToDebug=\n\ abstractProcessor.hostInvalid=The host [{0}] is not valid abstractProcessor.httpupgrade.notsupported=HTTP upgrade is not supported by this protocol abstractProcessor.noExecute=Unable to transfer processing to a container thread because this Processor is not currently associated with a SocketWrapper -abstractProcessor.pushrequest.notsupported=Server push requests are not supported by this protocol abstractProcessor.setErrorState=Error state [{0}] reported while processing request abstractProcessor.socket.ssl=Exception getting SSL attributes diff --git a/java/org/apache/coyote/LocalStrings_fr.properties b/java/org/apache/coyote/LocalStrings_fr.properties index 73186e386b..f036c73130 100644 --- a/java/org/apache/coyote/LocalStrings_fr.properties +++ b/java/org/apache/coyote/LocalStrings_fr.properties @@ -30,7 +30,6 @@ abstractProcessor.fallToDebug=\n\ abstractProcessor.hostInvalid=L''hôte [{0}] n''est pas valide abstractProcessor.httpupgrade.notsupported=La promotion (upgrade) HTTP n'est pas supporté par ce protocole abstractProcessor.noExecute=Impossible de transférer l'exécution à un thread du conteneur parce que ce processeur n'est pas associé à un SocketWrapper -abstractProcessor.pushrequest.notsupported=Le requêtes push du serveur ne sont pas supportées par ce protocole abstractProcessor.setErrorState=Etat d''erreur [{0}] lors du traitement de la requête abstractProcessor.socket.ssl=Exception lors de l'obtention des attributs SSL diff --git a/java/org/apache/coyote/LocalStrings_ja.properties b/java/org/apache/coyote/LocalStrings_ja.properties index d3b3d93fd6..0babfe65d5 100644 --- a/java/org/apache/coyote/LocalStrings_ja.properties +++ b/java/org/apache/coyote/LocalStrings_ja.properties @@ -30,7 +30,6 @@ abstractProcessor.fallToDebug=\n\ abstractProcessor.hostInvalid=ホスト名 [{0}] は無効です。 abstractProcessor.httpupgrade.notsupported=このプロトコルは HTTP アップグレードに対応していません。 abstractProcessor.noExecute=このプロセッサが現在 SocketWrapper に関連付けられていないため、コンテナスレッドに処理を転送できません -abstractProcessor.pushrequest.notsupported=このプロトコルはサーバープッシュの要求に対応していません。 abstractProcessor.setErrorState=リクエストの処理中にエラー状態[{0}]が報告されました abstractProcessor.socket.ssl=SSL属性取得時の例外 diff --git a/java/org/apache/coyote/LocalStrings_ko.properties b/java/org/apache/coyote/LocalStrings_ko.properties index b57ade3185..400fd84d69 100644 --- a/java/org/apache/coyote/LocalStrings_ko.properties +++ b/java/org/apache/coyote/LocalStrings_ko.properties @@ -30,7 +30,6 @@ abstractProcessor.fallToDebug=\n\ abstractProcessor.hostInvalid=호스트 [{0}]은(는) 유효하지 않습니다. abstractProcessor.httpupgrade.notsupported=HTTP 업그레이드는 이 프로토콜에 의해 지원되지 않습니다. abstractProcessor.noExecute=이 프로세서가 현재 SocketWrapper와 연관되어 있지 않기 때문에, 처리 작업을 컨테이너 쓰레드로 이관할 수 없습니다. -abstractProcessor.pushrequest.notsupported=이 프로토콜은 서버 push 요청들을 지원하지 않습니다. abstractProcessor.setErrorState=요청 처리 중 오류 상태 [{0}]이(가) 보고됨. abstractProcessor.socket.ssl=SSL 속성들을 얻으려는 중 예외 발생 diff --git a/java/org/apache/coyote/LocalStrings_zh_CN.properties b/java/org/apache/coyote/LocalStrings_zh_CN.properties index a5c07b33b7..120b2e6ded 100644 --- a/java/org/apache/coyote/LocalStrings_zh_CN.properties +++ b/java/org/apache/coyote/LocalStrings_zh_CN.properties @@ -30,7 +30,6 @@ abstractProcessor.fallToDebug=\n\ abstractProcessor.hostInvalid=[{0}] 是无效主机 abstractProcessor.httpupgrade.notsupported=此协议不支持HTTP升级(upgrade)。 abstractProcessor.noExecute=无法将处理传输到容器线程,因为此处理器当前未与SocketWrapper关联 -abstractProcessor.pushrequest.notsupported=此协议不支持服务器推送请求 abstractProcessor.setErrorState=正在处理请求时出现错误状态[{0}] abstractProcessor.socket.ssl=获取SSL属性异常 diff --git a/java/org/apache/coyote/http2/ConnectionSettingsBase.java b/java/org/apache/coyote/http2/ConnectionSettingsBase.java index eea078417c..2ae2e8e563 100644 --- a/java/org/apache/coyote/http2/ConnectionSettingsBase.java +++ b/java/org/apache/coyote/http2/ConnectionSettingsBase.java @@ -39,7 +39,6 @@ abstract class ConnectionSettingsBase<T extends Throwable> { // Defaults (defined by the specification) static final int DEFAULT_HEADER_TABLE_SIZE = Hpack.DEFAULT_TABLE_SIZE; - static final boolean DEFAULT_ENABLE_PUSH = true; static final long DEFAULT_MAX_CONCURRENT_STREAMS = UNLIMITED; static final int DEFAULT_INITIAL_WINDOW_SIZE = (1 << 16) - 1; static final int DEFAULT_MAX_FRAME_SIZE = MIN_MAX_FRAME_SIZE; @@ -56,7 +55,7 @@ abstract class ConnectionSettingsBase<T extends Throwable> { this.connectionId = connectionId; // Set up the defaults current.put(Setting.HEADER_TABLE_SIZE, Long.valueOf(DEFAULT_HEADER_TABLE_SIZE)); - current.put(Setting.ENABLE_PUSH, Long.valueOf(DEFAULT_ENABLE_PUSH ? 1 : 0)); + current.put(Setting.ENABLE_PUSH, Long.valueOf(0)); current.put(Setting.MAX_CONCURRENT_STREAMS, Long.valueOf(DEFAULT_MAX_CONCURRENT_STREAMS)); current.put(Setting.INITIAL_WINDOW_SIZE, Long.valueOf(DEFAULT_INITIAL_WINDOW_SIZE)); current.put(Setting.MAX_FRAME_SIZE, Long.valueOf(DEFAULT_MAX_FRAME_SIZE)); diff --git a/java/org/apache/coyote/http2/Http2AsyncUpgradeHandler.java b/java/org/apache/coyote/http2/Http2AsyncUpgradeHandler.java index d551bbc6ab..138529c706 100644 --- a/java/org/apache/coyote/http2/Http2AsyncUpgradeHandler.java +++ b/java/org/apache/coyote/http2/Http2AsyncUpgradeHandler.java @@ -195,12 +195,11 @@ public class Http2AsyncUpgradeHandler extends Http2UpgradeHandler { @Override - void writeHeaders(Stream stream, int pushedStreamId, MimeHeaders mimeHeaders, boolean endOfStream, int payloadSize) - throws IOException { + void writeHeaders(Stream stream, MimeHeaders mimeHeaders, boolean endOfStream, int payloadSize) throws IOException { headerWriteLock.lock(); try { - AsyncHeaderFrameBuffers headerFrameBuffers = (AsyncHeaderFrameBuffers) doWriteHeaders(stream, - pushedStreamId, mimeHeaders, endOfStream, payloadSize); + AsyncHeaderFrameBuffers headerFrameBuffers = (AsyncHeaderFrameBuffers) doWriteHeaders(stream, mimeHeaders, + endOfStream, payloadSize); if (headerFrameBuffers != null) { socketWrapper.write(BlockingMode.SEMI_BLOCK, protocol.getWriteTimeout(), TimeUnit.MILLISECONDS, null, SocketWrapperBase.COMPLETE_WRITE, applicationErrorCompletion, diff --git a/java/org/apache/coyote/http2/Http2UpgradeHandler.java b/java/org/apache/coyote/http2/Http2UpgradeHandler.java index 389c2273a5..55746d1520 100644 --- a/java/org/apache/coyote/http2/Http2UpgradeHandler.java +++ b/java/org/apache/coyote/http2/Http2UpgradeHandler.java @@ -121,7 +121,6 @@ class Http2UpgradeHandler extends AbstractStream implements InternalHttpUpgradeH // Start at -1 so the 'add 2' logic in closeIdleStreams() works private volatile int maxActiveRemoteStreamId = -1; private volatile int maxProcessedStreamId; - private final AtomicInteger nextLocalStreamId = new AtomicInteger(2); private final PingManager pingManager = getPingManager(); private volatile int newStreamsSinceLastPrune = 0; private final Set<Stream> backLogStreams = new HashSet<>(); @@ -698,13 +697,13 @@ class Http2UpgradeHandler extends AbstractStream implements InternalHttpUpgradeH } } - void writeHeaders(Stream stream, int pushedStreamId, MimeHeaders mimeHeaders, boolean endOfStream, int payloadSize) + void writeHeaders(Stream stream, MimeHeaders mimeHeaders, boolean endOfStream, int payloadSize) throws IOException { // This ensures the Stream processing thread has control of the socket. Lock lock = socketWrapper.getLock(); lock.lock(); try { - doWriteHeaders(stream, pushedStreamId, mimeHeaders, endOfStream, payloadSize); + doWriteHeaders(stream, mimeHeaders, endOfStream, payloadSize); } finally { lock.unlock(); } @@ -719,17 +718,12 @@ class Http2UpgradeHandler extends AbstractStream implements InternalHttpUpgradeH * Separate method to allow Http2AsyncUpgradeHandler to call this code without synchronizing on socketWrapper since * it doesn't need to. */ - protected HeaderFrameBuffers doWriteHeaders(Stream stream, int pushedStreamId, MimeHeaders mimeHeaders, - boolean endOfStream, int payloadSize) throws IOException { + protected HeaderFrameBuffers doWriteHeaders(Stream stream, MimeHeaders mimeHeaders, boolean endOfStream, + int payloadSize) throws IOException { if (log.isDebugEnabled()) { - if (pushedStreamId == 0) { - log.debug(sm.getString("upgradeHandler.writeHeaders", connectionId, stream.getIdAsString(), - Boolean.valueOf(endOfStream))); - } else { - log.debug(sm.getString("upgradeHandler.writePushHeaders", connectionId, stream.getIdAsString(), - Integer.valueOf(pushedStreamId), Boolean.valueOf(endOfStream))); - } + log.debug(sm.getString("upgradeHandler.writeHeaders", connectionId, stream.getIdAsString(), + Boolean.valueOf(endOfStream))); } if (!stream.canWrite()) { @@ -738,31 +732,18 @@ class Http2UpgradeHandler extends AbstractStream implements InternalHttpUpgradeH HeaderFrameBuffers headerFrameBuffers = getHeaderFrameBuffers(payloadSize); - byte[] pushedStreamIdBytes = null; - if (pushedStreamId > 0) { - pushedStreamIdBytes = new byte[4]; - ByteUtil.set31Bits(pushedStreamIdBytes, 0, pushedStreamId); - } - boolean first = true; State state = null; while (state != State.COMPLETE) { headerFrameBuffers.startFrame(); - if (first && pushedStreamIdBytes != null) { - headerFrameBuffers.getPayload().put(pushedStreamIdBytes); - } state = getHpackEncoder().encode(mimeHeaders, headerFrameBuffers.getPayload()); headerFrameBuffers.getPayload().flip(); if (state == State.COMPLETE || headerFrameBuffers.getPayload().limit() > 0) { ByteUtil.setThreeBytes(headerFrameBuffers.getHeader(), 0, headerFrameBuffers.getPayload().limit()); if (first) { first = false; - if (pushedStreamIdBytes == null) { - headerFrameBuffers.getHeader()[3] = FrameType.HEADERS.getIdByte(); - } else { - headerFrameBuffers.getHeader()[3] = FrameType.PUSH_PROMISE.getIdByte(); - } + headerFrameBuffers.getHeader()[3] = FrameType.HEADERS.getIdByte(); if (endOfStream) { headerFrameBuffers.getHeader()[4] = FLAG_END_OF_STREAM; } @@ -1255,17 +1236,6 @@ class Http2UpgradeHandler extends AbstractStream implements InternalHttpUpgradeH } - private Stream createLocalStream(Request request) { - int streamId = nextLocalStreamId.getAndAdd(2); - - Integer key = Integer.valueOf(streamId); - - Stream result = new Stream(key, this, request); - streams.put(key, result); - return result; - } - - private void close() { ConnectionState previous = connectionState.getAndSet(ConnectionState.CLOSED); if (previous == ConnectionState.CLOSED) { @@ -1345,36 +1315,6 @@ class Http2UpgradeHandler extends AbstractStream implements InternalHttpUpgradeH } - void push(Request request, Stream associatedStream) throws IOException { - if (localSettings.getMaxConcurrentStreams() < activeRemoteStreamCount.incrementAndGet()) { - // If there are too many open streams, simply ignore the push - // request. - setConnectionTimeoutForStreamCount(activeRemoteStreamCount.decrementAndGet()); - return; - } - - Stream pushStream; - - /* - * Uses SocketWrapper lock since PUSH_PROMISE frames have to be sent in order. Once the stream has been created - * we need to ensure that the PUSH_PROMISE is sent before the next stream is created for a PUSH_PROMISE. - */ - Lock lock = socketWrapper.getLock(); - lock.lock(); - try { - pushStream = createLocalStream(request); - writeHeaders(associatedStream, pushStream.getIdAsInt(), request.getMimeHeaders(), false, - Constants.DEFAULT_HEADERS_FRAME_SIZE); - } finally { - lock.unlock(); - } - - pushStream.sentPushPromise(); - - processStreamOnContainerThread(pushStream); - } - - @Override protected final String getConnectionId() { return connectionId; diff --git a/java/org/apache/coyote/http2/LocalStrings.properties b/java/org/apache/coyote/http2/LocalStrings.properties index 5872e2c313..0213ca23ef 100644 --- a/java/org/apache/coyote/http2/LocalStrings.properties +++ b/java/org/apache/coyote/http2/LocalStrings.properties @@ -169,7 +169,6 @@ upgradeHandler.windowUpdateConnection=Connection [{0}], Sent window update to cl upgradeHandler.windowUpdateStream=Connection [{0}], Stream [{1}], Sent window update to client increasing window by [{2}] bytes upgradeHandler.writeBody=Connection [{0}], Stream [{1}], Data length [{2}], EndOfStream [{3}] upgradeHandler.writeHeaders=Connection [{0}], Stream [{1}], Writing the headers, EndOfStream [{2}] -upgradeHandler.writePushHeaders=Connection [{0}], Stream [{1}], Pushed stream [{2}], EndOfStream [{3}] windowAllocationManager.dispatched=Connection [{0}], Stream [{1}], Dispatched windowAllocationManager.notified=Connection [{0}], Stream [{1}], Notified diff --git a/java/org/apache/coyote/http2/LocalStrings_fr.properties b/java/org/apache/coyote/http2/LocalStrings_fr.properties index e510bbb3f8..16db006759 100644 --- a/java/org/apache/coyote/http2/LocalStrings_fr.properties +++ b/java/org/apache/coyote/http2/LocalStrings_fr.properties @@ -169,7 +169,6 @@ upgradeHandler.windowUpdateConnection=Connection [{0}], envoi de la mise à jour upgradeHandler.windowUpdateStream=Connection [{0}], Stream [{1}], envoi de la mise à jour de la fenêtre augmentant celle ci de [{2}] octets upgradeHandler.writeBody=Connection [{0}], Flux [{1}], Taille des données [{2}] upgradeHandler.writeHeaders=Connection [{0}], Stream [{1}] -upgradeHandler.writePushHeaders=Connection [{0}], Flux [{1}], Flux de push [{2}], EndOfStream [{3}] windowAllocationManager.dispatched=Connection [{0}], Flux [{1}], Envoyé windowAllocationManager.notified=Connection [{0}], Flux [{1}], Notifié diff --git a/java/org/apache/coyote/http2/LocalStrings_ja.properties b/java/org/apache/coyote/http2/LocalStrings_ja.properties index c868d036f8..4ea12dff68 100644 --- a/java/org/apache/coyote/http2/LocalStrings_ja.properties +++ b/java/org/apache/coyote/http2/LocalStrings_ja.properties @@ -168,7 +168,6 @@ upgradeHandler.windowUpdateConnection=接続[{0}]、ウィンドウの更新を upgradeHandler.windowUpdateStream=接続 [{0}]、ストリーム [{1}]、ウィンドウの更新をクライアントに送信し、ウィンドウを [{2}] バイト増やします upgradeHandler.writeBody=コネクション [{0}]、ストリーム [{1}]、データ長 [{2}] upgradeHandler.writeHeaders=コネクション [{0}], ストリーム [{1}] -upgradeHandler.writePushHeaders=コネクション [{0}]、ストリーム [{1}]、プッシュされたストリーム [{2}]、EndOfStream [{3}] windowAllocationManager.dispatched=接続 [{0}]、ストリーム [{1}]、ディスパッチされました windowAllocationManager.notified=接続 [{0}]、ストリーム [{1}]、通知されました diff --git a/java/org/apache/coyote/http2/LocalStrings_ko.properties b/java/org/apache/coyote/http2/LocalStrings_ko.properties index 5893a35934..a10474fba5 100644 --- a/java/org/apache/coyote/http2/LocalStrings_ko.properties +++ b/java/org/apache/coyote/http2/LocalStrings_ko.properties @@ -165,7 +165,6 @@ upgradeHandler.windowUpdateConnection=연결 [{0}], 윈도우 크기를 [{1}] upgradeHandler.windowUpdateStream=연결 [{0}], 스트림 [{1}], 윈도우 크기를 [{2}] 바이트 만큼 늘리며, 클라이언트에게 윈도우 변경 프레임을 전송했습니다. upgradeHandler.writeBody=연결 [{0}], 스트림 [{1}], 데이터 길이 [{2}] upgradeHandler.writeHeaders=연결 [{0}], 스트림 [{1}] -upgradeHandler.writePushHeaders=연결 [{0}], 스트림 [{1}], Push된 스트림 [{2}], EndOfStream [{3}] windowAllocationManager.dispatched=연결 [{0}], 스트림 [{1}]에 디스패치됩니다. windowAllocationManager.notified=연결 [{0}], 스트림 [{1}]에 통지됩니다. diff --git a/java/org/apache/coyote/http2/LocalStrings_zh_CN.properties b/java/org/apache/coyote/http2/LocalStrings_zh_CN.properties index 41f43061ad..622d0c8954 100644 --- a/java/org/apache/coyote/http2/LocalStrings_zh_CN.properties +++ b/java/org/apache/coyote/http2/LocalStrings_zh_CN.properties @@ -164,7 +164,6 @@ upgradeHandler.windowUpdateConnection=连接[{0}],向客户端发送了窗口更 upgradeHandler.windowUpdateStream=连接[{0}],流[{1}]向客户端发送了窗口更新,将窗口增加[{2}]字节 upgradeHandler.writeBody=连接 [{0}],数据流[{1}], 数据长度[{2}] upgradeHandler.writeHeaders=连接[{0}],流[{1}],正在写入头信息,EndOfStream[{2}] -upgradeHandler.writePushHeaders=连接[{0}]、流[{1}]、推送流[{2}]、EndOfStream[{3}] windowAllocationManager.dispatched=连接[{0}],流[{1}],已调度 windowAllocationManager.notified=连接[{0}],流[{1}],已通知 diff --git a/java/org/apache/coyote/http2/Stream.java b/java/org/apache/coyote/http2/Stream.java index 7fa900aced..e2300d5129 100644 --- a/java/org/apache/coyote/http2/Stream.java +++ b/java/org/apache/coyote/http2/Stream.java @@ -118,7 +118,7 @@ class Stream extends AbstractNonZeroStream implements HeaderEmitter { this.inputBuffer = new StandardStreamInputBuffer(); this.coyoteRequest.setInputBuffer(inputBuffer); } else { - // HTTP/2 Push or HTTP/1.1 upgrade + // HTTP/1.1 upgrade this.coyoteRequest = coyoteRequest; this.inputBuffer = new SavedRequestStreamInputBuffer((SavedRequestInputFilter) coyoteRequest.getInputBuffer()); @@ -162,8 +162,7 @@ class Stream extends AbstractNonZeroStream implements HeaderEmitter { if (hostValueMB == null) { throw new IllegalArgumentException(); } - // This processing expects bytes. Server push will have used a String - // so trigger a conversion if required. + // This processing expects bytes. Trigger a conversion if required. hostValueMB.toBytes(); ByteChunk valueBC = hostValueMB.getByteChunk(); byte[] valueB = valueBC.getBytes(); @@ -546,8 +545,7 @@ class Stream extends AbstractNonZeroStream implements HeaderEmitter { final void writeHeaders() throws IOException { boolean endOfStream = streamOutputBuffer.hasNoBody() && coyoteResponse.getTrailerFields() == null; - handler.writeHeaders(this, 0, coyoteResponse.getMimeHeaders(), endOfStream, - Constants.DEFAULT_HEADERS_FRAME_SIZE); + handler.writeHeaders(this, coyoteResponse.getMimeHeaders(), endOfStream, Constants.DEFAULT_HEADERS_FRAME_SIZE); } @@ -581,12 +579,12 @@ class Stream extends AbstractNonZeroStream implements HeaderEmitter { mb.setString(headerEntry.getValue()); } - handler.writeHeaders(this, 0, mimeHeaders, true, Constants.DEFAULT_HEADERS_FRAME_SIZE); + handler.writeHeaders(this, mimeHeaders, true, Constants.DEFAULT_HEADERS_FRAME_SIZE); } final void writeAck() throws IOException { - handler.writeHeaders(this, 0, ACK_HEADERS, false, Constants.DEFAULT_HEADERS_ACK_FRAME_SIZE); + handler.writeHeaders(this, ACK_HEADERS, false, Constants.DEFAULT_HEADERS_ACK_FRAME_SIZE); } @@ -609,9 +607,8 @@ class Stream extends AbstractNonZeroStream implements HeaderEmitter { @Override final ByteBuffer getInputByteBuffer() { if (inputBuffer == null) { - // This must either be a push or an HTTP upgrade. Either way there - // should not be a request body so return a zero length ByteBuffer - // to trigger a flow control error. + // This must either be an HTTP upgrade. There should not be a request body so return a zero length + //ByteBuffer to trigger a flow control error. return ZERO_LENGTH_BYTEBUFFER; } return inputBuffer.getInBuffer(); @@ -708,11 +705,6 @@ class Stream extends AbstractNonZeroStream implements HeaderEmitter { } - final void sentPushPromise() { - state.sentPushPromise(); - } - - final boolean isActive() { return state.isActive(); } @@ -789,40 +781,6 @@ class Stream extends AbstractNonZeroStream implements HeaderEmitter { } - final boolean isPushSupported() { - return handler.getRemoteSettings().getEnablePush(); - } - - - final void push(Request request) throws IOException { - // Can only push when supported and from a peer initiated stream - if (!isPushSupported() || getIdAsInt() % 2 == 0) { - return; - } - // Set the special HTTP/2 headers - request.getMimeHeaders().addValue(":method").duplicate(request.method()); - request.getMimeHeaders().addValue(":scheme").duplicate(request.scheme()); - StringBuilder path = new StringBuilder(request.requestURI().toString()); - if (!request.queryString().isNull()) { - path.append('?'); - path.append(request.queryString().toString()); - } - request.getMimeHeaders().addValue(":path").setString(path.toString()); - - // Authority needs to include the port only if a non-standard port is - // being used. - if (!(request.scheme().equals("http") && request.getServerPort() == 80) && - !(request.scheme().equals("https") && request.getServerPort() == 443)) { - request.getMimeHeaders().addValue(":authority") - .setString(request.serverName().getString() + ":" + request.getServerPort()); - } else { - request.getMimeHeaders().addValue(":authority").duplicate(request.serverName()); - } - - handler.push(request, this); - } - - boolean isTrailerFieldsReady() { // Once EndOfStream has been received, canRead will be false return !state.canRead(); diff --git a/java/org/apache/coyote/http2/StreamProcessor.java b/java/org/apache/coyote/http2/StreamProcessor.java index d041abe389..be119cdd0d 100644 --- a/java/org/apache/coyote/http2/StreamProcessor.java +++ b/java/org/apache/coyote/http2/StreamProcessor.java @@ -361,23 +361,6 @@ class StreamProcessor extends AbstractProcessor { } - @Override - protected final boolean isPushSupported() { - return stream.isPushSupported(); - } - - - @Override - protected final void doPush(Request pushTarget) { - try { - stream.push(pushTarget); - } catch (IOException ioe) { - setErrorState(ErrorState.CLOSE_CONNECTION_NOW, ioe); - response.setErrorException(ioe); - } - } - - @Override protected boolean isTrailerFieldsReady() { return stream.isTrailerFieldsReady(); diff --git a/java/org/apache/coyote/http2/StreamStateMachine.java b/java/org/apache/coyote/http2/StreamStateMachine.java index bafb24193a..53e2cc53e3 100644 --- a/java/org/apache/coyote/http2/StreamStateMachine.java +++ b/java/org/apache/coyote/http2/StreamStateMachine.java @@ -49,11 +49,6 @@ class StreamStateMachine { } - final synchronized void sentPushPromise() { - stateChange(State.IDLE, State.RESERVED_LOCAL); - } - - final synchronized void sentHeaders() { // No change if currently OPEN stateChange(State.RESERVED_LOCAL, State.HALF_CLOSED_REMOTE); diff --git a/test/org/apache/coyote/http2/Http2TestBase.java b/test/org/apache/coyote/http2/Http2TestBase.java index 14f5aa11d7..2a432363cb 100644 --- a/test/org/apache/coyote/http2/Http2TestBase.java +++ b/test/org/apache/coyote/http2/Http2TestBase.java @@ -1267,14 +1267,6 @@ public abstract class Http2TestBase extends TomcatBaseTest { } - public void pushPromise(int streamId, int pushedStreamId) { - trace.append(streamId); - trace.append("-PushPromise-"); - trace.append(pushedStreamId); - trace.append("\n"); - } - - public void clearTrace() { trace = new StringBuffer(); bytesRead = 0; diff --git a/test/org/apache/coyote/http2/TestHttp2Section_6_5.java b/test/org/apache/coyote/http2/TestHttp2Section_6_5.java index f826914013..cba4b88958 100644 --- a/test/org/apache/coyote/http2/TestHttp2Section_6_5.java +++ b/test/org/apache/coyote/http2/TestHttp2Section_6_5.java @@ -71,8 +71,6 @@ public class TestHttp2Section_6_5 extends Http2TestBase { } - // Need to test sending push promise when push promise support is disabled - @Test public void testSettingsFrameInvalidPushSetting() throws Exception { // HTTP2 upgrade diff --git a/test/org/apache/coyote/http2/TesterHttp2Parser.java b/test/org/apache/coyote/http2/TesterHttp2Parser.java index 3b4f10af39..73d0a7557f 100644 --- a/test/org/apache/coyote/http2/TesterHttp2Parser.java +++ b/test/org/apache/coyote/http2/TesterHttp2Parser.java @@ -17,7 +17,6 @@ package org.apache.coyote.http2; import java.io.IOException; -import java.nio.ByteBuffer; import org.apache.coyote.http2.Http2TestBase.TestOutput; @@ -26,11 +25,8 @@ import org.apache.coyote.http2.Http2TestBase.TestOutput; */ public class TesterHttp2Parser extends Http2Parser { - private final TestOutput output; - TesterHttp2Parser(String connectionId, Input input, TestOutput output) { super(connectionId, input, output); - this.output = output; } @@ -43,50 +39,4 @@ public class TesterHttp2Parser extends Http2Parser { public boolean readFrame() throws Http2Exception, IOException { return super.readFrame(); } - - @Override - protected void readPushPromiseFrame(int streamId, int flags, int payloadSize, ByteBuffer buffer) - throws Http2Exception, IOException { - - // Parse flags used in this method - boolean hasPadding = Flags.hasPadding(flags); - boolean headersEndStream = Flags.isEndOfStream(flags); - - // Padding size - int paddingSize = 0; - if (hasPadding) { - byte[] bPadSize = new byte[1]; - if (buffer == null) { - input.fill(true, bPadSize); - } else { - buffer.get(bPadSize); - } - paddingSize = ByteUtil.getOneByte(bPadSize, 0); - } - - // Pushed stream ID - byte[] bPushedStreamId = new byte[4]; - if (buffer == null) { - input.fill(true, bPushedStreamId); - } else { - buffer.get(bPushedStreamId); - } - int pushedStreamId = ByteUtil.get31Bits(bPushedStreamId, 0); - - output.pushPromise(streamId, pushedStreamId); - - int headerSize = payloadSize - 4 - paddingSize; - if (hasPadding) { - headerSize--; - } - - HpackDecoder hpackDecoder = output.getHpackDecoder(); - hpackDecoder.setHeaderEmitter(output.headersStart(pushedStreamId, headersEndStream)); - - readHeaderPayload(pushedStreamId, headerSize, buffer); - - if (hasPadding) { - swallowPayload(streamId, FrameType.PUSH_PROMISE.getId(), paddingSize, true, buffer); - } - } } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org