44import os
55from pathlib import Path
66from typing import List , Optional , Tuple , Union
7-
87import grpc
98
109
1110def create_channel (
12- ssl_cert : Optional [Union [str , os .PathLike ]] = None , use_ssl : bool = False , uri : str = "localhost:50051" ,
11+ ssl_cert : Optional [Union [str , os .PathLike ]] = None , use_ssl : bool = False , uri : str = "localhost:50051" , metadata : Optional [ List [ Tuple [ str , str ]]] = None ,
1312) -> grpc .Channel :
13+
14+ def metadata_callback (context , callback ):
15+ callback (metadata , None )
16+
1417 if ssl_cert is not None or use_ssl :
1518 root_certificates = None
1619 if ssl_cert is not None :
1720 ssl_cert = Path (ssl_cert ).expanduser ()
1821 with open (ssl_cert , 'rb' ) as f :
1922 root_certificates = f .read ()
2023 creds = grpc .ssl_channel_credentials (root_certificates )
24+ if metadata :
25+ auth_creds = grpc .metadata_call_credentials (metadata_callback )
26+ creds = grpc .composite_channel_credentials (creds , auth_creds )
2127 channel = grpc .secure_channel (uri , creds )
2228 else :
2329 channel = grpc .insecure_channel (uri )
@@ -30,6 +36,7 @@ def __init__(
3036 ssl_cert : Optional [Union [str , os .PathLike ]] = None ,
3137 use_ssl : bool = False ,
3238 uri : str = "localhost:50051" ,
39+ metadata_args : List [List [str ]] = None ,
3340 ) -> None :
3441 """
3542 A class responsible for establishing connection with a server and providing security metadata.
@@ -44,7 +51,13 @@ def __init__(
4451 self .ssl_cert : Optional [Path ] = None if ssl_cert is None else Path (ssl_cert ).expanduser ()
4552 self .uri : str = uri
4653 self .use_ssl : bool = use_ssl
47- self .channel : grpc .Channel = create_channel (self .ssl_cert , self .use_ssl , self .uri )
54+ self .metadata = []
55+ if metadata_args :
56+ for meta in metadata_args :
57+ if len (meta ) != 2 :
58+ raise ValueError (f"Metadata should have 2 parameters in \" key\" \" value\" pair. Receieved { len (meta )} parameters." )
59+ self .metadata .append (tuple (meta ))
60+ self .channel : grpc .Channel = create_channel (self .ssl_cert , self .use_ssl , self .uri , self .metadata )
4861
4962 def get_auth_metadata (self ) -> List [Tuple [str , str ]]:
5063 """
0 commit comments