1414
1515from ravendb import constants
1616from ravendb .documents .session .entity_to_json import EntityToJson
17- from ravendb .documents .commands .subscriptions import GetTcpInfoForRemoteTaskCommand
17+ from ravendb .documents .commands .subscriptions import GetTcpInfoForRemoteTaskCommand , TcpConnectionInfo
1818from ravendb .documents .session .document_session_operations .in_memory_document_session_operations import (
1919 InMemoryDocumentSessionOperations ,
2020)
@@ -319,21 +319,16 @@ def _connect_to_server(self) -> socket:
319319 except ClientVersionMismatchException :
320320 tcp_info = self ._legacy_try_get_tcp_info (request_executor )
321321
322- self ._tcp_client , chosen_url = TcpUtils .connect_with_priority (
323- tcp_info , command .result .certificate , self ._store .certificate_pem_path
322+ result = TcpUtils .connect_secured_tcp_socket (
323+ tcp_info ,
324+ command .result .certificate ,
325+ self ._store .certificate_pem_path ,
326+ None ,
327+ TcpConnectionHeaderMessage .OperationTypes .SUBSCRIPTION ,
328+ self .__negotiate_protocol_version_for_subscription ,
324329 )
325-
326- database_name = self ._store .get_effective_database (self ._db_name )
327-
328- parameters = TcpNegotiateParameters ()
329- parameters .database = database_name
330- parameters .operation = TcpConnectionHeaderMessage .OperationTypes .SUBSCRIPTION
331- parameters .version = TcpConnectionHeaderMessage .SUBSCRIPTION_TCP_VERSION
332- parameters .read_response_and_get_version_callback = self ._read_server_response_and_get_version
333- parameters .destination_node_tag = self .current_node_tag
334- parameters .destination_url = chosen_url
335-
336- self ._supported_features = TcpNegotiation .negotiate_protocol_version (self ._tcp_client , parameters )
330+ self ._tcp_client = result .socket
331+ self ._supported_features = result .supported_features
337332
338333 if self ._supported_features .protocol_version <= 0 :
339334 raise RuntimeError (
@@ -363,6 +358,22 @@ def _connect_to_server(self) -> socket:
363358
364359 return self ._tcp_client
365360
361+ def __negotiate_protocol_version_for_subscription (
362+ self , chosen_url : str , tcp_info : TcpConnectionInfo , s : socket
363+ ) -> TcpConnectionHeaderMessage .SupportedFeatures :
364+ database_name = self ._store .get_effective_database (self ._db_name )
365+
366+ parameters = TcpNegotiateParameters ()
367+ parameters .database = database_name
368+ parameters .operation = TcpConnectionHeaderMessage .OperationTypes .SUBSCRIPTION
369+ parameters .version = TcpConnectionHeaderMessage .SUBSCRIPTION_TCP_VERSION
370+ parameters .read_response_and_get_version_callback = self ._read_server_response_and_get_version
371+ parameters .destination_node_tag = self .current_node_tag
372+ parameters .destination_url = chosen_url
373+ parameters .destination_server_id = tcp_info .server_id
374+
375+ return TcpNegotiation .negotiate_protocol_version (s , parameters )
376+
366377 def _legacy_try_get_tcp_info (self , request_executor : RequestExecutor , node : Optional [ServerNode ] = None ):
367378 tcp_command = GetTcpInfoCommand (f"Subscription/{ self ._db_name } " , self ._db_name )
368379
@@ -378,10 +389,10 @@ def _ensure_parser(self) -> None:
378389 # python doesn't use parsers
379390 pass
380391
381- def _read_server_response_and_get_version (self , url : str ) -> int :
392+ def _read_server_response_and_get_version (self , url : str , sock : socket ) -> int :
382393 # reading reply from server
383394 self ._ensure_parser ()
384- response = self . _tcp_client .recv (self ._options .receive_buffer_size )
395+ response = sock .recv (self ._options .receive_buffer_size )
385396 reply = TcpConnectionHeaderResponse .from_json (json .loads (response .decode ("utf-8" )))
386397
387398 if reply .status == TcpConnectionStatus .OK :
@@ -897,6 +908,10 @@ def items(self) -> List[Item[_T]]:
897908 def number_of_items_in_batch (self ) -> int :
898909 return 0 if self .items is None else len (self .items )
899910
911+ @property
912+ def number_of_includes (self ) -> int :
913+ return len (self ._includes ) if self ._includes is not None else 0
914+
900915 def open_session (self , options : Optional [SessionOptions ] = None ) -> DocumentSession :
901916 if not options :
902917 options = SessionOptions ()
0 commit comments