@@ -86,151 +86,13 @@ internal DnsClientBase(IEnumerable<IPAddress> servers, int queryTimeout, IClient
86
86
protected TMessage ? SendMessage < TMessage > ( TMessage query )
87
87
where TMessage : DnsMessageBase , new ( )
88
88
{
89
- SelectTsigKey ? tsigKeySelector ;
90
-
91
- var package = PrepareMessage ( query , out tsigKeySelector , out var tsigOriginalMac ) ;
92
-
93
- TMessage ? response = null ;
94
-
95
- foreach ( var connection in GetConnections ( package , query . IsReliableSendingRequested ) )
96
- {
97
- try
98
- {
99
- var receivedMessage = SendMessage < TMessage > ( package , connection , tsigKeySelector , tsigOriginalMac ) ;
100
-
101
- if ( ( receivedMessage != null ) && ValidateResponse ( query , receivedMessage . Message ) )
102
- {
103
- if ( receivedMessage . Message . ReturnCode == ReturnCode . ServerFailure )
104
- {
105
- response = receivedMessage . Message ;
106
- continue ;
107
- }
108
-
109
- if ( ! receivedMessage . Message . IsReliableResendingRequested )
110
- return receivedMessage . Message ;
111
-
112
- var resendTransport = _transports . FirstOrDefault ( t => t . SupportsReliableTransfer && t . MaximumAllowedQuerySize <= package . Length && t != connection . Transport ) ;
113
-
114
- if ( resendTransport != null )
115
- {
116
- using ( IClientConnection ? resendConnection = resendTransport . Connect ( new DnsClientEndpointInfo ( false , receivedMessage . ResponderAddress . Address , receivedMessage . LocalAddress . Address ) , QueryTimeout ) )
117
- {
118
- if ( resendConnection == null )
119
- {
120
- response = receivedMessage . Message ;
121
- }
122
- else
123
- {
124
- var resendResponse = SendMessage < TMessage > ( package , resendConnection , tsigKeySelector , tsigOriginalMac ) ;
125
-
126
- if ( ( resendResponse != null )
127
- && ValidateResponse ( query , resendResponse . Message )
128
- && ( ( resendResponse . Message . ReturnCode != ReturnCode . ServerFailure ) ) )
129
- {
130
- return resendResponse . Message ;
131
- }
132
- else
133
- {
134
- resendConnection . MarkFaulty ( ) ;
135
- response = receivedMessage . Message ;
136
- }
137
- }
138
- }
139
- }
140
- }
141
- else
142
- {
143
- connection . MarkFaulty ( ) ;
144
- }
145
- }
146
- catch ( Exception e )
147
- {
148
- Trace . TraceError ( "Error on dns query: " + e ) ;
149
- connection . MarkFaulty ( ) ;
150
- }
151
- finally
152
- {
153
- connection . Dispose ( ) ;
154
- }
155
- }
156
-
157
- return response ;
158
- }
159
-
160
- private IEnumerable < IClientConnection > GetConnections ( DnsRawPackage package , bool isReliableTransportRequested )
161
- {
162
- foreach ( var transport in _transports )
163
- {
164
- if ( transport . SupportsPooledConnections
165
- && package . Length <= transport . MaximumAllowedQuerySize
166
- && ( ! isReliableTransportRequested || transport . SupportsReliableTransfer ) )
167
- {
168
- foreach ( var endpointInfo in _endpointInfos )
169
- {
170
- var connection = transport . GetPooledConnection ( endpointInfo ) ;
171
- if ( connection != null )
172
- yield return connection ;
173
- }
174
- }
175
- }
176
-
177
- foreach ( var transport in _transports )
178
- {
179
- if ( package . Length <= transport . MaximumAllowedQuerySize
180
- && ( ! isReliableTransportRequested || transport . SupportsReliableTransfer ) )
181
- {
182
- foreach ( var endpointInfo in _endpointInfos )
183
- {
184
- var connection = transport . Connect ( endpointInfo , QueryTimeout ) ;
185
- if ( connection != null )
186
- yield return connection ;
187
- }
188
- }
189
- }
190
- }
191
-
192
- private ReceivedMessage < TMessage > ? SendMessage < TMessage > ( DnsRawPackage package , IClientConnection connection , SelectTsigKey ? tsigKeySelector , byte [ ] ? tsigOriginalMac )
193
- where TMessage : DnsMessageBase , new ( )
194
- {
195
- if ( ! connection . Send ( package ) )
196
- return null ;
197
-
198
- var resultData = connection . Receive ( ) ;
199
-
200
- if ( resultData == null )
201
- return null ;
202
-
203
- var response = DnsMessageBase . Parse < TMessage > ( resultData . ToArraySegment ( false ) , tsigKeySelector , tsigOriginalMac ) ;
204
-
205
- var isNextMessageWaiting = response . IsNextMessageWaiting ( false ) ;
206
-
207
- while ( isNextMessageWaiting )
208
- {
209
- resultData = connection . Receive ( ) ;
210
-
211
- if ( resultData == null )
212
- return null ;
213
-
214
- var nextResult = DnsMessageBase . Parse < TMessage > ( resultData . ToArraySegment ( false ) , tsigKeySelector , tsigOriginalMac ) ;
215
-
216
- if ( nextResult . ReturnCode == ReturnCode . ServerFailure )
217
- return null ;
218
-
219
- response . AddSubsequentResponse ( nextResult ) ;
220
- isNextMessageWaiting = nextResult . IsNextMessageWaiting ( true ) ;
221
- }
222
-
223
- return new ReceivedMessage < TMessage > ( resultData . RemoteEndpoint , resultData . LocalEndpoint , response ) ;
89
+ return SendMessageAsync < TMessage > ( query , CancellationToken . None ) . GetAwaiter ( ) . GetResult ( ) ;
224
90
}
225
91
226
92
protected List < TMessage > SendMessageParallel < TMessage > ( TMessage message )
227
93
where TMessage : DnsMessageBase , new ( )
228
94
{
229
- var result = SendMessageParallelAsync ( message , default ) ;
230
-
231
- result . Wait ( ) ;
232
-
233
- return result . Result ;
95
+ return SendMessageParallelAsync ( message , default ) . GetAwaiter ( ) . GetResult ( ) ;
234
96
}
235
97
236
98
private bool ValidateResponse < TMessage > ( TMessage message , TMessage response )
@@ -293,6 +155,8 @@ private DnsRawPackage PrepareMessage<TMessage>(TMessage message, out SelectTsigK
293
155
294
156
if ( ( receivedMessage != null ) && ValidateResponse ( query , receivedMessage . Message ) )
295
157
{
158
+ connection . RestartIdleTimeout ( receivedMessage . Message . GetEDnsKeepAliveTimeout ( ) ) ;
159
+
296
160
if ( receivedMessage . Message . ReturnCode == ReturnCode . ServerFailure )
297
161
{
298
162
response = receivedMessage . Message ;
@@ -320,6 +184,7 @@ private DnsRawPackage PrepareMessage<TMessage>(TMessage message, out SelectTsigK
320
184
&& ValidateResponse ( query , resendResponse . Message )
321
185
&& ( ( resendResponse . Message . ReturnCode != ReturnCode . ServerFailure ) ) )
322
186
{
187
+ resendConnection . RestartIdleTimeout ( receivedMessage . Message . GetEDnsKeepAliveTimeout ( ) ) ;
323
188
return resendResponse . Message ;
324
189
}
325
190
else
@@ -360,9 +225,7 @@ private DnsRawPackage PrepareMessage<TMessage>(TMessage message, out SelectTsigK
360
225
{
361
226
foreach ( var endpointInfo in _endpointInfos )
362
227
{
363
- var connection = transport . GetPooledConnection ( endpointInfo ) ;
364
- if ( connection != null )
365
- yield return Task . FromResult < IClientConnection ? > ( connection ) ;
228
+ yield return transport . GetPooledConnectionAsync ( endpointInfo , token ) ;
366
229
}
367
230
}
368
231
}
@@ -386,7 +249,7 @@ private DnsRawPackage PrepareMessage<TMessage>(TMessage message, out SelectTsigK
386
249
if ( ! await connection . SendAsync ( package , token ) )
387
250
return null ;
388
251
389
- var resultData = await connection . ReceiveAsync ( token ) ;
252
+ var resultData = await connection . ReceiveAsync ( package . MessageIdentification , token ) ;
390
253
391
254
if ( resultData == null )
392
255
return null ;
@@ -397,7 +260,7 @@ private DnsRawPackage PrepareMessage<TMessage>(TMessage message, out SelectTsigK
397
260
398
261
while ( isNextMessageWaiting )
399
262
{
400
- resultData = await connection . ReceiveAsync ( token ) ;
263
+ resultData = await connection . ReceiveAsync ( package . MessageIdentification , token ) ;
401
264
402
265
if ( resultData == null )
403
266
return null ;
@@ -458,7 +321,7 @@ private async Task SendMessageParallelAsync<TMessage>(IClientTransport transport
458
321
if ( token . IsCancellationRequested )
459
322
break ;
460
323
461
- var response = await connection . ReceiveAsync ( token ) ;
324
+ var response = await connection . ReceiveAsync ( package . MessageIdentification , token ) ;
462
325
463
326
if ( response == null )
464
327
continue ;
0 commit comments