lib: Replaced uses of read_char by read_byte when applicable
authorLucas Bajolet <r4pass@hotmail.com>
Wed, 13 May 2015 15:22:02 +0000 (11:22 -0400)
committerLucas Bajolet <r4pass@hotmail.com>
Wed, 13 May 2015 15:22:02 +0000 (11:22 -0400)
Signed-off-by: Lucas Bajolet <r4pass@hotmail.com>

lib/csv/csv.nit
lib/filter_stream.nit
lib/saxophonit/lexer.nit
lib/standard/stream.nit
lib/websocket/websocket.nit

index c6f0b41..f76d41c 100644 (file)
@@ -314,10 +314,9 @@ class CsvReader
                var got_delimiter = false
 
                loop
-                       var i = istream.read_char
-                       var c: Char
+                       var c = istream.read_char
 
-                       if i < 0 then
+                       if c == null then
                                if got_row then
                                        row.add value.to_s
                                        return row
@@ -325,7 +324,6 @@ class CsvReader
                                        return null
                                end
                        end
-                       c = i.ascii
 
                        if c == format.delimiter then
                                if got_delimiter and unescaped == 0 then
@@ -334,11 +332,10 @@ class CsvReader
                                end
                                # Read all bytes until the delimiter.
                                loop
-                                       i = istream.read_char
-                                       assert not_eof: i >= 0 else
+                                       c = istream.read_char
+                                       assert not_eof: c != null else
                                                sys.stderr.write "Unexpected end of file before the end of a delimited value.\n"
                                        end
-                                       c = i.ascii
                                        if c == format.delimiter then break
                                        value.add c
                                end
index c5baa32..f1537e4 100644 (file)
@@ -65,7 +65,7 @@ class StreamCat
                return res
        end
 
-       redef fun read_char: Int
+       redef fun read_char
        do
                assert not eof
                return stream.read_char
index f95e5e3..a84802d 100644 (file)
@@ -254,17 +254,21 @@ class XophonLexer
                        locator.column_number += 1
                end
 
-               last_char = input.read_char
-               if last_char < 0 then
+               var s = input.read_byte
+               if s == null then
+                       last_char = -1
                        return
                end
+               last_char = s
 
                # XML 1.0 end-of-line handling
                # Note: Regardless the XML version, any EOL defined by the
                # recommandation MUST be reported as a single LINE FEED.
                if was_cr and last_char == '\n'.ascii then
                        # EOL already reported. => Skip this byte.
-                       last_char = input.read_char
+                       s = input.read_byte
+                       if s == null then s = -1
+                       last_char = s
                end
                was_cr = last_char == '\r'.ascii
                if was_cr then
index 33b9fc2..884368d 100644 (file)
@@ -42,10 +42,10 @@ end
 # A `Stream` that can be read from
 abstract class Reader
        super Stream
-       # Read a character. Returns `null` on EOF or timeout
+       # Reads a character. Returns `null` on EOF or timeout
        fun read_char: nullable Char is abstract
 
-       # Reads a byte, returns `null` if EOF or timeout
+       # Reads a byte. Returns `null` on EOF or timeout
        fun read_byte: nullable Int is abstract
 
        # Read at most i bytes
index 7e4d329..a22c5b2 100644 (file)
@@ -150,8 +150,13 @@ class WebsocketConnection
        private fun unpad_message do
                var fin = false
                while not fin do
-                       var fst_char = client.read_char
-                       var snd_char = client.read_char
+                       var fst_byte = client.read_byte
+                       var snd_byte = client.read_byte
+                       if fst_byte == null or snd_byte == null then
+                               last_error = new IOError("Error: bad frame")
+                               client.close
+                               return
+                       end
                        # First byte in msg is formatted this way :
                        # |(fin - 1bit)|(RSV1 - 1bit)|(RSV2 - 1bit)|(RSV3 - 1bit)|(opcode - 4bits)
                        # fin = Flag indicating if current frame is the last one
@@ -165,9 +170,9 @@ class WebsocketConnection
                        #       %x9 denotes a ping
                        #       %xA denotes a pong
                        #       %xB-F are reserved for further control frames
-                       var fin_flag = fst_char.bin_and(128)
+                       var fin_flag = fst_byte.bin_and(128)
                        if fin_flag != 0 then fin = true
-                       var opcode = fst_char.bin_and(15)
+                       var opcode = fst_byte.bin_and(15)
                        if opcode == 9 then
                                _buffer.add(138.ascii)
                                _buffer.add('\0')
@@ -183,20 +188,30 @@ class WebsocketConnection
                        # |(mask - 1bit)|(payload length - 7 bits)
                        # As specified, if the payload length is 126 or 127
                        # The next 16 or 64 bits contain an extended payload length
-                       var mask_flag = snd_char.bin_and(128)
-                       var len = snd_char.bin_and(127)
+                       var mask_flag = snd_byte.bin_and(128)
+                       var len = snd_byte.bin_and(127)
                        var payload_ext_len = 0
                        if len == 126 then
-                               payload_ext_len = client.read_char.lshift(8)
-                               payload_ext_len += client.read_char
+                               var tmp = client.read(2)
+                               if tmp.length != 2 then
+                                       last_error = new IOError("Error: received interrupted frame")
+                                       client.close
+                                       return
+                               end
+                               payload_ext_len = tmp[1].ascii + tmp[0].ascii.lshift(8)
                        else if len == 127 then
                                # 64 bits for length are not supported,
                                # only the last 32 will be interpreted as a Nit Integer
-                               for i in [0..4[ do client.read_char
-                               payload_ext_len = client.read_char.lshift(24)
-                               payload_ext_len += client.read_char.lshift(16)
-                               payload_ext_len += client.read_char.lshift(8)
-                               payload_ext_len += client.read_char
+                               var tmp = client.read(8)
+                               if tmp.length != 8 then
+                                       last_error = new IOError("Error: received interrupted frame")
+                                       client.close
+                                       return
+                               end
+                               for pos in [0 .. tmp.length[ do
+                                       var i = tmp[pos].ascii
+                                       payload_ext_len += i.lshift(8 * (7 - pos))
+                               end
                        end
                        if mask_flag != 0 then
                                if payload_ext_len != 0 then