/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ module thrift.server.transport.ssl; import std.datetime : Duration; import std.exception : enforce; import std.socket : Socket; import thrift.server.transport.socket; import thrift.transport.base; import thrift.transport.socket; import thrift.transport.ssl; /** * A server transport implementation using SSL-encrypted sockets. * * Note: * On Posix systems which do not have the BSD-specific SO_NOSIGPIPE flag, you * might want to ignore the SIGPIPE signal, as OpenSSL might try to write to * a closed socket if the peer disconnects abruptly: * --- * import core.stdc.signal; * import core.sys.posix.signal; * signal(SIGPIPE, SIG_IGN); * --- * * See: thrift.transport.ssl. */ class TSSLServerSocket : TServerSocket { /** * Creates a new TSSLServerSocket. * * Params: * port = The port on which to listen. * sslContext = The TSSLContext to use for creating client * sockets. Must be in server-side mode. */ this(ushort port, TSSLContext sslContext) { super(port); setSSLContext(sslContext); } /** * Creates a new TSSLServerSocket. * * Params: * port = The port on which to listen. * sendTimeout = The send timeout to set on the client sockets. * recvTimeout = The receive timeout to set on the client sockets. * sslContext = The TSSLContext to use for creating client * sockets. Must be in server-side mode. */ this(ushort port, Duration sendTimeout, Duration recvTimeout, TSSLContext sslContext) { super(port, sendTimeout, recvTimeout); setSSLContext(sslContext); } protected: override TSocket createTSocket(Socket socket) { return new TSSLSocket(sslContext_, socket); } private: void setSSLContext(TSSLContext sslContext) { enforce(sslContext.serverSide, new TTransportException( "Need server-side SSL socket factory for TSSLServerSocket")); sslContext_ = sslContext; } TSSLContext sslContext_; }