int dataPaddingBytes = getChannel().getPaddingBytes(); int attempted = getBuffer().remaining() + dataPaddingBytes + (dataPaddingBytes > 0 ? 1 : 0); final int fcWindow = grabFlowControlBytes(attempted); if (fcWindow == 0 && getBuffer().hasRemaining()) { return new SendFrameHeader(getBuffer().remaining(), null); if(getBuffer().remaining() >= fcWindow) { } else if (getBuffer().remaining() == dataPaddingBytes ){ dataPaddingBytes = fcWindow - getBuffer().remaining() - 1; final boolean finalFrame = isFinalFrameQueued() && fcWindow >= (getBuffer().remaining() + (dataPaddingBytes > 0 ? dataPaddingBytes + 1 : 0)); PooledByteBuffer firstHeaderBuffer = getChannel().getBufferPool().allocate(); PooledByteBuffer[] allHeaderBuffers = null; ByteBuffer firstBuffer = firstHeaderBuffer.getBuffer(); Http2ProtocolUtils.putInt(firstBuffer, getStreamId()); int paddingBytes = getChannel().getPaddingBytes(); if(paddingBytes > 0) { firstBuffer.put((byte) (paddingBytes & 0xFF)); writeBeforeHeaderBlock(firstBuffer); HeaderMap headers = this.headers; HpackEncoder.State result = encoder.encode(headers, firstBuffer); firstBuffer.put(1, (byte) ((headerFrameLength >> 8) & 0xFF));
@Override protected StreamSinkConduit getSinkConduit(HttpServerExchange exchange, StreamSinkConduit conduit) { HeaderMap headers = responseChannel.getHeaders(); DateUtils.addDateHeaderIfRequired(exchange); headers.add(STATUS, exchange.getStatusCode()); Connectors.flattenCookies(exchange); return originalSinkConduit; }
private HpackEncoder.State encodeContinuationFrame(HeaderMap headers, PooledByteBuffer current) { ByteBuffer currentBuffer; HpackEncoder.State result;//continuation frame //note that if the buffers are small we may not actually need a continuation here //but it greatly reduces the code complexity //back fill the length currentBuffer = current.getBuffer(); currentBuffer.put((byte) 0); currentBuffer.put((byte) 0); currentBuffer.put((byte) 0); currentBuffer.put((byte) Http2Channel.FRAME_TYPE_CONTINUATION); //type currentBuffer.put((byte) 0); //back fill the flags Http2ProtocolUtils.putInt(currentBuffer, getStreamId()); result = encoder.encode(headers, currentBuffer); int contFrameLength = currentBuffer.position() - 9; currentBuffer.put(0, (byte) ((contFrameLength >> 16) & 0xFF)); currentBuffer.put(1, (byte) ((contFrameLength >> 8) & 0xFF)); currentBuffer.put(2, (byte) (contFrameLength & 0xFF)); currentBuffer.put(4, (byte) (result == HpackEncoder.State.COMPLETE ? Http2Channel.HEADERS_FLAG_END_HEADERS : 0 )); //flags return result; }
@Override public void exchangeEvent(HttpServerExchange exchange, NextListener nextListener) { try { channel.sendRstStream(responseChannel.getStreamId(), Http2Channel.ERROR_CANCEL); } finally { nextListener.proceed(); } } });
int dataPaddingBytes = getChannel().getPaddingBytes(); int attempted = getBuffer().remaining() + dataPaddingBytes + (dataPaddingBytes > 0 ? 1 : 0); final int fcWindow = grabFlowControlBytes(attempted); if (fcWindow == 0 && getBuffer().hasRemaining()) { return new SendFrameHeader(getBuffer().remaining(), null); if(getBuffer().remaining() >= fcWindow) { } else if (getBuffer().remaining() == dataPaddingBytes ){ dataPaddingBytes = fcWindow - getBuffer().remaining() - 1; final boolean finalFrame = isFinalFrameQueued() && fcWindow >= (getBuffer().remaining() + (dataPaddingBytes > 0 ? dataPaddingBytes + 1 : 0)); PooledByteBuffer firstHeaderBuffer = getChannel().getBufferPool().allocate(); PooledByteBuffer[] allHeaderBuffers = null; ByteBuffer firstBuffer = firstHeaderBuffer.getBuffer(); Http2ProtocolUtils.putInt(firstBuffer, getStreamId()); int paddingBytes = getChannel().getPaddingBytes(); if(paddingBytes > 0) { firstBuffer.put((byte) (paddingBytes & 0xFF)); writeBeforeHeaderBlock(firstBuffer); HeaderMap headers = this.headers; HpackEncoder.State result = encoder.encode(headers, firstBuffer); firstBuffer.put(1, (byte) ((headerFrameLength >> 8) & 0xFF));
requestHeaders.put(Http2ReceiveListener.SCHEME, exchange.getRequestScheme()); Http2HeadersStreamSinkChannel sink = channel.sendPushPromise(responseChannel.getStreamId(), requestHeaders, responseHeaders); Http2ServerConnection newConnection = new Http2ServerConnection(channel, sink, getUndertowOptions(), getBufferSize(), rootHandler); final HttpServerExchange exchange = new HttpServerExchange(newConnection, requestHeaders, responseHeaders, getUndertowOptions().get(UndertowOptions.MAX_ENTITY_SIZE, UndertowOptions.DEFAULT_MAX_ENTITY_SIZE));
@Override protected StreamSinkConduit getSinkConduit(HttpServerExchange exchange, StreamSinkConduit conduit) { HeaderMap headers = responseChannel.getHeaders(); DateUtils.addDateHeaderIfRequired(exchange); headers.add(STATUS, exchange.getStatusCode()); Connectors.flattenCookies(exchange); return originalSinkConduit; }
int dataPaddingBytes = getChannel().getPaddingBytes(); int attempted = getBuffer().remaining() + dataPaddingBytes + (dataPaddingBytes > 0 ? 1 : 0); final int fcWindow = grabFlowControlBytes(attempted); if (fcWindow == 0 && getBuffer().hasRemaining()) { return new SendFrameHeader(getBuffer().remaining(), null); if(getBuffer().remaining() >= fcWindow) { } else if (getBuffer().remaining() == dataPaddingBytes ){ dataPaddingBytes = fcWindow - getBuffer().remaining() - 1; final boolean finalFrame = isFinalFrameQueued() && fcWindow >= (getBuffer().remaining() + (dataPaddingBytes > 0 ? dataPaddingBytes + 1 : 0)); PooledByteBuffer firstHeaderBuffer = getChannel().getBufferPool().allocate(); PooledByteBuffer[] allHeaderBuffers = null; ByteBuffer firstBuffer = firstHeaderBuffer.getBuffer(); Http2ProtocolUtils.putInt(firstBuffer, getStreamId()); int paddingBytes = getChannel().getPaddingBytes(); if(paddingBytes > 0) { firstBuffer.put((byte) (paddingBytes & 0xFF)); writeBeforeHeaderBlock(firstBuffer); HeaderMap headers = this.headers; HpackEncoder.State result = encoder.encode(headers, firstBuffer); firstBuffer.put(1, (byte) ((headerFrameLength >> 8) & 0xFF));
private HpackEncoder.State encodeContinuationFrame(HeaderMap headers, PooledByteBuffer current) { ByteBuffer currentBuffer; HpackEncoder.State result;//continuation frame //note that if the buffers are small we may not actually need a continuation here //but it greatly reduces the code complexity //back fill the length currentBuffer = current.getBuffer(); currentBuffer.put((byte) 0); currentBuffer.put((byte) 0); currentBuffer.put((byte) 0); currentBuffer.put((byte) Http2Channel.FRAME_TYPE_CONTINUATION); //type currentBuffer.put((byte) 0); //back fill the flags Http2ProtocolUtils.putInt(currentBuffer, getStreamId()); result = encoder.encode(headers, currentBuffer); int contFrameLength = currentBuffer.position() - 9; currentBuffer.put(0, (byte) ((contFrameLength >> 16) & 0xFF)); currentBuffer.put(1, (byte) ((contFrameLength >> 8) & 0xFF)); currentBuffer.put(2, (byte) (contFrameLength & 0xFF)); currentBuffer.put(4, (byte) (result == HpackEncoder.State.COMPLETE ? Http2Channel.HEADERS_FLAG_END_HEADERS : 0 )); //flags return result; }
@Override protected StreamSinkConduit getSinkConduit(HttpServerExchange exchange, StreamSinkConduit conduit) { HeaderMap headers = responseChannel.getHeaders(); DateUtils.addDateHeaderIfRequired(exchange); headers.add(STATUS, exchange.getStatusCode()); Connectors.flattenCookies(exchange); return originalSinkConduit; }
@Override public void exchangeEvent(HttpServerExchange exchange, NextListener nextListener) { try { channel.sendRstStream(responseChannel.getStreamId(), Http2Channel.ERROR_CANCEL); } finally { nextListener.proceed(); } } });
private HpackEncoder.State encodeContinuationFrame(HeaderMap headers, PooledByteBuffer current) { ByteBuffer currentBuffer; HpackEncoder.State result;//continuation frame //note that if the buffers are small we may not actually need a continuation here //but it greatly reduces the code complexity //back fill the length currentBuffer = current.getBuffer(); currentBuffer.put((byte) 0); currentBuffer.put((byte) 0); currentBuffer.put((byte) 0); currentBuffer.put((byte) Http2Channel.FRAME_TYPE_CONTINUATION); //type currentBuffer.put((byte) 0); //back fill the flags Http2ProtocolUtils.putInt(currentBuffer, getStreamId()); result = encoder.encode(headers, currentBuffer); int contFrameLength = currentBuffer.position() - 9; currentBuffer.put(0, (byte) ((contFrameLength >> 16) & 0xFF)); currentBuffer.put(1, (byte) ((contFrameLength >> 8) & 0xFF)); currentBuffer.put(2, (byte) (contFrameLength & 0xFF)); currentBuffer.put(4, (byte) (result == HpackEncoder.State.COMPLETE ? Http2Channel.HEADERS_FLAG_END_HEADERS : 0 )); //flags return result; }
@Override public void exchangeEvent(HttpServerExchange exchange, NextListener nextListener) { try { channel.sendRstStream(responseChannel.getStreamId(), Http2Channel.ERROR_CANCEL); } finally { nextListener.proceed(); } } });
requestHeaders.put(Http2ReceiveListener.SCHEME, exchange.getRequestScheme()); Http2HeadersStreamSinkChannel sink = channel.sendPushPromise(responseChannel.getStreamId(), requestHeaders, responseHeaders); Http2ServerConnection newConnection = new Http2ServerConnection(channel, sink, getUndertowOptions(), getBufferSize(), rootHandler); final HttpServerExchange exchange = new HttpServerExchange(newConnection, requestHeaders, responseHeaders, getUndertowOptions().get(UndertowOptions.MAX_ENTITY_SIZE, UndertowOptions.DEFAULT_MAX_ENTITY_SIZE));
requestHeaders.put(Http2ReceiveListener.SCHEME, exchange.getRequestScheme()); Http2HeadersStreamSinkChannel sink = channel.sendPushPromise(responseChannel.getStreamId(), requestHeaders, responseHeaders); Http2ServerConnection newConnection = new Http2ServerConnection(channel, sink, getUndertowOptions(), getBufferSize(), rootHandler); final HttpServerExchange exchange = new HttpServerExchange(newConnection, requestHeaders, responseHeaders, getUndertowOptions().get(UndertowOptions.MAX_ENTITY_SIZE, UndertowOptions.DEFAULT_MAX_ENTITY_SIZE));