Просмотр исходного кода

rpc: Use CRLF for line endings in the protocol.

Reading still supports LF-only, but generally the protocol should use CRLF.
parazyd 2 лет назад
Родитель
Сommit
26ee5897cf
1 измененных файлов с 20 добавлено и 5 удалено
  1. 20 5
      src/rpc/common.rs

+ 20 - 5
src/rpc/common.rs

@@ -49,7 +49,15 @@ pub(super) async fn read_from_stream(
                 Ok(0) => break, // Finished reading
                 Ok(0) => break, // Finished reading
                 Ok(n) => {
                 Ok(n) => {
                     total_read += n;
                     total_read += n;
-                    if buf[total_read - 1] == b'\n' {
+                    if buf[total_read - 1] == b'\n' || buf[total_read - 1] == b'\r' {
+                        // Check for '\n' or '\r' character
+                        break
+                    }
+                    if total_read >= 2 &&
+                        buf[total_read - 2] == b'\r' &&
+                        buf[total_read - 1] == b'\n'
+                    {
+                        // Handle '\r\n' sequence
                         break
                         break
                     }
                     }
                 }
                 }
@@ -66,7 +74,15 @@ pub(super) async fn read_from_stream(
                 Ok(0) => break, // Finished reading
                 Ok(0) => break, // Finished reading
                 Ok(n) => {
                 Ok(n) => {
                     total_read += n;
                     total_read += n;
-                    if buf[total_read - 1] == b'\n' {
+                    if buf[total_read - 1] == b'\n' || buf[total_read - 1] == b'\r' {
+                        // Check for '\n' or '\r' character
+                        break
+                    }
+                    if total_read >= 2 &&
+                        buf[total_read - 2] == b'\r' &&
+                        buf[total_read - 1] == b'\n'
+                    {
+                        // Handle '\r\n' sequence
                         break
                         break
                     }
                     }
                 }
                 }
@@ -94,9 +110,8 @@ pub(super) async fn write_to_stream(
         _ => unreachable!(),
         _ => unreachable!(),
     };
     };
 
 
-    // As we're a line-based protocol, we append the '\n' char at
-    // the end of the JSON string.
-    for i in [object_str.as_bytes(), &[b'\n']] {
+    // As we're a line-based protocol, we append CRLF to the end of the JSON string.
+    for i in [object_str.as_bytes(), &[b'\r', b'\n']] {
         if let Err(e) = writer.write_all(i).await {
         if let Err(e) = writer.write_all(i).await {
             return Err(e.into())
             return Err(e.into())
         }
         }