@@ -284,23 +284,26 @@ fn pocketic_proxy_start_thread(
284
284
}
285
285
}
286
286
} ;
287
- if let Err ( e ) = initialize_gateway (
287
+ let instance = match initialize_gateway (
288
288
format ! ( "http://localhost:{port}" ) . parse ( ) . unwrap ( ) ,
289
289
replica_url. clone ( ) ,
290
290
domains. clone ( ) ,
291
291
address,
292
292
logger. clone ( ) ,
293
293
) {
294
- error ! ( logger, "Failed to initialize HTTP gateway: {e:#}" ) ;
295
- let _ = child. kill ( ) ;
296
- let _ = child. wait ( ) ;
297
- if receiver. try_recv ( ) . is_ok ( ) {
298
- debug ! ( logger, "Got signal to stop." ) ;
299
- break ;
300
- } else {
301
- continue ;
294
+ Err ( e) => {
295
+ error ! ( logger, "Failed to initialize HTTP gateway: {e:#}" ) ;
296
+ let _ = child. kill ( ) ;
297
+ let _ = child. wait ( ) ;
298
+ if receiver. try_recv ( ) . is_ok ( ) {
299
+ debug ! ( logger, "Got signal to stop." ) ;
300
+ break ;
301
+ } else {
302
+ continue ;
303
+ }
302
304
}
303
- }
305
+ Ok ( i) => i,
306
+ } ;
304
307
info ! ( logger, "Replica API running on {address}" ) ;
305
308
306
309
// Send PocketIcProxyReadySignal to PocketIcProxy.
@@ -314,6 +317,9 @@ fn pocketic_proxy_start_thread(
314
317
logger,
315
318
"Got signal to stop. Killing pocket-ic gateway process..."
316
319
) ;
320
+ if let Err ( e) = shutdown_pocketic_proxy ( port, instance, logger. clone ( ) ) {
321
+ error ! ( logger, "Error shutting down PocketIC gracefully: {e}" ) ;
322
+ }
317
323
let _ = child. kill ( ) ;
318
324
let _ = child. wait ( ) ;
319
325
break ;
@@ -349,7 +355,7 @@ async fn initialize_gateway(
349
355
domains : Option < Vec < String > > ,
350
356
addr : SocketAddr ,
351
357
logger : Logger ,
352
- ) -> DfxResult {
358
+ ) -> DfxResult < usize > {
353
359
use pocket_ic:: common:: rest:: {
354
360
CreateHttpGatewayResponse , HttpGatewayBackend , HttpGatewayConfig ,
355
361
} ;
@@ -369,11 +375,12 @@ async fn initialize_gateway(
369
375
. await ?
370
376
. error_for_status ( ) ?;
371
377
let resp = resp. json :: < CreateHttpGatewayResponse > ( ) . await ?;
372
- if let CreateHttpGatewayResponse :: Error { message } = resp {
373
- bail ! ( "Gateway init error: {message}" )
374
- }
378
+ let instance = match resp {
379
+ CreateHttpGatewayResponse :: Created ( info) => info. instance_id ,
380
+ CreateHttpGatewayResponse :: Error { message } => bail ! ( "Gateway init error: {message}" ) ,
381
+ } ;
375
382
info ! ( logger, "Initialized HTTP gateway." ) ;
376
- Ok ( ( ) )
383
+ Ok ( instance )
377
384
}
378
385
379
386
#[ cfg( not( unix) ) ]
@@ -383,6 +390,27 @@ fn initialize_gateway(
383
390
_: Option < Vec < String > > ,
384
391
_: SocketAddr ,
385
392
_: Logger ,
386
- ) -> DfxResult {
393
+ ) -> DfxResult < usize > {
387
394
bail ! ( "PocketIC gateway not supported on this platform" )
388
395
}
396
+
397
+ #[ cfg( unix) ]
398
+ #[ tokio:: main( flavor = "current_thread" ) ]
399
+ async fn shutdown_pocketic_proxy ( port : u16 , instance : usize , logger : Logger ) -> DfxResult {
400
+ use reqwest:: Client ;
401
+ let shutdown_client = Client :: new ( ) ;
402
+ debug ! ( logger, "Sending shutdown request to HTTP gateway" ) ;
403
+ shutdown_client
404
+ . post ( format ! (
405
+ "http://localhost:{port}/http_gateway/{instance}/stop"
406
+ ) )
407
+ . send ( )
408
+ . await ?
409
+ . error_for_status ( ) ?;
410
+ Ok ( ( ) )
411
+ }
412
+
413
+ #[ cfg( not( unix) ) ]
414
+ fn shutdown_pocketic_proxy ( _: u16 , _: usize , _: Logger ) -> DfxResult {
415
+ bail ! ( "PocketIC not supported on this platform" )
416
+ }
0 commit comments