From da7a95f563fe78ef06eff17a9394ebf806edb9e2 Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Fri, 4 May 2018 16:08:06 -0700 Subject: [PATCH] Handle null collections when writing NegotiateResponse (#2202) --- .../NegotiateProtocol.cs | 30 +++++++++------ .../NegotiateProtocolTests.cs | 38 ++++++++++++++++++- 2 files changed, 55 insertions(+), 13 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Connections.Common/NegotiateProtocol.cs b/src/Microsoft.AspNetCore.Http.Connections.Common/NegotiateProtocol.cs index b23dcb4be6..0102da6ae2 100644 --- a/src/Microsoft.AspNetCore.Http.Connections.Common/NegotiateProtocol.cs +++ b/src/Microsoft.AspNetCore.Http.Connections.Common/NegotiateProtocol.cs @@ -49,21 +49,27 @@ namespace Microsoft.AspNetCore.Http.Connections jsonWriter.WritePropertyName(AvailableTransportsPropertyName); jsonWriter.WriteStartArray(); - foreach (var availableTransport in response.AvailableTransports) + if (response.AvailableTransports != null) { - jsonWriter.WriteStartObject(); - jsonWriter.WritePropertyName(TransportPropertyName); - jsonWriter.WriteValue(availableTransport.Transport); - jsonWriter.WritePropertyName(TransferFormatsPropertyName); - jsonWriter.WriteStartArray(); - - foreach (var transferFormat in availableTransport.TransferFormats) + foreach (var availableTransport in response.AvailableTransports) { - jsonWriter.WriteValue(transferFormat); - } + jsonWriter.WriteStartObject(); + jsonWriter.WritePropertyName(TransportPropertyName); + jsonWriter.WriteValue(availableTransport.Transport); + jsonWriter.WritePropertyName(TransferFormatsPropertyName); + jsonWriter.WriteStartArray(); - jsonWriter.WriteEndArray(); - jsonWriter.WriteEndObject(); + if (availableTransport.TransferFormats != null) + { + foreach (var transferFormat in availableTransport.TransferFormats) + { + jsonWriter.WriteValue(transferFormat); + } + } + + jsonWriter.WriteEndArray(); + jsonWriter.WriteEndObject(); + } } jsonWriter.WriteEndArray(); diff --git a/test/Microsoft.AspNetCore.Http.Connections.Tests/NegotiateProtocolTests.cs b/test/Microsoft.AspNetCore.Http.Connections.Tests/NegotiateProtocolTests.cs index 85bbd0bf47..b959e3b44e 100644 --- a/test/Microsoft.AspNetCore.Http.Connections.Tests/NegotiateProtocolTests.cs +++ b/test/Microsoft.AspNetCore.Http.Connections.Tests/NegotiateProtocolTests.cs @@ -1,7 +1,11 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; -using Microsoft.AspNetCore.Http.Connections.Internal; +using Microsoft.AspNetCore.Internal; using Xunit; namespace Microsoft.AspNetCore.Http.Connections.Tests @@ -50,5 +54,37 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests Assert.Equal(expectedMessage, exception.InnerException.Message); } + + [Fact] + public void WriteNegotiateResponseWithNullAvailableTransports() + { + using (MemoryBufferWriter writer = new MemoryBufferWriter()) + { + NegotiateProtocol.WriteResponse(new NegotiationResponse(), writer); + + string json = Encoding.UTF8.GetString(writer.ToArray()); + + Assert.Equal("{\"availableTransports\":[]}", json); + } + } + + [Fact] + public void WriteNegotiateResponseWithNullTransferFormats() + { + using (MemoryBufferWriter writer = new MemoryBufferWriter()) + { + NegotiateProtocol.WriteResponse(new NegotiationResponse + { + AvailableTransports = new List + { + new AvailableTransport() + } + }, writer); + + string json = Encoding.UTF8.GetString(writer.ToArray()); + + Assert.Equal("{\"availableTransports\":[{\"transport\":null,\"transferFormats\":[]}]}", json); + } + } } }