Details

    • Type: Bug Bug
    • Status: Resolved
    • Priority: Major Major
    • Resolution: Fixed
    • Affects Version/s: None
    • Fix Version/s: 0.6.0
    • Labels:
      None

      Description

      I found a case where I need to implement something of this concept:
      "gzip /tmp/sample.txt | ssh user@some.host.com gunzip -c > /tmp/sample.txt"

      I'm implementing a client that gzip's the file and send it to a remote machine
      in stdin. Here's a snip of my implementation:

      // Create the GZIP output stream
      ByteArrayOutputStream baosGZipped = new ByteArrayOutputStream ();
      GZIPOutputStream gzOut = new GZIPOutputStream(baosGZipped);

      // Open the input file
      FileInputStream src = new FileInputStream(sourceFileName);

      byte[] buf = new byte[1024];
      int len;
      while ((len = src.read(buf)) > 0)

      { gzOut.write(buf, 0, len); }

      src.close();

      // Complete the GZIP file
      gzOut.finish();
      gzOut.flush();
      gzOut.close();

      //create channel
      ClientChannel channel = session.createExecChannel("gunzip -c >" + destFile);

      ByteArrayInputStream in = new ByteArrayInputStream(baosGZipped.toByteArray());
      channel.setIn(in);
      ByteArrayOutputStream out = new ByteArrayOutputStream();
      channel.setOut(out);
      ByteArrayOutputStream err = new ByteArrayOutputStream();
      channel.setErr(err);

      //open channel
      channel.open();

      //wait close
      channel.waitFor(ClientChannel.CLOSED, 0);

      What I discovered is that this will never end !!!
      The problem is, that there's a pumpInputStream in ClientInputStreamPump thread (org/apache/sshd/client/channel/ChannelSession.java),
      that will never end until closeFuture.isClosed. Since this does not happen, the unzip in the remote host doesn't end, and the channel will
      never close. This prevents the client from a proper pipe implementation.

      There should be a method to properly end this while-loop thus the remote side will be able to finish and close.
      ie-
      public void CloseStream()

      { streamStop = true; }

      and change pumpInputStream like this:
      -while (!closeFuture.isClosed())
      +while (!closeFuture.isClosed() && !streamStop)

        Activity

        Doron Fediuck created issue -
        Guillaume Nodet made changes -
        Field Original Value New Value
        Status Open [ 1 ] Resolved [ 5 ]
        Assignee Guillaume Nodet [ gnt ]
        Fix Version/s 0.6.0 [ 12315514 ]
        Resolution Fixed [ 1 ]
        Guillaume Nodet made changes -
        Summary Client pipe EOF is not send by the client

          People

          • Assignee:
            Guillaume Nodet
            Reporter:
            Doron Fediuck
          • Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development