[prev in list] [next in list] [prev in thread] [next in thread]
List: mina-dev
Subject: [jira] [Created] (SSHD-449) SSH Exec channel with ClientChannel.Streaming.Async
From: "Yarin Benado (JIRA)" <jira () apache ! org>
Date: 2015-04-21 16:08:59
Message-ID: JIRA.12822709.1429632514000.63127.1429632539402 () Atlassian ! JIRA
[Download RAW message or body]
Yarin Benado created SSHD-449:
---------------------------------
Summary: SSH Exec channel with ClientChannel.Streaming.Async
Key: SSHD-449
URL: https://issues.apache.org/jira/browse/SSHD-449
Project: MINA SSHD
Issue Type: Bug
Affects Versions: 0.14.0
Reporter: Yarin Benado
Priority: Critical
It looks like there is an issue with combining exec channel with \
ClientChannel.Streaming.Async.
You cannot use the channel.gerAsyncOut() to add a listener to it before the channel \
is opened, therefore open() call on the channel will fire the command to the server, \
and response might arrive before there are any listeners attached. If a listener is \
not attached in-time (in the test below even 100 millis are suffice to cause it to \
miss the registration) the channel simply returns an empty output on the stream.
Here is a test added in ClientTest.java that reproduces the problem:
{code}
@Test
public void testExecAsyncClient() throws Exception {
client.start();
ClientSession session = client.connect("smx", "localhost", \
port).await().getSession(); session.addPasswordIdentity("smx");
session.auth().verify();
final ByteArrayOutputStream baosOut = new ByteArrayOutputStream();
final ByteArrayOutputStream baosErr = new ByteArrayOutputStream();
final ChannelExec channel = session.createExecChannel("test");
channel.setStreaming(ClientChannel.Streaming.Async);
OpenFuture open = channel.open();
Thread.sleep(100); // Removing this line will make the test succeed
open.addListener(new SshFutureListener<OpenFuture>() {
public void operationComplete(OpenFuture future) {
channel.getAsyncOut().read(new Buffer())
.addListener(new SshFutureListener<IoReadFuture>() {
public void operationComplete(IoReadFuture future) {
try {
future.verify();
Buffer buffer = future.getBuffer();
baosOut.write(buffer.array(), buffer.rpos(), \
buffer.available());
buffer.rpos(buffer.rpos() + buffer.available());
buffer.compact();
channel.getAsyncOut().read(buffer).addListener(this);
} catch (IOException e) {
if (!channel.isClosing()) {
e.printStackTrace();
channel.close(true);
}
}
}
});
channel.getAsyncErr().read(new Buffer())
.addListener(new SshFutureListener<IoReadFuture>() {
public void operationComplete(IoReadFuture future) {
try {
future.verify();
Buffer buffer = future.getBuffer();
baosErr.write(buffer.array(), buffer.rpos(), \
buffer.available());
buffer.rpos(buffer.rpos() + buffer.available());
buffer.compact();
channel.getAsyncErr().read(buffer).addListener(this);
} catch (IOException e) {
if (!channel.isClosing()) {
e.printStackTrace();
channel.close(true);
}
}
}
});
}
});
channel.waitFor(ClientChannel.CLOSED, 0);
assertFalse(baosErr.size() == 0);
client.close(true);
}
{code}
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic