AsioSessionState::AsioSessionState(
    AsioServerTransport & transport,
    AsioIoService & ioService) :
    mIoService(ioService),
    mState(Ready),
    mIssueZeroByteRead(false),
    mReadBufferRemaining(),
    mWriteBufferRemaining(),
    mTransport(transport),
    mFilterAdapterPtr(new FilterAdapter(*this)),
    mCloseAfterWrite(),
    mReflecting()
{
    if (transport.mWireProtocol == Wp_Http || transport.mWireProtocol == Wp_Https)
    {
        mWireFilters.clear();
        mWireFilters.push_back( FilterPtr(new HttpFrameFilter()) );
    }

    if (transport.mWireProtocol == Wp_Https)
    {
        FilterPtr sslFilterPtr;

#if defined(BOOST_WINDOWS) && defined(RCF_USE_OPENSSL)

        if (transport.mpServer->getPreferSchannel())
        {
            sslFilterPtr = transport.mpServer->createFilter(RcfFilter_SspiSchannel);
        }
        else
        {
            sslFilterPtr = transport.mpServer->createFilter(RcfFilter_OpenSsl);
        }

#elif defined(BOOST_WINDOWS)

        sslFilterPtr = transport.mpServer->createFilter(RcfFilter_SspiSchannel);

#elif defined(RCF_USE_OPENSSL)

        sslFilterPtr = transport.mpServer->createFilter(RcfFilter_OpenSsl);

#endif

        if (!sslFilterPtr)
        {
            RCF_THROW( Exception(_RcfError_SslNotSupported()) );
        }

        mWireFilters.push_back( sslFilterPtr );
    }

    if (mWireFilters.size() > 0)
    {
        setTransportFilters( std::vector<FilterPtr>() );
    }
}
    HttpsClientTransport::HttpsClientTransport(const HttpsEndpoint & httpsEndpoint) : 
        TcpClientTransport(httpsEndpoint.getIp(), httpsEndpoint.getPort())
    {
        std::vector<FilterPtr> wireFilters;

        // HTTP framing.
        wireFilters.push_back( FilterPtr( new HttpFrameFilter(
            getRemoteAddr().getIp(), 
            getRemoteAddr().getPort())));

        // SSL.
        ClientStub * pClientStub = getTlsClientStubPtr();
        RCF_ASSERT(pClientStub);

        FilterPtr sslFilterPtr;

#if RCF_FEATURE_SSPI==1 && RCF_FEATURE_OPENSSL==1

        if (pClientStub->getSslImplementation() == Si_Schannel)
        {
            sslFilterPtr.reset( new SchannelFilter(pClientStub) );
        }
        else
        {
            RCF_ASSERT(pClientStub->getSslImplementation() == Si_OpenSsl);
            sslFilterPtr.reset( new OpenSslEncryptionFilter(pClientStub) );
        }

#elif RCF_FEATURE_SSPI==1

        sslFilterPtr.reset( new SchannelFilter(pClientStub) );

#elif RCF_FEATURE_OPENSSL==1

        sslFilterPtr.reset( new OpenSslEncryptionFilter(pClientStub) );

#endif

        if (!sslFilterPtr)
        {
            RCF_THROW( Exception(_RcfError_SslNotSupported()) );
        }

        wireFilters.push_back(sslFilterPtr);

        // HTTP CONNECT filter for passing through a proxy.
        wireFilters.push_back( FilterPtr( new HttpConnectFilter(
            getRemoteAddr().getIp(), 
            getRemoteAddr().getPort())));

        setWireFilters(wireFilters);
    }