12
12
# permissions and limitations under the License.
13
13
14
14
from awscrt .http import HttpClientConnection , HttpRequest
15
- from awscrt import io
16
- from awscrt .io import ClientBootstrap , ClientTlsContext , TlsConnectionOptions , SocketOptions
15
+ from awscrt .io import ClientBootstrap , ClientTlsContext , is_alpn_available , SocketOptions , TlsConnectionOptions
17
16
import awsiot
18
17
from concurrent .futures import Future
19
18
import json
@@ -35,58 +34,59 @@ def __init__(self, bootstrap, socket_options, tls_context, region):
35
34
self ._tls_connection_options .set_server_name (self ._gg_server_name )
36
35
self .port = 8443
37
36
38
- if io . is_alpn_available ():
39
- self ._tls_connection_options .set_alpn_list ('x-amzn-http-ca' )
37
+ if is_alpn_available ():
38
+ self ._tls_connection_options .set_alpn_list ([ 'x-amzn-http-ca' ] )
40
39
self .port = 443
41
40
42
41
def discover (self , thing_name ):
43
- ret_future = Future ()
44
- response_body = bytearray ()
45
- request = None
46
42
47
- def on_incoming_body (response_chunk ):
48
- response_body .extend (response_chunk )
43
+ discovery = dict (
44
+ future = Future (),
45
+ response_body = bytearray ())
46
+
47
+ def on_incoming_body (http_stream , response_chunk ):
48
+ discovery ['response_body' ].extend (response_chunk )
49
49
50
50
def on_request_complete (completion_future ):
51
- global request
52
51
try :
53
- response_code = request .response_code
54
- # marking request as global prevents the GC from reclaiming it,
55
- # so force it to do it here.
56
- request = None
52
+ response_code = completion_future .result ()
57
53
if response_code == 200 :
58
- payload_str = response_body .decode ('utf-8' )
54
+ payload_str = discovery [ ' response_body' ] .decode ('utf-8' )
59
55
discover_res = DiscoverResponse .from_payload (json .loads (payload_str ))
60
- ret_future .set_result (discover_res )
61
- else :
62
- ret_future .set_exception (DiscoveryException ('Error during discover call: response code ={}' .format (response_code ), response_code ))
56
+ discovery [ 'future' ] .set_result (discover_res )
57
+ else :
58
+ discovery [ 'future' ] .set_exception (DiscoveryException ('Error during discover call: response_code ={}' .format (response_code ), response_code ))
63
59
64
60
except Exception as e :
65
- ret_future .set_exception (e )
61
+ discovery [ 'future' ] .set_exception (e )
66
62
67
63
def on_connection_completed (conn_future ):
68
- global request
69
64
try :
70
- connection = conn_future .result ()
71
- request = connection .make_request (
72
- method = 'GET' ,
73
- uri_str = '/greengrass/discover/thing/{}' .format (thing_name ),
74
- outgoing_headers = {'host' :self ._gg_server_name },
75
- on_outgoing_body = None ,
76
- on_incoming_body = on_incoming_body )
65
+ connection = conn_future .result ()
66
+ request = HttpRequest (
67
+ method = 'GET' ,
68
+ path = '/greengrass/discover/thing/{}' .format (thing_name ),
69
+ headers = [('host' , self ._gg_server_name )])
70
+
71
+ http_stream = connection .request (
72
+ request = request ,
73
+ on_body = on_incoming_body )
77
74
78
- request . response_completed .add_done_callback (on_request_complete )
75
+ http_stream . completion_future .add_done_callback (on_request_complete )
79
76
80
77
except Exception as e :
81
- # marking request as global prevents the GC from reclaiming it,
82
- # so force it to do it here.
83
- request = None
84
- ret_future .set_exception (e )
78
+ discovery ['future' ].set_exception (e )
79
+
80
+ connect_future = HttpClientConnection .new (
81
+ host_name = self ._gg_server_name ,
82
+ port = self .port ,
83
+ socket_options = self ._socket_options ,
84
+ tls_connection_options = self ._tls_connection_options ,
85
+ bootstrap = self ._bootstrap )
85
86
86
- connect_future = HttpClientConnection .new_connection (self ._bootstrap , self ._gg_server_name , self .port , self ._socket_options , None , self ._tls_connection_options )
87
87
connect_future .add_done_callback (on_connection_completed )
88
-
89
- return ret_future
88
+
89
+ return discovery [ 'future' ]
90
90
91
91
class DiscoveryException (Exception ):
92
92
_slots_ = ['http_response_code' , 'message' ]
@@ -102,7 +102,7 @@ class ConnectivityInfo(awsiot.ModeledClass):
102
102
def ___init___ (self ):
103
103
for slot in self .__slots__ :
104
104
setattr (self , slot , None )
105
-
105
+
106
106
@classmethod
107
107
def from_payload (cls , payload ):
108
108
# type: (typing.Dict[str, typing.Any]) -> ConnectivityInfo
@@ -138,12 +138,12 @@ def from_payload(cls, payload):
138
138
val = payload .get ('Connectivity' )
139
139
if val is not None :
140
140
new .connectivity = [ConnectivityInfo .from_payload (i ) for i in val ]
141
-
141
+
142
142
return new
143
143
144
144
class GGGroup (awsiot .ModeledClass ):
145
145
__slots__ = ['gg_group_id' , 'cores' , 'certificate_authorities' ]
146
-
146
+
147
147
def ___init___ (self ):
148
148
for slot in self .__slots__ :
149
149
setattr (self , slot , None )
@@ -160,23 +160,23 @@ def from_payload(cls, payload):
160
160
new .cores = [GGCore .from_payload (i ) for i in val ]
161
161
val = payload .get ('CAs' )
162
162
if val is not None :
163
- new .certificate_authorities = val
163
+ new .certificate_authorities = val
164
164
165
- return new
165
+ return new
166
166
167
167
class DiscoverResponse (awsiot .ModeledClass ):
168
168
__slots__ = ['gg_groups' ]
169
169
170
170
def ___init___ (self ):
171
171
for slot in self .__slots__ :
172
172
setattr (self , slot , None )
173
-
173
+
174
174
@classmethod
175
175
def from_payload (cls , payload ):
176
176
# type: (typing.Dict[str, typing.Any]) -> DiscoverResponse
177
177
new = cls ()
178
178
val = payload .get ('GGGroups' )
179
179
if val is not None :
180
180
new .gg_groups = [GGGroup .from_payload (i ) for i in val ]
181
-
182
- return new
181
+
182
+ return new
0 commit comments