blob: 2dd9d23662dde1cd496c3fa0945b67511a699bc0 [file] [log] [blame]
/*
* 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_;
}