Skip to content

Commit 2b38f8b

Browse files
committed
Implement request interception support and refactor ExecuteAsync method for improved request handling
1 parent a550937 commit 2b38f8b

File tree

4 files changed

+44
-17
lines changed

4 files changed

+44
-17
lines changed

GraphQLSharp/Client/GraphQLClient.cs

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -24,28 +24,18 @@ public Task<GraphQLResponse<T>> ExecuteAsync<T>([StringSyntax("GraphQL")] string
2424

2525
public async Task<GraphQLResponse<T>> ExecuteAsync<T>(GraphQLRequest request, GraphQLClientOptions options = null, CancellationToken cancellationToken = default)
2626
{
27-
HttpRequestMessage CreateHttpRequest(GraphQLRequest request, GraphQLClientOptions options)
28-
{
29-
var uri = options?.Uri ?? _defaultOptions.Uri;
30-
var requestMessage = new HttpRequestMessage
31-
{
32-
Method = HttpMethod.Post,
33-
RequestUri = uri,
34-
Content = JsonContent.Create(request, options: Serializer.Options),
35-
};
36-
37-
requestMessage.Headers.UserAgent.Add(_defaultUserAgent);
38-
_defaultOptions?.ConfigureHttpRequestHeaders?.Invoke(requestMessage.Headers);
39-
options?.ConfigureHttpRequestHeaders?.Invoke(requestMessage.Headers);
40-
return requestMessage;
41-
}
27+
var interceptor = options?.Interceptor ?? _defaultOptions.Interceptor ?? NoOpInterceptor.Instance;
28+
return await interceptor.InterceptRequestAsync(request, async req => await ExecuteCoreAsync<T>(req, options, cancellationToken), cancellationToken);
29+
}
4230

31+
private async Task<GraphQLResponse<T>> ExecuteCoreAsync<T>(GraphQLRequest request, GraphQLClientOptions options = null, CancellationToken cancellationToken = default)
32+
{
4333
HttpResponse httpResponse = null;
4434
try
4535
{
46-
var httpClient = options?.HttpClient ?? _defaultOptions.HttpClient ?? _defaultHttpClient;
4736
using HttpRequestMessage requestMessage = CreateHttpRequest(request, options);
4837

38+
var httpClient = options?.HttpClient ?? _defaultOptions.HttpClient ?? _defaultHttpClient;
4939
using var httpResponseMsg = await httpClient.SendAsync(requestMessage, cancellationToken);
5040
//httpResponseMsg needs to disposed so we create a small copy of basic information
5141
httpResponse = new HttpResponse(httpResponseMsg);
@@ -84,4 +74,20 @@ HttpRequestMessage CreateHttpRequest(GraphQLRequest request, GraphQLClientOption
8474
throw new GraphQLException(request, httpResponse, $"Unexpected GraphQL error: {request}", ex);
8575
}
8676
}
77+
78+
private HttpRequestMessage CreateHttpRequest(GraphQLRequest request, GraphQLClientOptions options)
79+
{
80+
var uri = options?.Uri ?? _defaultOptions.Uri;
81+
var requestMessage = new HttpRequestMessage
82+
{
83+
Method = HttpMethod.Post,
84+
RequestUri = uri,
85+
Content = JsonContent.Create(request, options: Serializer.Options),
86+
};
87+
88+
requestMessage.Headers.UserAgent.Add(_defaultUserAgent);
89+
_defaultOptions?.ConfigureHttpRequestHeaders?.Invoke(requestMessage.Headers);
90+
options?.ConfigureHttpRequestHeaders?.Invoke(requestMessage.Headers);
91+
return requestMessage;
92+
}
8793
}

GraphQLSharp/Client/GraphQLClientOptions.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,6 @@ public class GraphQLClientOptions
1515
public HttpClient HttpClient { get; init; }
1616

1717
public Action<HttpRequestHeaders> ConfigureHttpRequestHeaders { get; init; }
18-
}
18+
19+
public IInterceptor Interceptor { get; init; }
20+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
namespace GraphQLSharp;
2+
3+
public interface IInterceptor
4+
{
5+
Task<GraphQLResponse<T>> InterceptRequestAsync<T>(GraphQLRequest request, Func<GraphQLRequest, Task<GraphQLResponse<T>>> executeAsync, CancellationToken cancellationToken);
6+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
namespace GraphQLSharp;
2+
3+
public class NoOpInterceptor : IInterceptor
4+
{
5+
public static readonly NoOpInterceptor Instance = new();
6+
7+
private NoOpInterceptor() { }
8+
9+
public Task<GraphQLResponse<T>> InterceptRequestAsync<T>(GraphQLRequest request, Func<GraphQLRequest, Task<GraphQLResponse<T>>> executeAsync, CancellationToken cancellationToken)
10+
{
11+
return executeAsync(request);
12+
}
13+
}

0 commit comments

Comments
 (0)