File tree 3 files changed +42
-8
lines changed
3 files changed +42
-8
lines changed Original file line number Diff line number Diff line change
1
+ defmodule Redex.Command do
2
+ @ crlf "\r \n "
3
+ @ invalid_command_message "Command invalid or not implemented"
4
+
5
+
6
+ def execute ( [ command | _args ] ) do
7
+ case command |> String . upcase do
8
+ "COMMAND" -> "+OK" <> @ crlf
9
+ "PING" -> "+PONG" <> @ crlf
10
+ _ -> raise @ invalid_command_message
11
+ end
12
+ end
13
+ end
14
+
Original file line number Diff line number Diff line change @@ -35,19 +35,34 @@ defmodule Redex.Server do
35
35
defp loop_acceptor ( socket ) do
36
36
{ :ok , client } = :gen_tcp . accept ( socket )
37
37
Logger . debug "new client"
38
+
39
+ # TODO: should use a supervisor here
38
40
Task . start ( fn -> handle_client ( client ) end )
39
41
loop_acceptor ( socket )
40
42
end
41
43
42
- defp handle_client ( socket ) do
43
- case socket |> read_line ( ) do
44
+ defp close_connection ( socket , reason ) do
45
+ :gen_tcp . close ( socket )
46
+ Logger . debug "connection closed: #{ reason } "
47
+ end
48
+
49
+ defp handle_client ( socket , resume \\ nil ) do
50
+ case socket |> read_line ( ) do
44
51
{ :ok , line } ->
45
- IO . inspect line
46
- write_line ( "+PONG\r \n " , socket )
47
- handle_client ( socket )
48
- { :error , error } ->
49
- :gen_tcp . close ( socket )
50
- Logger . debug "connection closed: #{ error } "
52
+ try do
53
+ line = String . trim ( line )
54
+ result = if resume == nil do Redex.RESPDecoder . read ( line ) else resume . ( line ) end
55
+
56
+ if is_function ( result ) do
57
+ handle_client ( socket , result )
58
+ else
59
+ result |> Redex.Command . execute |> write_line ( socket )
60
+ handle_client ( socket )
61
+ end
62
+ rescue
63
+ e in RuntimeError -> close_connection ( socket , e . message )
64
+ end
65
+ { :error , error } -> close_connection ( socket , error )
51
66
end
52
67
end
53
68
Original file line number Diff line number Diff line change @@ -38,4 +38,9 @@ defmodule RedexServerTest do
38
38
{ :ok , conn2 } = get_connection ( )
39
39
assert Redix . command! ( conn2 , [ "PING" ] ) == "PONG"
40
40
end
41
+
42
+ test "it can handle mutiple commands from same client" , % { conn: conn } do
43
+ assert Redix . command! ( conn , [ "PING" ] ) == "PONG"
44
+ assert Redix . command! ( conn , [ "PING" ] ) == "PONG"
45
+ end
41
46
end
You can’t perform that action at this time.
0 commit comments