Quantcast
Channel: Ignite Realtime: Message List
Viewing all articles
Browse latest Browse all 11413

Re: IncomingFileTransfer recieveFile(..) throws "error in execution"

$
0
0

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());

        }

    }

}


Viewing all articles
Browse latest Browse all 11413

Trending Articles