@@ -17,18 +17,18 @@ internal class CircuitDisconnectMiddleware
17
17
public CircuitDisconnectMiddleware (
18
18
ILogger < CircuitDisconnectMiddleware > logger ,
19
19
CircuitRegistry registry ,
20
- CircuitIdFactory circuitIdFactory ,
20
+ CircuitSecretFactory circuitSecretFactory ,
21
21
RequestDelegate next )
22
22
{
23
23
Logger = logger ;
24
24
Registry = registry ;
25
- CircuitIdFactory = circuitIdFactory ;
25
+ CircuitSecretFactory = circuitSecretFactory ;
26
26
Next = next ;
27
27
}
28
28
29
29
public ILogger < CircuitDisconnectMiddleware > Logger { get ; }
30
30
public CircuitRegistry Registry { get ; }
31
- public CircuitIdFactory CircuitIdFactory { get ; }
31
+ public CircuitSecretFactory CircuitSecretFactory { get ; }
32
32
public RequestDelegate Next { get ; }
33
33
34
34
public async Task Invoke ( HttpContext context )
@@ -39,65 +39,66 @@ public async Task Invoke(HttpContext context)
39
39
return ;
40
40
}
41
41
42
- var ( hasCircuitId , circuitId ) = await TryGetCircuitIdAsync ( context ) ;
43
- if ( ! hasCircuitId )
42
+ var circuitSecret = await GetCircuitSecretAsync ( context ) ;
43
+ if ( circuitSecret is null )
44
44
{
45
45
context . Response . StatusCode = StatusCodes . Status400BadRequest ;
46
46
return ;
47
47
}
48
48
49
- await TerminateCircuitGracefully ( circuitId ) ;
49
+ await TerminateCircuitGracefully ( circuitSecret . Value ) ;
50
50
51
51
context . Response . StatusCode = StatusCodes . Status200OK ;
52
52
}
53
53
54
- private async Task < ( bool , string ) > TryGetCircuitIdAsync ( HttpContext context )
54
+ private async Task < CircuitSecret ? > GetCircuitSecretAsync ( HttpContext context )
55
55
{
56
56
try
57
57
{
58
58
if ( ! context . Request . HasFormContentType )
59
59
{
60
- return ( false , null ) ;
60
+ return default ;
61
61
}
62
62
63
63
var form = await context . Request . ReadFormAsync ( ) ;
64
- if ( ! form . TryGetValue ( CircuitIdKey , out var circuitId ) || ! CircuitIdFactory . ValidateCircuitId ( circuitId ) )
64
+ if ( ! form . TryGetValue ( CircuitIdKey , out var text ) )
65
65
{
66
- return ( false , null ) ;
66
+ return default ;
67
67
}
68
68
69
- return ( true , circuitId ) ;
69
+ var circuitSecret = new CircuitSecret ( text ) ;
70
+ if ( ! CircuitSecretFactory . ValidateCircuitSecret ( circuitSecret ) )
71
+ {
72
+ return default ;
73
+ }
74
+
75
+ return circuitSecret ;
70
76
}
71
77
catch
72
78
{
73
- return ( false , null ) ;
79
+ return default ;
74
80
}
75
81
}
76
82
77
- private async Task TerminateCircuitGracefully ( string circuitId )
83
+ private async Task TerminateCircuitGracefully ( CircuitSecret circuitSecret )
78
84
{
79
- try
80
- {
81
- await Registry . TerminateAsync ( circuitId ) ;
82
- Log . CircuitTerminatedGracefully ( Logger , circuitId ) ;
83
- }
84
- catch ( Exception e )
85
- {
86
- Log . UnhandledExceptionInCircuit ( Logger , circuitId , e ) ;
87
- }
85
+ // We don't expect TerminateAsync to throw.
86
+ Log . CircuitTerminatingGracefully ( Logger , circuitSecret ) ;
87
+ await Registry . TerminateAsync ( circuitSecret ) ;
88
+ Log . CircuitTerminatedGracefully ( Logger , circuitSecret ) ;
88
89
}
89
90
90
91
private class Log
91
92
{
92
- private static readonly Action < ILogger , string , Exception > _circuitTerminatedGracefully =
93
- LoggerMessage . Define < string > ( LogLevel . Debug , new EventId ( 1 , "CircuitTerminatedGracefully " ) , "Circuit '{CircuitId }' terminated gracefully" ) ;
93
+ private static readonly Action < ILogger , string , Exception > _circuitTerminatingGracefully =
94
+ LoggerMessage . Define < string > ( LogLevel . Trace , new EventId ( 1 , "CircuitTerminatingGracefully " ) , "Circuit '{CircuitSecret }' terminating gracefully. " ) ;
94
95
95
- private static readonly Action < ILogger , string , Exception > _unhandledExceptionInCircuit =
96
- LoggerMessage . Define < string > ( LogLevel . Warning , new EventId ( 2 , "UnhandledExceptionInCircuit " ) , "Unhandled exception in circuit {CircuitId} while terminating gracefully." ) ;
96
+ private static readonly Action < ILogger , string , Exception > _circuitTerminatedGracefully =
97
+ LoggerMessage . Define < string > ( LogLevel . Trace , new EventId ( 2 , "CircuitTerminatedGracefully " ) , "Circuit '{CircuitSecret}' terminated gracefully." ) ;
97
98
98
- public static void CircuitTerminatedGracefully ( ILogger logger , string circuitId ) => _circuitTerminatedGracefully ( logger , circuitId , null ) ;
99
+ public static void CircuitTerminatingGracefully ( ILogger logger , CircuitSecret circuitSecret ) => _circuitTerminatingGracefully ( logger , circuitSecret . Secret , null ) ;
99
100
100
- public static void UnhandledExceptionInCircuit ( ILogger logger , string circuitId , Exception exception ) => _unhandledExceptionInCircuit ( logger , circuitId , exception ) ;
101
+ public static void CircuitTerminatedGracefully ( ILogger logger , CircuitSecret circuitSecret ) => _circuitTerminatedGracefully ( logger , circuitSecret . Secret , null ) ;
101
102
}
102
103
}
103
104
}
0 commit comments