diff src/ch/ethz/ssh2/transport/ClientServerHello.java @ 336:63b23b7c840d ganymed

still hangs during connection
author Carl Byington <carl@five-ten-sg.com>
date Thu, 31 Jul 2014 14:58:57 -0700
parents e25e377d29d3
children 0d0d2fc9918c
line wrap: on
line diff
--- a/src/ch/ethz/ssh2/transport/ClientServerHello.java	Thu Jul 31 14:35:37 2014 -0700
+++ b/src/ch/ethz/ssh2/transport/ClientServerHello.java	Thu Jul 31 14:58:57 2014 -0700
@@ -7,8 +7,6 @@
 
 import java.io.IOException;
 import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.LineNumberReader;
 import java.io.OutputStream;
 
 import ch.ethz.ssh2.util.StringEncoder;
@@ -21,6 +19,39 @@
     private final String client_line;
     private final String server_line;
 
+    public final static int readLineRN(InputStream is, byte[] buffer) throws IOException {
+        int pos = 0;
+        boolean need10 = false;
+        int len = 0;
+
+        while (true) {
+            int c = is.read();
+
+            if (c == -1)
+                throw new IOException("Premature connection close");
+
+            buffer[pos++] = (byte) c;
+
+            if (c == 13) {
+                need10 = true;
+                continue;
+            }
+
+            if (c == 10)
+                break;
+
+            if (need10 == true)
+                throw new IOException("Malformed line sent by the server, the line does not end correctly.");
+
+            len++;
+
+            if (pos >= buffer.length)
+                throw new IOException("The server sent a too long line.");
+        }
+
+        return len;
+    }
+
     private ClientServerHello(String client_line, String server_line) {
         this.client_line = client_line;
         this.server_line = server_line;
@@ -42,14 +73,15 @@
         bo.write(StringEncoder.GetBytes(String.format("%s\r\n", localIdentifier)));
         bo.flush();
         // Expect SSH-protoversion-softwareversion SP comments CR LF
-        InputStreamReader isr = new InputStreamReader(bi);
-        LineNumberReader  lnr = new LineNumberReader(isr);
-        String remoteIdentifier = lnr.readLine();
-        if ((bi.available()==0) && lnr.ready()) {
-            int  a= 1;  // break
+        byte[] serverVersion = new byte[512];
+        String remoteIdentifier;
+        for (int i = 0; i < 50; i++) {
+            int len = readLineRN(bi, serverVersion);
+            remoteIdentifier = new String(serverVersion, 0, len, "ISO-8859-1");
+            if (remoteIdentifier.startsWith("SSH-")) break;
         }
 
-        if (null == remoteIdentifier) {
+        if (remoteIdentifier.equals("")) {
             throw new IOException("Premature connection close");
         }