Search in sources :

Example 1 with Property

use of org.apache.sshd.common.Property in project mina-sshd by apache.

the class Nio2Service method setSocketOptions.

@SuppressWarnings("unchecked")
protected <S extends NetworkChannel> S setSocketOptions(S socket) throws IOException {
    Collection<? extends SocketOption<?>> supported = socket.supportedOptions();
    if (GenericUtils.isEmpty(supported)) {
        return socket;
    }
    for (Map.Entry<Property<?>, ? extends Map.Entry<SocketOption<?>, ?>> ce : CONFIGURABLE_OPTIONS.entrySet()) {
        Property<?> property = ce.getKey();
        Map.Entry<SocketOption<?>, ?> defConfig = ce.getValue();
        @SuppressWarnings("rawtypes") SocketOption option = defConfig.getKey();
        setOption(socket, property, option, defConfig.getValue());
    }
    return socket;
}
Also used : SocketOption(java.net.SocketOption) LinkedHashMap(java.util.LinkedHashMap) Map(java.util.Map) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) Property(org.apache.sshd.common.Property)

Example 2 with Property

use of org.apache.sshd.common.Property in project mina-sshd by apache.

the class Nio2ServiceTest method testSetSocketOptions.

// see SSHD-554, SSHD-722
@Test
public void testSetSocketOptions() throws Exception {
    try (SshServer sshd = setupTestServer()) {
        Map<Property<?>, Object> expectedOptions = new LinkedHashMap<>();
        expectedOptions.put(CoreModuleProperties.SOCKET_KEEPALIVE, true);
        expectedOptions.put(CoreModuleProperties.SOCKET_LINGER, 5);
        expectedOptions.put(CoreModuleProperties.SOCKET_RCVBUF, 1024);
        expectedOptions.put(CoreModuleProperties.SOCKET_REUSEADDR, true);
        expectedOptions.put(CoreModuleProperties.SOCKET_SNDBUF, 1024);
        expectedOptions.put(CoreModuleProperties.TCP_NODELAY, true);
        for (Map.Entry<Property<?>, ?> oe : expectedOptions.entrySet()) {
            PropertyResolverUtils.updateProperty(sshd, oe.getKey().getName(), oe.getValue());
        }
        Semaphore sigSem = new Semaphore(0, true);
        Map<SocketOption<?>, Map.Entry<?, ?>> actualOptionValues = new HashMap<>(expectedOptions.size());
        sshd.setSessionFactory(new SessionFactory(sshd) {

            @Override
            protected ServerSessionImpl doCreateSession(IoSession ioSession) throws Exception {
                validateSocketOptions(ioSession);
                sigSem.release();
                return super.doCreateSession(ioSession);
            }

            private void validateSocketOptions(IoSession ioSession) throws Exception {
                if (!(ioSession instanceof Nio2Session)) {
                    return;
                }
                AsynchronousSocketChannel socket = ((Nio2Session) ioSession).getSocket();
                Collection<? extends SocketOption<?>> supported = socket.supportedOptions();
                if (GenericUtils.isEmpty(supported)) {
                    return;
                }
                for (Map.Entry<Property<?>, ?> oe : expectedOptions.entrySet()) {
                    Property<?> prop = oe.getKey();
                    Object expValue = oe.getValue();
                    Map.Entry<SocketOption<?>, ?> optionEntry = Nio2Service.CONFIGURABLE_OPTIONS.get(prop);
                    SocketOption<?> option = optionEntry.getKey();
                    if (!supported.contains(option)) {
                        continue;
                    }
                    Object actValue = socket.getOption(option);
                    actualOptionValues.put(option, new SimpleImmutableEntry<>(expValue, actValue));
                }
            }
        });
        sshd.start();
        int port = sshd.getPort();
        long startTime = System.nanoTime();
        try (Socket s = new Socket(TEST_LOCALHOST, port)) {
            long endTime = System.nanoTime();
            long duration = endTime - startTime;
            assertTrue("Connect duration is too high: " + duration, duration <= TimeUnit.SECONDS.toNanos(15L));
            assertTrue("Validation not completed on time", sigSem.tryAcquire(15L, TimeUnit.SECONDS));
        } finally {
            sshd.stop();
        }
        // they might ignore it
        for (Map.Entry<SocketOption<?>, ? extends Map.Entry<?, ?>> mme : actualOptionValues.entrySet()) {
            SocketOption<?> option = mme.getKey();
            Map.Entry<?, ?> vp = mme.getValue();
            Object expValue = vp.getKey();
            Object actValue = vp.getValue();
            Appendable output = Objects.equals(expValue, actValue) ? System.out : System.err;
            output.append('\t').append(option.name()).append(": expected=").append(Objects.toString(expValue)).append(", actual=").append(Objects.toString(actValue)).append(System.lineSeparator());
            if (output instanceof Flushable) {
                ((Flushable) output).flush();
            }
        }
    }
}
Also used : HashMap(java.util.HashMap) LinkedHashMap(java.util.LinkedHashMap) Semaphore(java.util.concurrent.Semaphore) SshServer(org.apache.sshd.server.SshServer) LinkedHashMap(java.util.LinkedHashMap) SimpleImmutableEntry(java.util.AbstractMap.SimpleImmutableEntry) ServerSessionImpl(org.apache.sshd.server.session.ServerSessionImpl) Property(org.apache.sshd.common.Property) IoSession(org.apache.sshd.common.io.IoSession) SessionFactory(org.apache.sshd.server.session.SessionFactory) Flushable(java.io.Flushable) SocketOption(java.net.SocketOption) AsynchronousSocketChannel(java.nio.channels.AsynchronousSocketChannel) SimpleImmutableEntry(java.util.AbstractMap.SimpleImmutableEntry) Collection(java.util.Collection) HashMap(java.util.HashMap) LinkedHashMap(java.util.LinkedHashMap) Map(java.util.Map) Socket(java.net.Socket) Test(org.junit.Test)

Aggregations

SocketOption (java.net.SocketOption)2 LinkedHashMap (java.util.LinkedHashMap)2 Map (java.util.Map)2 Property (org.apache.sshd.common.Property)2 Flushable (java.io.Flushable)1 Socket (java.net.Socket)1 AsynchronousSocketChannel (java.nio.channels.AsynchronousSocketChannel)1 SimpleImmutableEntry (java.util.AbstractMap.SimpleImmutableEntry)1 Collection (java.util.Collection)1 HashMap (java.util.HashMap)1 ConcurrentHashMap (java.util.concurrent.ConcurrentHashMap)1 Semaphore (java.util.concurrent.Semaphore)1 IoSession (org.apache.sshd.common.io.IoSession)1 SshServer (org.apache.sshd.server.SshServer)1 ServerSessionImpl (org.apache.sshd.server.session.ServerSessionImpl)1 SessionFactory (org.apache.sshd.server.session.SessionFactory)1 Test (org.junit.Test)1