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

Merge pull request #183 from seriyps/handle-all-connect-errors

Handle all server errors. Fixes #182
Sergey Prokhorov 6 лет назад
Родитель
Сommit
85ce294294
2 измененных файлов с 36 добавлено и 7 удалено
  1. 10 7
      src/commands/epgsql_cmd_connect.erl
  2. 26 0
      test/epgsql_SUITE.erl

+ 10 - 7
src/commands/epgsql_cmd_connect.erl

@@ -245,13 +245,16 @@ handle_message(?READY_FOR_QUERY, _, Sock, _State) ->
 
 
 %% ErrorResponse
-handle_message(?ERROR, Err, Sock, #connect{stage = Stage} = _State) when Stage == auth;
-                                                                         Stage == maybe_auth ->
-    Why = case Err#error.code of
-        <<"28000">> -> invalid_authorization_specification;
-        <<"28P01">> -> invalid_password;
-        Any         -> Any
-    end,
+handle_message(?ERROR, #error{code = Code} = Err, Sock, #connect{stage = Stage} = _State) ->
+    IsAuthStage = (Stage == auth) orelse (Stage == maybe_auth),
+    Why = case Code of
+              <<"28000">> when IsAuthStage ->
+                  invalid_authorization_specification;
+              <<"28P01">> when IsAuthStage ->
+                  invalid_password;
+              _ ->
+                  Err
+          end,
     {stop, normal, {error, Why}, Sock};
 handle_message(_, _, _, _) ->
     unknown.

+ 26 - 0
test/epgsql_SUITE.erl

@@ -41,6 +41,8 @@ groups() ->
             connect_with_scram,
             connect_with_invalid_user,
             connect_with_invalid_password,
+            connect_to_invalid_database,
+            connect_with_other_error,
             connect_with_ssl,
             connect_with_client_cert,
             connect_to_closed_port,
@@ -230,6 +232,30 @@ connect_with_invalid_password(Config) ->
         invalid_password                    -> ok  % >= 9.0
     end.
 
+connect_to_invalid_database(Config) ->
+    {Host, Port} = epgsql_ct:connection_data(Config),
+    Module = ?config(module, Config),
+    ?assertMatch(
+       {error, invalid_authorization_specification},
+       Module:connect(
+        Host,
+        "epgsql_test_md5",
+        "epgsql_test_md5",
+        [{port, Port}, {database, "epgsql_test_invalid_db"}])).
+
+connect_with_other_error(Config) ->
+    {Host, Port} = epgsql_ct:connection_data(Config),
+    Module = ?config(module, Config),
+    ?assertMatch(
+       {error,
+        #error{severity = fatal,
+               codename = protocol_violation}},
+       Module:connect(
+        Host,
+        <<0, 0>>,
+        "epgsql_test_invalid",
+        [{port, Port}, {database, <<0, 0>>}])).
+
 connect_with_ssl(Config) ->
     Module = ?config(module, Config),
     epgsql_ct:with_connection(Config,