Skip to content

Commit c7809e7

Browse files
committed
Merge branch 'master' into api
2 parents 77445c6 + f1a5bf8 commit c7809e7

6 files changed

Lines changed: 52 additions & 10 deletions

File tree

src/GraphQL.Client/GraphQLHttpClientOptions.cs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,17 @@ public class GraphQLHttpClientOptions
6161
/// Note that compatible to the draft graphql-over-http spec GraphQL Server MAY return 4xx status codes (401/403, etc.)
6262
/// with well-formed GraphQL response containing errors collection.
6363
/// </summary>
64-
public Func<HttpResponseMessage, bool> IsValidResponseToDeserialize { get; set; } = r =>
65-
// Why not application/json? See https://github.com/graphql/graphql-over-http/blob/main/spec/GraphQLOverHTTP.md#processing-the-response
66-
r.IsSuccessStatusCode || r.StatusCode == HttpStatusCode.BadRequest || r.Content.Headers.ContentType?.MediaType == "application/graphql+json";
64+
public Func<HttpResponseMessage, bool> IsValidResponseToDeserialize { get; set; } = DefaultIsValidResponseToDeserialize;
65+
66+
private static readonly IReadOnlyCollection<string> _acceptedResponseContentTypes = new[] { "application/graphql+json", "application/json", "application/graphql-response+json" };
67+
68+
public static bool DefaultIsValidResponseToDeserialize(HttpResponseMessage r)
69+
{
70+
if (r.Content.Headers.ContentType?.MediaType != null && !_acceptedResponseContentTypes.Contains(r.Content.Headers.ContentType.MediaType))
71+
return false;
72+
73+
return r.IsSuccessStatusCode || r.StatusCode == HttpStatusCode.BadRequest;
74+
}
6775

6876
/// <summary>
6977
/// This callback is called after successfully establishing a websocket connection but before any regular request is made.

src/GraphQL.Client/GraphQLHttpRequest.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,13 @@ public GraphQLHttpRequest()
1111
{
1212
}
1313

14-
public GraphQLHttpRequest(string query, object? variables = null, string? operationName = null) : base(query, variables, operationName)
14+
public GraphQLHttpRequest(string query, object? variables = null, string? operationName = null, Dictionary<string, object?>? extensions = null)
15+
: base(query, variables, operationName, extensions)
1516
{
1617
}
1718

18-
public GraphQLHttpRequest(GraphQLRequest other) : base(other)
19+
public GraphQLHttpRequest(GraphQLRequest other)
20+
: base(other)
1921
{
2022
}
2123

src/GraphQL.Primitives/GraphQLRequest.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,15 +40,15 @@ public object? Variables
4040
/// <summary>
4141
/// Represents the request extensions
4242
/// </summary>
43-
public object? Extensions
43+
public Dictionary<string, object?>? Extensions
4444
{
45-
get => TryGetValue(EXTENSIONS_KEY, out object value) ? value : null;
45+
get => TryGetValue(EXTENSIONS_KEY, out object value) && value is Dictionary<string, object?> d ? d : null;
4646
set => this[EXTENSIONS_KEY] = value;
4747
}
4848

4949
public GraphQLRequest() { }
5050

51-
public GraphQLRequest(string query, object? variables = null, string? operationName = null, object? extensions = null)
51+
public GraphQLRequest(string query, object? variables = null, string? operationName = null, Dictionary<string, object?>? extensions = null)
5252
{
5353
Query = query;
5454
Variables = variables;
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
using System.Net;
2+
using System.Net.Http.Headers;
3+
using FluentAssertions;
4+
using GraphQL.Client.Http;
5+
using Xunit;
6+
7+
namespace GraphQL.Client.Serializer.Tests;
8+
9+
public class DefaultValidationTest
10+
{
11+
[Theory]
12+
[InlineData(HttpStatusCode.OK, "application/json", true)]
13+
[InlineData(HttpStatusCode.OK, "application/graphql-response+json", true)]
14+
[InlineData(HttpStatusCode.BadRequest, "application/json", true)]
15+
[InlineData(HttpStatusCode.BadRequest, "text/html", false)]
16+
[InlineData(HttpStatusCode.OK, "text/html", false)]
17+
[InlineData(HttpStatusCode.Forbidden, "text/html", false)]
18+
[InlineData(HttpStatusCode.Forbidden, "application/json", false)]
19+
public void IsValidResponse_OkJson_True(HttpStatusCode statusCode, string mediaType, bool expectedResult)
20+
{
21+
var response = new HttpResponseMessage(statusCode);
22+
response.Content.Headers.ContentType = new MediaTypeHeaderValue(mediaType);
23+
24+
bool isValid = new GraphQLHttpClientOptions().IsValidResponseToDeserialize(response);
25+
26+
isValid.Should().Be(expectedResult);
27+
}
28+
}

tests/GraphQL.Client.Serializer.Tests/TestData/SerializeToStringTestData.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ public IEnumerator<object[]> GetEnumerator()
1010
"{\"query\":\"simplequerystring\",\"variables\":null,\"operationName\":null,\"extensions\":null}",
1111
new GraphQLRequest("simple query string")
1212
};
13+
yield return new object[] {
14+
"{\"query\":\"simplequerystring\",\"variables\":null,\"operationName\":null,\"extensions\":{\"a\":\"abc\",\"b\":true,\"c\":{\"d\":42}}}",
15+
new GraphQLRequest("simple query string", extensions: new Dictionary<string, object?> { ["a"] = "abc", ["b"] = true, ["c"] = new Dictionary<string, object> { ["d"] = 42 } })
16+
};
1317
yield return new object[] {
1418
"{\"query\":\"simplequerystring\",\"variables\":{\"camelCaseProperty\":\"camelCase\",\"PascalCaseProperty\":\"PascalCase\"},\"operationName\":null,\"extensions\":null}",
1519
new GraphQLRequest("simple query string", new { camelCaseProperty = "camelCase", PascalCaseProperty = "PascalCase"})

tests/GraphQL.Client.Tests.Common/GraphQL.Client.Tests.Common.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<Project Sdk="Microsoft.NET.Sdk">
1+
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
44
<TargetFramework>net7.0</TargetFramework>
@@ -7,7 +7,7 @@
77

88
<ItemGroup>
99
<PackageReference Include="FluentAssertions.Reactive" Version="0.2.0" />
10-
<PackageReference Include="GraphQL" Version="7.4.0" />
10+
<PackageReference Include="GraphQL" Version="7.4.1" />
1111
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="7.0.0" />
1212
</ItemGroup>
1313

0 commit comments

Comments
 (0)