// // ======================================================================== // Copyright (c) 1995-2017 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // All rights reserved. This program and the accompanying materials // are made available under the terms of the Eclipse Public License v1.0 // and Apache License v2.0 which accompanies this distribution. // // The Eclipse Public License is available at // http://www.eclipse.org/legal/epl-v10.html // // The Apache License v2.0 is available at // http://www.opensource.org/licenses/apache2.0.php // // You may elect to redistribute this code under either of these licenses. // ======================================================================== // package org.eclipse.jetty.http2.client.http; import org.eclipse.jetty.client.HttpChannel; import org.eclipse.jetty.client.HttpDestination; import org.eclipse.jetty.client.HttpExchange; import org.eclipse.jetty.client.HttpReceiver; import org.eclipse.jetty.client.HttpSender; import org.eclipse.jetty.client.api.Result; import org.eclipse.jetty.http2.ErrorCode; import org.eclipse.jetty.http2.api.Session; import org.eclipse.jetty.http2.api.Stream; import org.eclipse.jetty.http2.frames.ResetFrame; import org.eclipse.jetty.util.Callback; public class HttpChannelOverHTTP2 extends HttpChannel { private final HttpConnectionOverHTTP2 connection; private final Session session; private final boolean push; private final HttpSenderOverHTTP2 sender; private final HttpReceiverOverHTTP2 receiver; private Stream stream; public HttpChannelOverHTTP2(HttpDestination destination, HttpConnectionOverHTTP2 connection, Session session, boolean push) { super(destination); this.connection = connection; this.session = session; this.push = push; this.sender = new HttpSenderOverHTTP2(this); this.receiver = new HttpReceiverOverHTTP2(this); } protected HttpConnectionOverHTTP2 getHttpConnection() { return connection; } public Session getSession() { return session; } public Stream.Listener getStreamListener() { return receiver; } @Override protected HttpSender getHttpSender() { return sender; } @Override protected HttpReceiver getHttpReceiver() { return receiver; } public Stream getStream() { return stream; } public void setStream(Stream stream) { this.stream = stream; } @Override public void send() { HttpExchange exchange = getHttpExchange(); if (exchange != null) sender.send(exchange); } @Override public void release() { connection.release(this); } @Override public boolean abort(HttpExchange exchange, Throwable requestFailure, Throwable responseFailure) { boolean aborted = super.abort(exchange, requestFailure, responseFailure); if (aborted) { Stream stream = getStream(); if (stream != null) stream.reset(new ResetFrame(stream.getId(), ErrorCode.CANCEL_STREAM_ERROR.code), Callback.NOOP); } return aborted; } @Override public void exchangeTerminated(HttpExchange exchange, Result result) { super.exchangeTerminated(exchange, result); if (!push) release(); } }