|
20 | 20 | import ctypes.util |
21 | 21 | from ctypes import c_ssize_t |
22 | 22 | from typing import Optional, Union |
| 23 | +from copy import copy |
23 | 24 |
|
24 | 25 | import msgpack |
25 | 26 |
|
@@ -838,6 +839,10 @@ def __init__(self, host, port, |
838 | 839 | self.version_id = None |
839 | 840 | self.uuid = None |
840 | 841 | self._salt = None |
| 842 | + self._client_protocol_version = CONNECTOR_IPROTO_VERSION |
| 843 | + self._client_features = copy(CONNECTOR_FEATURES) |
| 844 | + self._server_protocol_version = None |
| 845 | + self._server_features = None |
841 | 846 |
|
842 | 847 | if connect_now: |
843 | 848 | self.connect() |
@@ -1044,10 +1049,11 @@ def handshake(self): |
1044 | 1049 | if greeting.protocol != "Binary": |
1045 | 1050 | raise NetworkError("Unsupported protocol: " + greeting.protocol) |
1046 | 1051 | self.version_id = greeting.version_id |
1047 | | - if self.version_id >= version_id(2, 10, 0): |
1048 | | - self._check_features() |
1049 | 1052 | self.uuid = greeting.uuid |
1050 | 1053 | self._salt = greeting.salt |
| 1054 | + |
| 1055 | + self._check_features() |
| 1056 | + |
1051 | 1057 | if self.user: |
1052 | 1058 | self.authenticate(self.user, self.password) |
1053 | 1059 |
|
@@ -2057,32 +2063,28 @@ def _check_features(self): |
2057 | 2063 | :exc:`~tarantool.error.SslError` |
2058 | 2064 | """ |
2059 | 2065 |
|
2060 | | - try: |
2061 | | - request = RequestProtocolVersion(self, |
2062 | | - CONNECTOR_IPROTO_VERSION, |
2063 | | - CONNECTOR_FEATURES) |
2064 | | - response = self._send_request(request) |
2065 | | - server_protocol_version = response.protocol_version |
2066 | | - server_features = response.features |
2067 | | - server_auth_type = response.auth_type |
2068 | | - except DatabaseError as exc: |
2069 | | - if exc.code == ER_UNKNOWN_REQUEST_TYPE: |
2070 | | - server_protocol_version = None |
2071 | | - server_features = [] |
2072 | | - server_auth_type = None |
2073 | | - else: |
2074 | | - raise exc |
2075 | | - |
2076 | | - if server_protocol_version is not None: |
2077 | | - self._protocol_version = min(server_protocol_version, |
2078 | | - CONNECTOR_IPROTO_VERSION) |
| 2066 | + if self.version_id >= version_id(2, 10, 0): |
| 2067 | + try: |
| 2068 | + request = RequestProtocolVersion(self, |
| 2069 | + self._client_protocol_version, |
| 2070 | + self._client_features) |
| 2071 | + response = self._send_request(request) |
| 2072 | + self._server_protocol_version = response.protocol_version |
| 2073 | + self._server_features = response.features |
| 2074 | + self._server_auth_type = response.auth_type |
| 2075 | + except DatabaseError as exc: |
| 2076 | + if exc.code != ER_UNKNOWN_REQUEST_TYPE: |
| 2077 | + raise exc |
| 2078 | + |
| 2079 | + if self._server_protocol_version is not None: |
| 2080 | + self._protocol_version = min(self._server_protocol_version, |
| 2081 | + self._client_protocol_version) |
2079 | 2082 |
|
2080 | 2083 | # Intercept lists of features |
2081 | | - features_list = [val for val in CONNECTOR_FEATURES if val in server_features] |
2082 | | - for val in features_list: |
2083 | | - self._features[val] = True |
2084 | | - |
2085 | | - self._server_auth_type = server_auth_type |
| 2084 | + if self._server_features is not None: |
| 2085 | + features_list = [val for val in self._client_features if val in self._server_features] |
| 2086 | + for val in features_list: |
| 2087 | + self._features[val] = True |
2086 | 2088 |
|
2087 | 2089 | def _packer_factory(self): |
2088 | 2090 | return self._packer_factory_impl(self) |
|
0 commit comments