Skip to content

Commit

Permalink
Integrated Gateway into Request Pipeline (#5299)
Browse files Browse the repository at this point in the history
  • Loading branch information
michaelstaib committed Aug 15, 2022
1 parent 9f44720 commit c73b817
Show file tree
Hide file tree
Showing 35 changed files with 1,353 additions and 935 deletions.
2 changes: 1 addition & 1 deletion global.json
@@ -1,6 +1,6 @@
{
"sdk": {
"version": "7.0.100-preview.6.22352.1",
"version": "7.0.100-preview.7.22377.5",
"rollForward": "latestMinor"
}
}
Expand Up @@ -9,7 +9,7 @@ namespace HotChocolate.AspNetCore.Serialization;

public class DefaultHttpResultSerializer : IHttpResultSerializer
{
private readonly JsonQueryResultFormatter _jsonFormatter;
private readonly IQueryResultFormatter _jsonFormatter;

private readonly string _deferContentType;
private readonly IResponseStreamFormatter _deferFormatter;
Expand Down Expand Up @@ -69,6 +69,41 @@ public class DefaultHttpResultSerializer : IHttpResultSerializer
}
}

/// <summary>
/// Creates a new instance of <see cref="DefaultHttpResultSerializer" />.
/// </summary>
protected DefaultHttpResultSerializer(
IQueryResultFormatter jsonFormatter,
HttpResultSerialization batchSerialization = HttpResultSerialization.MultiPartChunked,
HttpResultSerialization deferSerialization = HttpResultSerialization.MultiPartChunked)
{
_jsonFormatter = jsonFormatter;
var jsonArrayFormatter = new JsonArrayResponseStreamFormatter(_jsonFormatter);
var multiPartFormatter = new MultiPartResponseStreamFormatter(_jsonFormatter);

if (deferSerialization is HttpResultSerialization.JsonArray)
{
_deferContentType = ContentType.Json;
_deferFormatter = jsonArrayFormatter;
}
else
{
_deferContentType = ContentType.MultiPart;
_deferFormatter = multiPartFormatter;
}

if (batchSerialization is HttpResultSerialization.JsonArray)
{
_batchContentType = ContentType.Json;
_batchFormatter = jsonArrayFormatter;
}
else
{
_batchContentType = ContentType.MultiPart;
_batchFormatter = multiPartFormatter;
}
}

public virtual string GetContentType(IExecutionResult result)
{
if (result is null)
Expand Down
Expand Up @@ -225,7 +225,7 @@ public ApolloSubscriptionProtocolHandler(ISocketSessionInterceptor interceptor)
jsonWriter.WriteString(Id, operationSessionId);
jsonWriter.WriteString(MessageProperties.Type, Utf8Messages.Data);
jsonWriter.WritePropertyName(Payload);
_formatter.Serialize(result, jsonWriter);
_formatter.Format(result, jsonWriter);
jsonWriter.WriteEndObject();
await jsonWriter.FlushAsync(cancellationToken);
await session.Connection.SendAsync(arrayWriter.Body, cancellationToken);
Expand All @@ -243,7 +243,7 @@ public ApolloSubscriptionProtocolHandler(ISocketSessionInterceptor interceptor)
jsonWriter.WriteString(Id, operationSessionId);
jsonWriter.WriteString(MessageProperties.Type, Utf8Messages.Error);
jsonWriter.WritePropertyName(Payload);
_formatter.Serialize(errors[0], jsonWriter);
_formatter.Format(errors[0], jsonWriter);
jsonWriter.WriteEndObject();
await jsonWriter.FlushAsync(cancellationToken);
await session.Connection.SendAsync(arrayWriter.Body, cancellationToken);
Expand Down
Expand Up @@ -204,7 +204,7 @@ public GraphQLOverWebSocketProtocolHandler(ISocketSessionInterceptor interceptor
jsonWriter.WriteString(Id, operationSessionId);
jsonWriter.WriteString(MessageProperties.Type, Utf8Messages.Next);
jsonWriter.WritePropertyName(Payload);
_formatter.Serialize(result, jsonWriter);
_formatter.Format(result, jsonWriter);
jsonWriter.WriteEndObject();
await jsonWriter.FlushAsync(cancellationToken);
await session.Connection.SendAsync(arrayWriter.Body, cancellationToken);
Expand All @@ -222,7 +222,7 @@ public GraphQLOverWebSocketProtocolHandler(ISocketSessionInterceptor interceptor
jsonWriter.WriteString(Id, operationSessionId);
jsonWriter.WriteString(MessageProperties.Type, Utf8Messages.Error);
jsonWriter.WritePropertyName(Payload);
_formatter.Serialize(errors, jsonWriter);
_formatter.Format(errors, jsonWriter);
jsonWriter.WriteEndObject();
await jsonWriter.FlushAsync(cancellationToken);
await session.Connection.SendAsync(arrayWriter.Body, cancellationToken);
Expand Down
2 changes: 1 addition & 1 deletion src/HotChocolate/AspNetCore/test/Directory.Build.props
Expand Up @@ -21,7 +21,7 @@
<PackageReference Include="Microsoft.AspNetCore.TestHost" Version="3.1.4" Condition="'$(TargetFramework)' == 'netcoreapp3.1'"/>
<PackageReference Include="Microsoft.AspNetCore.TestHost" Version="5.0.17" Condition="'$(TargetFramework)' == 'net5.0'"/>
<PackageReference Include="Microsoft.AspNetCore.TestHost" Version="6.0.7" Condition="'$(TargetFramework)' == 'net6.0'"/>
<PackageReference Include="Microsoft.AspNetCore.TestHost" Version="7.0.0-preview.6.22330.3" Condition="'$(TargetFramework)' == 'net7.0'"/>
<PackageReference Include="Microsoft.AspNetCore.TestHost" Version="7.0.0-preview.7.22376.6" Condition="'$(TargetFramework)' == 'net7.0'"/>
<PackageReference Include="coverlet.collector" Version="3.1.2">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
Expand Down
Expand Up @@ -49,8 +49,8 @@ public static class ExecutionResultExtensions
if (result is IQueryResult queryResult)
{
return withIndentations
? _formatterIndented.Serialize(queryResult)
: _formatter.Serialize(queryResult);
? _formatterIndented.Format(queryResult)
: _formatter.Format(queryResult);
}

throw new NotSupportedException(ExecutionResultExtensions_OnlyQueryResults);
Expand Down
Expand Up @@ -12,7 +12,7 @@ public sealed class JsonArrayResponseStreamFormatter : IResponseStreamFormatter
private const byte _leftBracket = (byte)'[';
private const byte _rightBracket = (byte)']';
private const byte _comma = (byte)',';
private readonly JsonQueryResultFormatter _formatter;
private readonly IQueryResultFormatter _formatter;

/// <summary>
/// Creates a new instance of <see cref="JsonArrayResponseStreamFormatter" />.
Expand Down Expand Up @@ -44,7 +44,7 @@ public sealed class JsonArrayResponseStreamFormatter : IResponseStreamFormatter
/// <paramref name="formatter"/> is <c>null</c>.
/// </exception>
public JsonArrayResponseStreamFormatter(
JsonQueryResultFormatter formatter)
IQueryResultFormatter formatter)
{
_formatter = formatter ??
throw new ArgumentNullException(nameof(formatter));
Expand Down
Expand Up @@ -37,7 +37,7 @@ public JsonQueryResultFormatter(bool indented = false, JavaScriptEncoder? encode
_options = new JsonWriterOptions { Indented = indented, Encoder = encoder };
}

public unsafe string Serialize(IQueryResult result)
public unsafe string Format(IQueryResult result)
{
if (result is null)
{
Expand All @@ -54,7 +54,7 @@ public unsafe string Serialize(IQueryResult result)
}
}

public void Serialize(IQueryResult result, Utf8JsonWriter writer)
public void Format(IQueryResult result, Utf8JsonWriter writer)
{
if (result is null)
{
Expand All @@ -69,7 +69,7 @@ public void Serialize(IQueryResult result, Utf8JsonWriter writer)
WriteResult(writer, result);
}

public void Serialize(IError error, Utf8JsonWriter writer)
public void Format(IError error, Utf8JsonWriter writer)
{
if (error is null)
{
Expand All @@ -84,7 +84,7 @@ public void Serialize(IError error, Utf8JsonWriter writer)
WriteError(writer, error);
}

public void Serialize(IReadOnlyList<IError> errors, Utf8JsonWriter writer)
public void Format(IReadOnlyList<IError> errors, Utf8JsonWriter writer)
{
if (errors is null)
{
Expand Down Expand Up @@ -359,7 +359,7 @@ private static void WritePathValue(Utf8JsonWriter writer, Path path)

ref var searchSpace = ref objectResult.GetReference();

for(var i = 0; i < objectResult.Capacity; i++)
for (var i = 0; i < objectResult.Capacity; i++)
{
var field = Unsafe.Add(ref searchSpace, i);
if (field.IsInitialized)
Expand Down Expand Up @@ -403,6 +403,76 @@ private static void WritePathValue(Utf8JsonWriter writer, Path path)
writer.WriteEndArray();
}

#if NET5_0_OR_GREATER
private void WriteJsonElement(
Utf8JsonWriter writer,
JsonElement element)
{
switch (element.ValueKind)
{
case JsonValueKind.Object:
WriteJsonObject(writer, element);
break;

case JsonValueKind.Array:
WriteJsonArray(writer, element);
break;

case JsonValueKind.String:
writer.WriteStringValue(element.GetString());
break;

case JsonValueKind.Number:
writer.WriteRawValue(element.GetRawText());
break;

case JsonValueKind.True:
writer.WriteBooleanValue(true);
break;

case JsonValueKind.False:
writer.WriteBooleanValue(false);
break;

case JsonValueKind.Null:
writer.WriteNullValue();
break;

default:
throw new ArgumentOutOfRangeException();
}
}

private void WriteJsonObject(
Utf8JsonWriter writer,
JsonElement element)
{
writer.WriteStartObject();

foreach (var item in element.EnumerateObject())
{
writer.WritePropertyName(item.Name);
WriteJsonElement(writer, item.Value);
}

writer.WriteEndObject();
}

private void WriteJsonArray(
Utf8JsonWriter writer,
JsonElement element)
{
writer.WriteStartArray();

foreach (var item in element.EnumerateArray())
{
WriteJsonElement(writer, item);
}

writer.WriteEndArray();
}

#endif
private void WriteFieldValue(
Utf8JsonWriter writer,
object? value)
Expand All @@ -423,6 +493,11 @@ private static void WritePathValue(Utf8JsonWriter writer, Path path)
WriteListResult(writer, resultMapList);
break;

#if NET5_0_OR_GREATER
case JsonElement element:
WriteJsonElement(writer, element);
break;
#endif
case Dictionary<string, object?> dict:
WriteDictionary(writer, dict);
break;
Expand Down
2 changes: 1 addition & 1 deletion src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj
Expand Up @@ -38,7 +38,7 @@
<PackageReference Include="Microsoft.Extensions.ObjectPool" Version="3.1.4" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="3.1.4" />
<PackageReference Include="System.ComponentModel.Annotations" Version="4.7.0" />
<PackageReference Include="System.Text.Json" Version="4.7.0" />
<PackageReference Include="System.Text.Json" Version="6.0.0" />
</ItemGroup>

<ItemGroup>
Expand Down
Expand Up @@ -17,7 +17,7 @@
</ItemGroup>

<ItemGroup Condition="'$(TargetFramework)' == 'net7.0'">
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.0-preview.6.22329.4" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.0-preview.7.22376.2" />
</ItemGroup>

<ItemGroup>
Expand Down
Expand Up @@ -22,10 +22,10 @@
</ItemGroup>

<ItemGroup Condition="'$(TargetFramework)' == 'net7.0'">
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="7.0.0-preview.6.22324.4" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.0-preview.6.22329.4" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="7.0.0-preview.6.22329.4" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="7.0.0-preview.6.22329.4" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="7.0.0-preview.7.22375.6" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.0-preview.7.22376.2" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="7.0.0-preview.7.22376.2" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="7.0.0-preview.7.22376.2" />
</ItemGroup>

</Project>
Expand Up @@ -15,8 +15,8 @@
</ItemGroup>

<ItemGroup Condition="'$(TargetFramework)' == 'net7.0'">
<PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="7.0.0-preview.6.22329.4" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="7.0.0-preview.6.22329.4" />
<PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="7.0.0-preview.7.22376.2" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="7.0.0-preview.7.22376.2" />
</ItemGroup>

<ItemGroup>
Expand Down
Expand Up @@ -16,9 +16,9 @@
</ItemGroup>

<ItemGroup Condition="'$(TargetFramework)' == 'net7.0'">
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.0-preview.6.22329.4" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="7.0.0-preview.6.22329.4" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="7.0.0-preview.6.22329.4" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.0-preview.7.22376.2" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="7.0.0-preview.7.22376.2" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="7.0.0-preview.7.22376.2" />
</ItemGroup>

</Project>
Expand Up @@ -17,10 +17,10 @@
</ItemGroup>

<ItemGroup Condition="'$(TargetFramework)' == 'net7.0'">
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="7.0.0-preview.6.22324.4" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.0-preview.6.22329.4" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="7.0.0-preview.6.22329.4" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="7.0.0-preview.6.22329.4" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="7.0.0-preview.7.22375.6" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.0-preview.7.22376.2" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="7.0.0-preview.7.22376.2" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="7.0.0-preview.7.22376.2" />
</ItemGroup>

</Project>
Expand Up @@ -16,9 +16,9 @@
</ItemGroup>

<ItemGroup Condition="'$(TargetFramework)' == 'net7.0'">
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.0-preview.6.22329.4" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="7.0.0-preview.6.22329.4" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="7.0.0-preview.6.22329.4" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.0-preview.7.22376.2" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="7.0.0-preview.7.22376.2" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="7.0.0-preview.7.22376.2" />
</ItemGroup>

</Project>
4 changes: 4 additions & 0 deletions src/HotChocolate/Fusion/src/Core/Clients/GraphQLHttpClient.cs
Expand Up @@ -7,6 +7,9 @@

namespace HotChocolate.Fusion.Clients;

// note: should the GraphQL client handle the capabilities?
// meaning the execution engine should just use batching and
// all and the client decides to batch if batching is available?
public sealed class GraphQLHttpClient : IGraphQLClient
{
private readonly IHttpClientFactory _httpClientFactory;
Expand All @@ -18,6 +21,7 @@ public GraphQLHttpClient(string schemaName, IHttpClientFactory httpClientFactory
SchemaName = schemaName;
}

// TODO: naming? SubGraphName?
public string SchemaName { get; }

public async Task<GraphQLResponse> ExecuteAsync(GraphQLRequest request, CancellationToken cancellationToken)
Expand Down

0 comments on commit c73b817

Please sign in to comment.