| // |
| // ======================================================================== |
| // 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(); |
| } |
| } |