Skip to content

Commit de50186

Browse files
committed
fix #654 async always threw exceptions on 404, Elasticsearch.Net is now in charge which methods allow 404
1 parent 153271e commit de50186

File tree

17 files changed

+2658
-567
lines changed

17 files changed

+2658
-567
lines changed

src/CodeGeneration/CodeGeneration.LowLevelClient/ApiGenerator.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using System.Reflection;
88
using System.Text.RegularExpressions;
99
using CodeGeneration.LowLevelClient.Domain;
10+
using CodeGeneration.LowLevelClient.Overrides.Allow404;
1011
using CodeGeneration.LowLevelClient.Overrides.Descriptors;
1112
using CsQuery;
1213
using Newtonsoft.Json;
@@ -120,7 +121,6 @@ public static void PatchMethod(CsharpMethod method)
120121
Func<string, bool> mc = (s) => method.FullName.Contains(s);
121122
Func<string, bool> pc = (s) => method.Path.Contains(s);
122123

123-
124124
if (ms("Indices") && !pc("{index}"))
125125
method.FullName = (method.FullName + "ForAll").Replace("AsyncForAll", "ForAllAsync");
126126

@@ -139,6 +139,8 @@ public static void PatchMethod(CsharpMethod method)
139139

140140
method.DescriptorType = method.QueryStringParamName.Replace("RequestParameters","Descriptor");
141141

142+
method.Allow404 = ApiEndpointsThatAllow404.Endpoints.Contains(method.DescriptorType.Replace("Descriptor", ""));
143+
142144
string generic;
143145
if (KnownDescriptors.TryGetValue(method.DescriptorType, out generic))
144146
method.DescriptorTypeGeneric = generic;

src/CodeGeneration/CodeGeneration.LowLevelClient/CodeGeneration.LowLevelClient.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@
7878
<Compile Include="Domain\ApiUrlPart.cs" />
7979
<Compile Include="Domain\CsharpMethod.cs" />
8080
<Compile Include="Extensions.cs" />
81+
<Compile Include="Overrides\Allow404\ApiEndpointsThatAllow404.cs" />
8182
<Compile Include="Overrides\Descriptors\DeleteWarmerDescriptorOverrides.cs" />
8283
<Compile Include="Overrides\Descriptors\PutTemplateDescriptorOverrides.cs" />
8384
<Compile Include="Overrides\Descriptors\ClearCacheDescriptorOverrides.cs" />

src/CodeGeneration/CodeGeneration.LowLevelClient/Domain/CsharpMethod.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ public class CsharpMethod
1616
public string Documentation { get; set; }
1717
public string Path { get; set; }
1818
public string Arguments { get; set; }
19+
public bool Allow404 { get; set; }
1920
public IEnumerable<ApiUrlPart> Parts { get; set; }
2021
public ApiUrl Url { get; set; }
2122
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Linq.Expressions;
5+
using System.Runtime.InteropServices;
6+
using System.Text;
7+
8+
namespace CodeGeneration.LowLevelClient.Overrides.Allow404
9+
{
10+
public static class ApiEndpointsThatAllow404
11+
{
12+
public static IEnumerable<string> Endpoints = new List<string>
13+
{
14+
"DocumentExists",
15+
"Delete",
16+
"IndexExists"
17+
};
18+
}
19+
}

src/CodeGeneration/CodeGeneration.LowLevelClient/Views/ElasticsearchClient.Generated.cshtml

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
@using System.Collections.Generic
12
@using System.Globalization
23
@using System.Linq
34
@using System.Text.RegularExpressions
@@ -63,14 +64,33 @@ namespace Elasticsearch.Net
6364
<text>var url = "@(url)";</text>
6465
}
6566
BaseRequestParameters requestParams = null;
67+
@if (url.StartsWith("_cat") || method.Allow404)
68+
{
69+
var config = new List<string>();
70+
if (url.StartsWith("_cat"))
71+
{
72+
config.Add("ContentType(\"text/plain\")");
73+
}
74+
if (method.Allow404)
75+
{
76+
config.Add("AllowStatusCodes(404)");
77+
}
78+
<text>
79+
requestParameters = requestParameters ?? (s => s);
80+
requestParams = requestParameters(new @(method.QueryStringParamName)());
81+
(requestParams as @method.QueryStringParamName).RequestConfiguration(r=>r.@Raw(string.Join(".", config)));
82+
ToNameValueCollection(requestParams);
83+
</text>
84+
}
85+
else
86+
{
87+
<text>
6688
if (requestParameters != null)
6789
{
68-
requestParams = requestParameters(new @(method.QueryStringParamName)()@(url.StartsWith("_cat") ? Raw(".RequestConfiguration(r=>r.ContentType(\"text/plain\"))") : null));
90+
requestParams = requestParameters(new @(method.QueryStringParamName)());
6991
ToNameValueCollection(requestParams);
7092
}
71-
@if (url.StartsWith("_cat"))
72-
{
73-
<text> else requestParams = new @(method.QueryStringParamName)().RequestConfiguration(r=>r.ContentType("text/plain")); </text>
93+
</text>
7494
}
7595

7696
@{

src/Elasticsearch.Net/Connection/HttpConnection.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -314,7 +314,7 @@ private IEnumerable<Task> _AsyncSteps(HttpWebRequest request, TaskCompletionSour
314314
tcs.TrySetResult(cs);
315315
}
316316

317-
public void Iterate<T>(HttpWebRequest request, byte[] data, IEnumerable<Task> asyncIterator, TaskCompletionSource<ElasticsearchResponse<T>> tcs)
317+
public void Iterate(HttpWebRequest request, byte[] data, IEnumerable<Task> asyncIterator, TaskCompletionSource<ElasticsearchResponse<Stream>> tcs)
318318
{
319319
var enumerator = asyncIterator.GetEnumerator();
320320
Action<Task> recursiveBody = null;
@@ -331,8 +331,7 @@ public void Iterate<T>(HttpWebRequest request, byte[] data, IEnumerable<Task> as
331331
{
332332
var path = request.RequestUri.ToString();
333333
var method = request.Method;
334-
335-
var response = ElasticsearchResponse<T>.CreateError(this.ConnectionSettings, exception, method, path, data);
334+
var response = this.HandleWebException(data, exception as WebException, method, path);
336335
tcs.SetResult(response);
337336
}
338337
else

src/Elasticsearch.Net/Connection/Transport.cs

Lines changed: 44 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -195,31 +195,11 @@ private ElasticsearchResponse<T> DoRequest<T>(TransportRequestState<T> requestSt
195195
var streamResponse = _doRequest(requestState.Method, uri, requestState.PostData, requestState.RequestConfiguration);
196196
if (streamResponse != null && streamResponse.SuccessOrKnownError)
197197
{
198-
ElasticsearchServerError error = null;
199-
if (!streamResponse.Success
200-
&& requestState.RequestConfiguration == null
201-
|| (!streamResponse.Success
202-
&& requestState.RequestConfiguration != null
203-
&& requestState.RequestConfiguration.AllowedStatusCodes.All(i => i != streamResponse.HttpStatusCode)))
204-
{
205-
if (streamResponse.Response != null)
206-
error = this.Serializer.Deserialize<ElasticsearchServerError>(streamResponse.Response);
207-
else
208-
error = new ElasticsearchServerError
209-
{
210-
Status = streamResponse.HttpStatusCode.GetValueOrDefault(-1)
211-
};
212-
if (this.Settings.ThrowOnElasticsearchServerExceptions)
213-
throw new ElasticsearchServerException(error);
214-
}
198+
var error = ThrowOrGetErrorFromStreamResponse(requestState, streamResponse);
215199

216200
var typedResponse = this.StreamToTypedResponse<T>(streamResponse, requestState.DeserializationState);
217201
typedResponse.NumberOfRetries = retried;
218-
if (error != null)
219-
{
220-
typedResponse.Success = false;
221-
typedResponse.OriginalException = new ElasticsearchServerException(error);
222-
}
202+
this.SetErrorDiagnosticsAndPatchSuccess(requestState, error, typedResponse, streamResponse);
223203
response = typedResponse;
224204
return typedResponse;
225205
}
@@ -241,6 +221,44 @@ private ElasticsearchResponse<T> DoRequest<T>(TransportRequestState<T> requestSt
241221
return RetryRequest<T>(requestState, baseUri, retried);
242222
}
243223

224+
private void SetErrorDiagnosticsAndPatchSuccess<T>(TransportRequestState<T> requestState,
225+
ElasticsearchServerError error, ElasticsearchResponse<T> typedResponse, ElasticsearchResponse<Stream> streamResponse)
226+
{
227+
if (error != null)
228+
{
229+
typedResponse.Success = false;
230+
typedResponse.OriginalException = new ElasticsearchServerException(error);
231+
}
232+
if (!typedResponse.Success
233+
&& requestState.RequestConfiguration != null
234+
&& requestState.RequestConfiguration.AllowedStatusCodes.HasAny(i => i == streamResponse.HttpStatusCode))
235+
{
236+
typedResponse.Success = true;
237+
}
238+
}
239+
240+
private ElasticsearchServerError ThrowOrGetErrorFromStreamResponse<T>(TransportRequestState<T> requestState,
241+
ElasticsearchResponse<Stream> streamResponse)
242+
{
243+
ElasticsearchServerError error = null;
244+
if ((!streamResponse.Success && requestState.RequestConfiguration == null)
245+
|| (!streamResponse.Success
246+
&& requestState.RequestConfiguration != null
247+
&& requestState.RequestConfiguration.AllowedStatusCodes.All(i => i != streamResponse.HttpStatusCode)))
248+
{
249+
if (streamResponse.Response != null)
250+
error = this.Serializer.Deserialize<ElasticsearchServerError>(streamResponse.Response);
251+
else
252+
error = new ElasticsearchServerError
253+
{
254+
Status = streamResponse.HttpStatusCode.GetValueOrDefault(-1)
255+
};
256+
if (this.Settings.ThrowOnElasticsearchServerExceptions)
257+
throw new ElasticsearchServerException(error);
258+
}
259+
return error;
260+
}
261+
244262
private Uri GetNextBaseUri<T>(TransportRequestState<T> requestState, out int initialSeed, out bool shouldPingHint)
245263
{
246264
if (requestState.RequestConfiguration != null && requestState.RequestConfiguration.ForcedNode != null)
@@ -350,12 +368,16 @@ private Task<ElasticsearchResponse<T>> _doRequestAsyncOrRetry<T>(
350368
if (t.IsFaulted)
351369
return this.RetryRequestAsync<T>(requestState, baseUri, retried, t.Exception);
352370
if (t.Result.SuccessOrKnownError)
371+
{
372+
var error = ThrowOrGetErrorFromStreamResponse(requestState, t.Result);
353373
return this.StreamToTypedResponseAsync<T>(t.Result, requestState.DeserializationState)
354374
.ContinueWith(tt =>
355375
{
356376
tt.Result.NumberOfRetries = retried;
377+
this.SetErrorDiagnosticsAndPatchSuccess(requestState, error, tt.Result, t.Result);
357378
return tt;
358379
}).Unwrap();
380+
}
359381
return this.RetryRequestAsync<T>(requestState, baseUri, retried);
360382
}).Unwrap();
361383
}

src/Elasticsearch.Net/Domain/ElasticsearchResponse.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public static ElasticsearchResponse<TTo> CloneFrom<TTo>(IElasticsearchResponse f
5252
Serializer = from.Settings.Serializer,
5353
Settings = from.Settings,
5454
Success = from.Success
55-
55+
5656
};
5757
}
5858

@@ -176,12 +176,12 @@ public override string ToString()
176176
response = (this.Response as byte[]).Utf8String();
177177

178178
string requestJson = null;
179-
180-
if (r.Request != null)
181-
{
182-
requestJson = r.Request.Utf8String();
183-
}
184-
179+
180+
if (r.Request != null)
181+
{
182+
requestJson = r.Request.Utf8String();
183+
}
184+
185185
var print = _printFormat.F(
186186
Environment.NewLine,
187187
r.HttpStatusCode.HasValue ? r.HttpStatusCode.Value.ToString(CultureInfo.InvariantCulture) : "-1",

0 commit comments

Comments
 (0)