List of usage examples for io.netty.handler.codec.http2 Http2Exception connectionError
public static Http2Exception connectionError(Http2Error error, String fmt, Object... args)
From source file:com.linkedin.r2.transport.http.client.Http2FrameListener.java
License:Apache License
@Override public void onHeadersRead(ChannelHandlerContext ctx, int streamId, Http2Headers headers, int padding, boolean endOfStream) throws Http2Exception { LOG.debug("Received HTTP/2 HEADERS frame, stream={}, end={}, headers={}, padding={}bytes", new Object[] { streamId, endOfStream, headers.size(), padding }); // Ignores response for the upgrade request if (streamId == Http2CodecUtil.HTTP_UPGRADE_STREAM_ID) { return;//from w w w . j a v a 2s . c o m } final StreamResponseBuilder builder = new StreamResponseBuilder(); // Process HTTP/2 pseudo headers if (headers.status() != null) { builder.setStatus(Integer.parseInt(headers.status().toString())); } if (headers.authority() != null) { builder.addHeaderValue(HttpHeaderNames.HOST.toString(), headers.authority().toString()); } // Process other HTTP headers for (Map.Entry<CharSequence, CharSequence> header : headers) { if (Http2Headers.PseudoHeaderName.isPseudoHeader(header.getKey())) { // Do no set HTTP/2 pseudo headers to response continue; } final String key = header.getKey().toString(); final String value = header.getValue().toString(); if (key.equalsIgnoreCase(HttpConstants.RESPONSE_COOKIE_HEADER_NAME)) { builder.addCookie(value); } else { builder.unsafeAddHeaderValue(key, value); } } // Gets async pool handle from stream properties Http2Connection.PropertyKey handleKey = ctx.channel() .attr(Http2ClientPipelineInitializer.CHANNEL_POOL_HANDLE_ATTR_KEY).get(); TimeoutAsyncPoolHandle<?> handle = _connection.stream(streamId).removeProperty(handleKey); if (handle == null) { _lifecycleManager.onError(ctx, Http2Exception.connectionError(Http2Error.PROTOCOL_ERROR, "No channel pool handle is associated with this stream", streamId)); return; } final StreamResponse response; if (endOfStream) { response = builder.build(EntityStreams.emptyStream()); ctx.fireChannelRead(handle); } else { // Associate an entity stream writer to the HTTP/2 stream final TimeoutBufferedWriter writer = new TimeoutBufferedWriter(ctx, streamId, _maxContentLength, handle); if (_connection.stream(streamId).setProperty(_writerKey, writer) != null) { _lifecycleManager.onError(ctx, Http2Exception.connectionError(Http2Error.PROTOCOL_ERROR, "Another writer has already been associated with current stream ID", streamId)); return; } // Prepares StreamResponse for the channel pipeline EntityStream entityStream = EntityStreams.newEntityStream(writer); response = builder.build(entityStream); } // Gets callback from stream properties Http2Connection.PropertyKey callbackKey = ctx.channel() .attr(Http2ClientPipelineInitializer.CALLBACK_ATTR_KEY).get(); TransportCallback<?> callback = _connection.stream(streamId).removeProperty(callbackKey); if (callback != null) { ctx.fireChannelRead(new ResponseWithCallback<Response, TransportCallback<?>>(response, callback)); } }
From source file:io.grpc.netty.Http2ControlFrameLimitEncoder.java
License:Apache License
private ChannelPromise handleOutstandingControlFrames(ChannelHandlerContext ctx, ChannelPromise promise) { if (!limitReached) { if (outstandingControlFrames == maxOutstandingControlFrames) { // Let's try to flush once as we may be able to flush some of the control frames. ctx.flush();//from ww w. j a va 2 s . c o m } if (outstandingControlFrames == maxOutstandingControlFrames) { limitReached = true; Http2Exception exception = Http2Exception.connectionError(Http2Error.ENHANCE_YOUR_CALM, "Maximum number %d of outstanding control frames reached", maxOutstandingControlFrames); logger.info("Maximum number {} of outstanding control frames reached. Closing channel {}", maxOutstandingControlFrames, ctx.channel(), exception); // First notify the Http2LifecycleManager and then close the connection. lifecycleManager.onError(ctx, true, exception); ctx.close(); } outstandingControlFrames++; // We did not reach the limit yet, add the listener to decrement the number of outstanding control frames // once the promise was completed return promise.unvoid().addListener(outstandingControlFramesListener); } return promise; }