@@ -141,13 +141,7 @@ defmodule Redix.Protocol do
141
141
142
142
defp parse_integer_without_sign ( << digit , _ :: binary >> = bin ) when digit in ?0 .. ?9 do
143
143
resolve_cont ( parse_integer_digits ( bin , 0 ) , fn i , rest ->
144
- resolve_cont ( until_crlf ( rest ) , fn
145
- "" , rest ->
146
- { :ok , i , rest }
147
-
148
- << char , _ :: binary >> , _rest ->
149
- raise ParseError , message: "expected CRLF, found: #{ inspect ( << char >> ) } "
150
- end )
144
+ resolve_cont ( crlf ( rest ) , fn :no_value , rest -> { :ok , i , rest } end )
151
145
end )
152
146
end
153
147
@@ -167,17 +161,19 @@ defmodule Redix.Protocol do
167
161
{ :ok , nil , rest }
168
162
169
163
size , rest ->
170
- parse_string_of_known_size ( rest , size )
164
+ parse_string_of_known_size ( rest , _acc = [ ] , _size_left = size )
171
165
end )
172
166
end
173
167
174
- defp parse_string_of_known_size ( data , size ) do
168
+ defp parse_string_of_known_size ( data , acc , size_left ) do
175
169
case data do
176
- << str :: bytes - size ( size ) , @ crlf , rest :: binary >> ->
177
- { :ok , str , rest }
170
+ str when byte_size ( str ) < size_left ->
171
+ { :continuation , & parse_string_of_known_size ( & 1 , [ acc | str ] , size_left - byte_size ( str ) ) }
178
172
179
- _ ->
180
- { :continuation , & parse_string_of_known_size ( data <> & 1 , size ) }
173
+ << str :: bytes - size ( size_left ) , rest :: binary >> ->
174
+ resolve_cont ( crlf ( rest ) , fn :no_value , rest ->
175
+ { :ok , IO . iodata_to_binary ( [ acc | str ] ) , rest }
176
+ end )
181
177
end
182
178
end
183
179
@@ -198,6 +194,13 @@ defmodule Redix.Protocol do
198
194
defp until_crlf ( << ?\r >> , acc ) , do: { :continuation , & until_crlf ( << ?\r , & 1 :: binary >> , acc ) }
199
195
defp until_crlf ( << byte , rest :: binary >> , acc ) , do: until_crlf ( rest , << acc :: binary , byte >> )
200
196
197
+ defp crlf ( << @ crlf , rest :: binary >> ) , do: { :ok , :no_value , rest }
198
+ defp crlf ( << ?\r >> ) , do: { :continuation , & crlf ( << ?\r , & 1 :: binary >> ) }
199
+ defp crlf ( << >> ) , do: { :continuation , & crlf / 1 }
200
+
201
+ defp crlf ( << byte , _ :: binary >> ) ,
202
+ do: raise ( ParseError , message: "expected CRLF, found: #{ inspect ( << byte >> ) } " )
203
+
201
204
defp take_elems ( data , 0 , acc ) do
202
205
{ :ok , Enum . reverse ( acc ) , data }
203
206
end
0 commit comments