private void anyToFailure(Throwable failure) { HttpExchange exchange = getHttpExchange(); if (exchange == null) return; // Mark atomically the request as completed, with respect // to concurrency between request success and request failure. if (exchange.requestComplete(failure)) executeAbort(exchange, failure); }
if (!exchange.requestComplete(null)) return false;
protected boolean success() { HttpExchange exchange = connection.getExchange(); if (exchange == null) return false; AtomicMarkableReference<Result> completion = exchange.requestComplete(null); if (!completion.isMarked()) return false; generator.reset(); if (!updateState(State.COMMIT, State.IDLE)) throw new IllegalStateException(); exchange.terminateRequest(); // It is important to notify completion *after* we reset because // the notification may trigger another request/response HttpDestination destination = connection.getDestination(); Request request = exchange.getRequest(); destination.getRequestNotifier().notifySuccess(request); LOG.debug("Sent {}", request); Result result = completion.getReference(); if (result != null) { connection.complete(exchange, !result.isFailed()); HttpConversation conversation = exchange.getConversation(); destination.getResponseNotifier().notifyComplete(conversation.getResponseListeners(), result); } return true; }
protected boolean success() { HttpExchange exchange = connection.getExchange(); if (exchange == null) return false; AtomicMarkableReference<Result> completion = exchange.requestComplete(null); if (!completion.isMarked()) return false; generator.reset(); if (!updateState(State.COMMIT, State.IDLE)) throw new IllegalStateException(); exchange.terminateRequest(); // It is important to notify completion *after* we reset because // the notification may trigger another request/response HttpDestination destination = connection.getDestination(); Request request = exchange.getRequest(); destination.getRequestNotifier().notifySuccess(request); LOG.debug("Sent {}", request); Result result = completion.getReference(); if (result != null) { connection.complete(exchange, !result.isFailed()); HttpConversation conversation = exchange.getConversation(); destination.getResponseNotifier().notifyComplete(conversation.getResponseListeners(), result); } return true; }
@Override public Stream.Listener onPush(Stream stream, PushPromiseFrame frame) { HttpExchange exchange = getHttpExchange(); if (exchange == null) return null; HttpRequest request = exchange.getRequest(); MetaData.Request metaData = (MetaData.Request)frame.getMetaData(); HttpRequest pushRequest = (HttpRequest)getHttpDestination().getHttpClient().newRequest(metaData.getURIString()); // TODO: copy PUSH_PROMISE headers into pushRequest. BiFunction<Request, Request, Response.CompleteListener> pushListener = request.getPushListener(); if (pushListener != null) { Response.CompleteListener listener = pushListener.apply(request, pushRequest); if (listener != null) { HttpChannelOverHTTP2 pushChannel = getHttpChannel().getHttpConnection().acquireHttpChannel(); List<Response.ResponseListener> listeners = Collections.singletonList(listener); HttpExchange pushExchange = new HttpExchange(getHttpDestination(), pushRequest, listeners); pushChannel.associate(pushExchange); pushChannel.setStream(stream); // TODO: idle timeout ? pushExchange.requestComplete(null); pushExchange.terminateRequest(); return pushChannel.getStreamListener(); } } stream.reset(new ResetFrame(stream.getId(), ErrorCode.REFUSED_STREAM_ERROR.code), Callback.NOOP); return null; }
return false; AtomicMarkableReference<Result> completion = exchange.requestComplete(failure); if (!completion.isMarked()) return false;
return false; AtomicMarkableReference<Result> completion = exchange.requestComplete(failure); if (!completion.isMarked()) return false;