Not sure what version "4.1.0-rc1" denotes, so I tested with nightly smack-4.1.0-beta3-SNAPSHOT-2015-02-12. Per your request, below is trace from getCause() . Regression tested with previous smack-4.1.0-beta2-SNAPSHOT-2015-01-14 and results were same as below. Also included Raw Sent Packets and Raw Received Packets via SmackConfiguration.DEBUG = true, and my java class that implements FileTransferListener interface.
trace from getCause()
-------------------------------------
Connected to the target VM, address: '127.0.0.1:*****', transport: 'socket'
Connecting to XMPP Server.
test-receiver@test.tester.net/Smack now connected to 10.**.**.****
Added supported discovery features.
Added IQ extension providers required to parse file transfer stanzas.
Started listening
file named: some.txt
File transfer accepted for stream Id jsi_754030307435725279
File transfer NEGOTIATING STREAM
File transfer NEGOTIATING STREAM
org.jivesoftware.smack.SmackException: org.jivesoftware.smack.SmackException$NoResponseException: No response received within packet reply timeout. Timeout was 5000ms (~5s)
File transfer ERROR
Transfer exception occurred: org.jivesoftware.smack.SmackException: Error in execution
at org.jivesoftware.smackx.filetransfer.FaultTolerantNegotiator.createIncomingStre am(FaultTolerantNegotiator.java:119)
at org.jivesoftware.smackx.filetransfer.IncomingFileTransfer$2.call(IncomingFileTr ansfer.java:186)
at org.jivesoftware.smackx.filetransfer.IncomingFileTransfer$2.call(IncomingFileTr ansfer.java:183)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at org.jivesoftware.smackx.filetransfer.IncomingFileTransfer.negotiateStream(Incom ingFileTransfer.java:190)
at org.jivesoftware.smackx.filetransfer.IncomingFileTransfer.access$100(IncomingFi leTransfer.java:57)
at org.jivesoftware.smackx.filetransfer.IncomingFileTransfer$1.run(IncomingFileTra nsfer.java:129)
at java.lang.Thread.run(Thread.java:745)
Caused by: org.jivesoftware.smack.SmackException$NoResponseException: No response received within packet reply timeout. Timeout was 5000ms (~5s)
at org.jivesoftware.smackx.filetransfer.FaultTolerantNegotiator$NegotiatorService. call(FaultTolerantNegotiator.java:181)
at org.jivesoftware.smackx.filetransfer.FaultTolerantNegotiator$NegotiatorService. call(FaultTolerantNegotiator.java:170)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
... 1 more
Raw Sent Packets
--------------------------
<stream:stream xmlns='jabber:client' to='test.tester.net' xmlns:stream='http://etherx.jabber.org/streams' version='1.0' from='rad-discovery-receiver@test.tester.net' xml:lang='en'>
<auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl' mechanism='DIGEST-MD5'>=</auth>
<response xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>Y2hhcnNldD11dGYtOCx1c2VybmFtZT0icmFkLW Rpc2NvdmVyeS1yZWNlaXZlciIscmVhbG09InRhbGtpbnQuZW5lcm5vYy5uZXQiLG5vbmNlPSJUVjc3aH ZqN0Y0T3VQZ2JvcEZPQ0JwS0dWaWVJNzAzR1FSSzU0Rnc3IixuYz0wMDAwMDAwMSxjbm9uY2U9InJyam p1MlFSUFNiSFZGV2hxcjFPblJiK01ycGNmeThRNlZueDJQbEEiLGRpZ2VzdC11cmk9InhtcHAvdGFsa2 ludC5lbmVybm9jLm5ldCIsbWF4YnVmPTY1NTM2LHJlc3BvbnNlPWUyNGY1YzRlMmZjYzIwZWFkZjgwZW YwYjBiMTk1ODA4LHFvcD1hdXRo</response>
<stream:stream xmlns='jabber:client' to='test.tester.net' xmlns:stream='http://etherx.jabber.org/streams' version='1.0' from='rad-discovery-receiver@test.tester.net' id='87ee150' xml:lang='en'>
<iq id='3Pz4W-1' type='set'><bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'><resource>Smack</resource></bind></iq>
<iq id='3Pz4W-3' type='set'><session xmlns='urn:ietf:params:xml:ns:xmpp-session'/></iq>
<presence id='3Pz4W-5'></presence>
<iq to='test-sender@test.tester.net/Smack' id='hwMgM-6' type='result'>
<si xmlns='http://jabber.org/protocol/si'>
<feature xmlns="http://jabber.org/protocol/feature-neg">
<x xmlns='jabber:x:data' type='submit'>
<field var='stream-method'>
<value>http://jabber.org/protocol/bytestreams</value>
<value>http://jabber.org/protocol/ibb</value>
</field>
</x>
</feature>
</si>
</iq>
<iq to='test-sender@test.tester.net/Smack' id='hwMgM-8' type='result'>
<query xmlns='http://jabber.org/protocol/disco#info'>
<identity category='client' name='Smack' type='pc'/>
<feature var='http://jabber.org/protocol/commands'/>
<feature var='http://jabber.org/protocol/file-transfer'/>
<feature var='http://jabber.org/protocol/xhtml-im'/>
<feature var='jabber:iq:privacy'/>
<feature var='http://jabber.org/protocol/disco#items'/>
<feature var='vcard-temp'/>
<feature var='urn:xmpp:time'/>
<feature var='jabber:iq:last'/>
<feature var='urn:xmpp:ping'/>
<feature var='jabber:x:data'/>
<feature var='http://jabber.org/protocol/bytestreams'/>
<feature var='http://jabber.org/protocol/ibb'/>
<feature var='urn:xmpp:http'/>
<feature var='http://jabber.org/protocol/muc'/>
<feature var='http://jabber.org/protocol/si'/>
<feature var='http://jabber.org/protocol/xdata-validate'/>
<feature var='http://jabber.org/protocol/xdata-layout'/>
<feature var='http://jabber.org/protocol/si/profile/file-transfer'/>
<feature var='urn:xmpp:receipts'/>
<feature var='http://jabber.org/protocol/disco#info'/>
</query>
</iq>
Raw Received Packets
---------------------------------
<?xml version='1.0' encoding='UTF-8'?><stream:stream xmlns:stream="http://etherx.jabber.org/streams" xmlns="jabber:client" from="test.tester.net" id="87ee150" xml:lang="en" version="1.0">
<stream:features><starttls xmlns="urn:ietf:params:xml:ns:xmpp-tls"></starttls><mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><mechanism>DIGEST-MD5</mechanism><mech anism>PLAIN</mechanism><mechanism>CRAM-MD5</mechanism></mechanisms><compression xmlns="http://jabber.org/features/compress"><method>zlib</method></compression><auth xmlns="http://jabber.org/features/iq-auth"/><register xmlns="http://jabber.org/features/iq-register"/></stream:features>
<challenge xmlns="urn:ietf:params:xml:ns:xmpp-sasl">cmVhbG09InRhbGtpbnQuZW5lcm5vYy5uZXQiLG 5vbmNlPSJUVjc3aHZqN0Y0T3VQZ2JvcEZPQ0JwS0dWaWVJNzAzR1FSSzU0Rnc3Iixxb3A9ImF1dGgiLG NoYXJzZXQ9dXRmLTgsYWxnb3JpdGhtPW1kNS1zZXNz</challenge>
<success xmlns="urn:ietf:params:xml:ns:xmpp-sasl">cnNwYXV0aD0xMDliYzE0YWQzNjEzZWFlZjg2Nj c1NWI0NmMwNTI1Yw==</success>
<?xml version='1.0' encoding='UTF-8'?><stream:stream xmlns:stream="http://etherx.jabber.org/streams" xmlns="jabber:client" from="test.tester.net" id="87ee150" xml:lang="en" version="1.0"><stream:features><compression xmlns="http://jabber.org/features/compress"><method>zlib</method></compression><bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"/><session xmlns="urn:ietf:params:xml:ns:xmpp-session"/></stream:features>
<iq type="result" id="3Pz4W-1" to="test.tester.net/87ee150"><bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"><jid>test-receiver@test.tester.net/Smack</jid></bind></iq>
<iq type="result" id="3Pz4W-3" to="test-receiver@test.tester.net/Smack"><session xmlns="urn:ietf:params:xml:ns:xmpp-session"/></iq>
<iq to="test-receiver@test.tester.net/Smack" id="hwMgM-6" type="set" from="test-sender@test.tester.net/Smack">
<si xmlns="http://jabber.org/protocol/si" id="jsi_1515545864203081196" profile="http://jabber.org/protocol/si/profile/file-transfer">
<file xmlns="http://jabber.org/protocol/si/profile/file-transfer" name="some.txt" size="4830965">
<desc>file named: some.txt</desc>
</file>
<feature xmlns="http://jabber.org/protocol/feature-neg">
<x xmlns="jabber:x:data" type="form">
<field var="stream-method" type="list-single">
<option>
<value>http://jabber.org/protocol/bytestreams</value>
</option>
<option>
<value>http://jabber.org/protocol/ibb</value>
</option>
</field>
</x>
</feature>
</si>
</iq>
<iq to="test-receiver@test.tester.net/Smack" id="hwMgM-8" type="get" from="test-sender@test.tester.net/Smack">
<query xmlns="http://jabber.org/protocol/disco#info"/>
</iq>
<iq to="test-receiver@test.tester.net/Smack" id="hwMgM-9" type="set" from="test-sender@test.tester.net/Smack">
<open xmlns="http://jabber.org/protocol/ibb" block-size="4096" sid="jsi_1515545864203081196" stanza="iq"/>
</iq>
Implementation of FileTransferListener
----------------------------------------------------------
package com.test.tester;
import org.jivesoftware.smack.AbstractXMPPConnection;
import org.jivesoftware.smack.SmackException;
import org.jivesoftware.smack.provider.ProviderManager;
import org.jivesoftware.smackx.bytestreams.socks5.packet.Bytestream;
import org.jivesoftware.smackx.bytestreams.socks5.provider.BytestreamsProvider;
import org.jivesoftware.smackx.commands.provider.AdHocCommandDataProvider;
import org.jivesoftware.smackx.disco.ServiceDiscoveryManager;
import org.jivesoftware.smackx.disco.provider.DiscoverInfoProvider;
import org.jivesoftware.smackx.disco.provider.DiscoverItemsProvider;
import org.jivesoftware.smackx.filetransfer.*;
import org.jivesoftware.smackx.privacy.provider.PrivacyProvider;
import org.jivesoftware.smackx.si.provider.StreamInitiationProvider;
import java.io.File;
import java.util.UUID;
import java.util.concurrent.ExecutionException;
class Listener implements FileTransferListener
{
public Listener(AbstractXMPPConnection receiverConnection, String directory)
{
connection = receiverConnection;
directoryToSaveFile = directory;
serviceDiscoveryManager = null;
manager = FileTransferManager.getInstanceFor(this.connection);
}
private AbstractXMPPConnection connection;
private ServiceDiscoveryManager serviceDiscoveryManager;
private String directoryToSaveFile;
private FileTransferManager manager;
public void AddServiceDiscoveryManagerFeatures()
{
serviceDiscoveryManager = ServiceDiscoveryManager.getInstanceFor(connection);
serviceDiscoveryManager.addFeature("http://jabber.org/protocol/disco#info");
serviceDiscoveryManager.addFeature("jabber:iq:privacy");
serviceDiscoveryManager.addFeature("http://jabber.org/protocol/file-transfer");
serviceDiscoveryManager.addFeature("http://jabber.org/protocol/si");
serviceDiscoveryManager.addFeature("http://jabber.org/protocol/bytestreams");
//serviceDiscoveryManager.addFeature("http://jabber.org/protocol/ibb");
System.out.println("Added supported discovery features.");
}
public void AddIQExtensionProviders()
{
ProviderManager.addIQProvider("query", "http://jabber.org/protocol/disco#items", new DiscoverItemsProvider());
ProviderManager.addIQProvider("query", "http://jabber.org/protocol/disco#info", new DiscoverInfoProvider());
ProviderManager.addIQProvider("query", "jabber:iq:privacy", new PrivacyProvider());
ProviderManager.addIQProvider("malformed-action", "http://jabber.org/protocol/commands", new AdHocCommandDataProvider());
ProviderManager.addIQProvider("si", "http://jabber.org/protocol/si", new StreamInitiationProvider());
//Parses a bytestream packet
//ProviderManager.addIQProvider("query", "http://jabber.org/protocol/bytestreams", new BytestreamsProvider());
ProviderManager.addIQProvider(Bytestream.QUERY_ELEMENT, Bytestream.NAMESPACE, new BytestreamsProvider());
ProviderManager.addIQProvider(Bytestream.StreamHost.ELEMENTNAME, Bytestream.NAMESPACE, new BytestreamsProvider());
ProviderManager.addIQProvider(Bytestream.StreamHostUsed.ELEMENTNAME, Bytestream.NAMESPACE, new BytestreamsProvider());
//Parses an In-Band Bytestream open packet.
//TODO: don't understand what IQProviders to use for IIB. This is not an asmack app, just desktop machine on Win7. Skipping IIB for now...
//ProviderManager.addIQProvider("open", "http://jabber.org/protocol/ibb", new OpenIQProvider());
//ProviderManager.addIQProvider("data", "http://jabber.org/protocol/ibb", new DataPacketProvider.IQProvider());
//ProviderManager.addIQProvider("close", "http://jabber.org/protocol/ibb", new CloseIQProvider());
//ProviderManager.addExtensionProvider("data", "http://jabber.org/protocol/ibb", new DataPacketProvider.PacketExtensionProvider());
System.out.println("Added IQ extension providers required to parse file transfer stanzas.");
}
public void startListening()
{
System.out.println("Started listening");
manager.addFileTransferListener(this);
}
public void stopListening()
{
manager.removeFileTransferListener(this);
System.out.println("Stopped listening");
}
/**
* Required implementation of interface. This is where the file transfer takes place
* @see FileTransferListener
* @param fileTransferRequest
*/
@Override
public void fileTransferRequest(FileTransferRequest fileTransferRequest)
{
try
{
final String uniqueFilename = String.format("%s_%s",UUID.randomUUID().toString(), fileTransferRequest.getFileName() );
final File file = new File( directoryToSaveFile + uniqueFilename );
System.out.println(fileTransferRequest.getDescription());
IncomingFileTransfer transfer = fileTransferRequest.accept();
System.out.println("File transfer accepted for stream Id " + fileTransferRequest.getStreamID());
/*** tried this approach, get same transfer error
InputStream inputStream = transfer.recieveFile();
byte[] buffer = new byte[inputStream.available()];
inputStream.read(buffer);
File targetFile = new File(directoryToSaveFile + uniqueFilename );
OutputStream outStream = new FileOutputStream(targetFile);
outStream.write(buffer);
***/
transfer.recieveFile(file); //give handle to file sys, which streams out buffered contents
while (!transfer.isDone())
{
Thread.sleep(2000L);
if (transfer.getStatus().equals(FileTransfer.Status.cancelled)) {
System.out.println("File transfer CANCELLED");
}
if (transfer.getStatus().equals(FileTransfer.Status.complete)) {
System.out.println("File transfer COMPLETE");
}
if (transfer.getStatus().equals(FileTransfer.Status.error)) {
System.out.println("File transfer ERROR");
transfer.cancel();
}
if (transfer.getStatus().equals(FileTransfer.Status.in_progress)) {
System.out.println("File transfer IN PROGRESS");
}
if (transfer.getStatus().equals(FileTransfer.Status.negotiating_transfer)) {
System.out.println("File transfer IN NEGOTIATING");
}
if (transfer.getStatus().equals(FileTransfer.Status.initial)) {
System.out.println("File now transfer INITIAL");
}
if (transfer.getStatus().equals(FileTransfer.Status.negotiating_stream)) {
System.out.println("File transfer NEGOTIATING STREAM");
}
if (transfer.getStatus().equals(FileTransfer.Status.refused)) {
System.out.println("File transfer REFUSED");
}
}
FileTransfer.Error transferError = transfer.getError();
if (transferError != null)
{
System.out.println(transferError.getMessage());
}
Exception transferException = transfer.getException();
if (transferException != null)
{
System.out.println("Transfer exception occurred: " + transferException);
//FLOW, asked me to add this: it captures the stack frame for thread of interest
ExecutionException executionException = (ExecutionException) transferException.getCause();
if (executionException != null)
{
// this should be not null
Throwable causingException = executionException.getCause();
causingException.printStackTrace();
}
}
if (transferError != null && transferException != null)
{
System.out.println("File receive SUCCEEDED!");
}
}
catch (SmackException se)
{
System.out.println("Caught SmackException in fileTransferRequest");
ExecutionException executionException = (ExecutionException) se.getCause();
if (executionException != null)
{
// this should be not null
Throwable causingException = executionException.getCause();
causingException.printStackTrace();
}
}
catch (Exception e)
{
ExecutionException executionException = (ExecutionException) e.getCause();
if (executionException != null)
{
// this should be not null
Throwable causingException = executionException.getCause();
causingException.printStackTrace();
}
System.out.println("Caught Exception in fileTransferRequest");
System.out.println(e.getMessage());
}
}
}