// // ======================================================================== // 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.alpn.server; import java.util.Iterator; import java.util.List; import java.util.ServiceLoader; import javax.net.ssl.SSLEngine; import org.eclipse.jetty.io.AbstractConnection; import org.eclipse.jetty.io.EndPoint; import org.eclipse.jetty.io.ssl.ALPNProcessor; import org.eclipse.jetty.io.ssl.SslHandshakeListener; import org.eclipse.jetty.server.Connector; import org.eclipse.jetty.server.NegotiatingServerConnectionFactory; import org.eclipse.jetty.util.annotation.Name; public class ALPNServerConnectionFactory extends NegotiatingServerConnectionFactory implements SslHandshakeListener { private final ALPNProcessor.Server alpnProcessor; public ALPNServerConnectionFactory(String protocols) { this(protocols.trim().split(",", 0)); } public ALPNServerConnectionFactory(@Name("protocols") String... protocols) { super("alpn", protocols); checkProtocolNegotiationAvailable(); Iterator<ALPNProcessor.Server> processors = ServiceLoader.load(ALPNProcessor.Server.class).iterator(); alpnProcessor = processors.hasNext() ? processors.next() : ALPNProcessor.Server.NOOP; } public ALPNProcessor.Server getALPNProcessor() { return alpnProcessor; } @Override protected AbstractConnection newServerConnection(Connector connector, EndPoint endPoint, SSLEngine engine, List<String> protocols, String defaultProtocol) { getALPNProcessor().configure(engine); return new ALPNServerConnection(connector, endPoint, engine, protocols, defaultProtocol); } @Override public void handshakeSucceeded(Event event) { if (alpnProcessor instanceof SslHandshakeListener) ((SslHandshakeListener)alpnProcessor).handshakeSucceeded(event); } @Override public void handshakeFailed(Event event, Throwable failure) { if (alpnProcessor instanceof SslHandshakeListener) ((SslHandshakeListener)alpnProcessor).handshakeFailed(event, failure); } }