7
7
// File name: JsonRpcTransportLayer.cs
8
8
// Repository: https://github.com/sisk-http/core
9
9
10
- using System . Diagnostics . CodeAnalysis ;
10
+ using System . Reflection ;
11
11
using System . Runtime . CompilerServices ;
12
12
using System . Text ;
13
13
using LightJson ;
@@ -116,12 +116,17 @@ HttpResponse ImplTransportPostHttp ( HttpRequest request ) {
116
116
response = HandleRpcRequest ( rpcRequest ) ;
117
117
}
118
118
catch ( Exception ex ) {
119
- response = new JsonRpcResponse ( null ,
120
- new JsonRpcError ( JsonErrorCode . InternalError , ex . Message , JsonValue . Null ) , rpcRequest ? . Id ?? "0" ) ;
119
+ if ( _handler . _server . ServerConfiguration . ThrowExceptions ) {
120
+ throw ;
121
+ }
122
+ else {
123
+ response = new JsonRpcResponse ( null ,
124
+ new JsonRpcError ( JsonErrorCode . InternalError , ex . Message , JsonValue . Null ) , rpcRequest ? . Id ?? "0" ) ;
125
+ }
121
126
}
122
127
123
128
sendResponse :
124
- if ( rpcRequest is not null && rpcRequest . Id . IsNull ) {
129
+ if ( rpcRequest is not null && rpcRequest . Id . IsNull && response . Error is null ) {
125
130
return new HttpResponse ( ) {
126
131
Status = HttpStatusInformation . Accepted
127
132
} ;
@@ -134,10 +139,8 @@ HttpResponse ImplTransportPostHttp ( HttpRequest request ) {
134
139
}
135
140
}
136
141
137
- [ DynamicDependency ( DynamicallyAccessedMemberTypes . PublicMethods , typeof ( Task < > ) ) ]
138
- [ DynamicDependency ( DynamicallyAccessedMemberTypes . PublicMethods , typeof ( TaskAwaiter < > ) ) ]
139
- [ SuppressMessage ( "Trimming" , "IL2026:Using dynamic types might cause types or members to be removed by trimmer." , Justification = "<Pendente>" ) ]
140
- [ SuppressMessage ( "Trimming" , "IL2072:Target parameter argument does not satisfy 'DynamicallyAccessedMembersAttribute' in call to target method. The return value of the source method does not have matching annotations." , Justification = "<Pending>" ) ]
142
+ [ System . Diagnostics . CodeAnalysis . SuppressMessage ( "Trimming" ,
143
+ "IL2072:Target parameter argument does not satisfy 'DynamicallyAccessedMembersAttribute' in call to target method. The return value of the source method does not have matching annotations." , Justification = "<Pending>" ) ]
141
144
JsonRpcResponse HandleRpcRequest ( JsonRpcRequest request ) {
142
145
JsonRpcResponse response ;
143
146
try {
@@ -146,7 +149,7 @@ JsonRpcResponse HandleRpcRequest ( JsonRpcRequest request ) {
146
149
147
150
if ( method != null ) {
148
151
var methodInfo = method . Method ;
149
- var methodParameters = methodInfo . GetParameters ( ) ;
152
+ var methodParameters = method . Parameters ;
150
153
151
154
object ? [ ] methodInvokationParameters = new object ? [ methodParameters . Length ] ;
152
155
@@ -168,7 +171,7 @@ JsonRpcResponse HandleRpcRequest ( JsonRpcRequest request ) {
168
171
}
169
172
170
173
for ( int i = 0 ; i < jsonValueList . Count ; i ++ ) {
171
- methodInvokationParameters [ i ] = jsonValueList [ i ] . MaybeNull ( ) ? . Get ( methodParameters [ i ] . ParameterType ) ;
174
+ methodInvokationParameters [ i ] = jsonValueList [ i ] . MaybeNull ( ) ? . Get ( methodParameters [ i ] . ParameterType ) ?? methodParameters [ i ] . DefaultValue ;
172
175
}
173
176
}
174
177
else {
@@ -194,18 +197,24 @@ JsonRpcResponse HandleRpcRequest ( JsonRpcRequest request ) {
194
197
return response ;
195
198
}
196
199
197
- methodInvokationParameters [ i ] = jsonParameter . MaybeNull ( ) ? . Get ( param . ParameterType ) ;
200
+ methodInvokationParameters [ i ] = jsonParameter . MaybeNull ( ) ? . Get ( param . ParameterType ) ?? param . DefaultValue ;
198
201
}
199
202
}
200
203
201
204
object ? result = methodInfo . Invoke ( method . Target , methodInvokationParameters ) ;
202
205
203
- if ( result is Task task ) {
204
- result = ( ( dynamic ) task ) . GetAwaiter ( ) . GetResult ( ) ;
206
+ if ( result is not null ) {
207
+ if ( method . ReturnInformation . IsAsyncTask ) {
208
+ ref Task < object > actionTask = ref Unsafe . As < object , Task < object > > ( ref result ) ;
209
+ result = actionTask . GetAwaiter ( ) . GetResult ( ) ;
210
+ }
211
+ else if ( method . ReturnInformation . IsAsyncEnumerable ) {
212
+ ref IAsyncEnumerable < object > asyncEnumerable = ref Unsafe . As < object , IAsyncEnumerable < object > > ( ref result ) ;
213
+ result = asyncEnumerable . ToBlockingEnumerable ( ) ;
214
+ }
205
215
}
206
216
207
217
JsonValue resultEncoded = JsonValue . Serialize ( result , _handler . _jsonOptions ) ;
208
-
209
218
response = new JsonRpcResponse ( resultEncoded , null , request . Id ) ;
210
219
}
211
220
else {
@@ -216,13 +225,18 @@ JsonRpcResponse HandleRpcRequest ( JsonRpcRequest request ) {
216
225
catch ( JsonRpcException jex ) {
217
226
response = new JsonRpcResponse ( null , jex . AsRpcError ( ) , request . Id ) ;
218
227
}
219
- catch ( Exception ex ) {
228
+ catch ( Exception erx ) {
229
+ Exception ex = erx ;
230
+ if ( erx is TargetInvocationException )
231
+ ex = ex . InnerException ?? ex ;
232
+
220
233
if ( _handler . _server . ServerConfiguration . ThrowExceptions ) {
221
234
throw ;
222
235
}
223
236
else {
237
+ _handler . _server . ServerConfiguration . ErrorsLogsStream ? . WriteException ( erx ) ;
224
238
response = new JsonRpcResponse ( null ,
225
- new JsonRpcError ( JsonErrorCode . InternalError , ex . Message , JsonValue . Null ) , request ? . Id ?? "0" ) ;
239
+ new JsonRpcError ( JsonErrorCode . InternalError , ex . Message , JsonValue . Null ) , request ? . Id ?? "0" ) ;
226
240
}
227
241
}
228
242
return response ;
0 commit comments