public static void AssertTrailerStatus(this HttpResponseMessage response, StatusCode statusCode, string details) { HttpResponseHeaders statusHeadersCollection; var statusString = GetStatusValue(response.TrailingHeaders, GrpcProtocolConstants.StatusTrailer); if (statusString != null) { statusHeadersCollection = response.TrailingHeaders; } else { statusString = GetStatusValue(response.Headers, GrpcProtocolConstants.StatusTrailer); statusHeadersCollection = response.Headers; if (statusString == null) { Assert.Fail($"Could not get {GrpcProtocolConstants.StatusTrailer} from response."); } } // Get message from the same collection as the status var messageString = GetStatusValue(statusHeadersCollection, GrpcProtocolConstants.MessageTrailer); Assert.AreEqual(statusCode.ToTrailerString(), statusString, $"Expected grpc-status {statusCode} but got {(StatusCode)Convert.ToInt32(statusString, CultureInfo.InvariantCulture)}. Message: {messageString}"); if (messageString != null) { Assert.AreEqual(PercentEncodingHelpers.PercentEncode(details), messageString); } else { Assert.IsTrue(string.IsNullOrEmpty(details)); } }
public void AssertTrailerStatus(StatusCode statusCode, string details) { var trailerValueString = TrailersContainer.Trailers[GrpcProtocolConstants.StatusTrailer].ToString(); Assert.AreEqual(statusCode.ToTrailerString(), trailerValueString, $"Expected grpc-status {statusCode} but got {(StatusCode)Convert.ToInt32(trailerValueString)}"); Assert.AreEqual(PercentEncodingHelpers.PercentEncode(details), TrailersContainer.Trailers[GrpcProtocolConstants.MessageTrailer].ToString()); }
public void PercentEncode_UnmatchedHighSurrogate_ReplacementCharacter() { // Arrange & Act var escaped = PercentEncodingHelpers.PercentEncode("unmatchedHighSurrogate " + ((char)0xD801)); // Assert Assert.AreEqual("unmatchedHighSurrogate %EF%BF%BD", escaped); }
public void PercentEncode_UnmatchedHighSurrogatesFollowedByAscii_AsciiNotEncoded() { // Arrange & Act var escaped = PercentEncodingHelpers.PercentEncode("unmatchedHighSurrogate " + ((char)0xD801) + ((char)0xD801) + "a"); // Assert Assert.AreEqual("unmatchedHighSurrogate %EF%BF%BD%EF%BF%BDa", escaped); }
public void EncodeMessageTrailer(string value, string expectedEncodedValue) { // Arrange & Act var encodedValue = PercentEncodingHelpers.PercentEncode(value); // Assert Assert.AreEqual(expectedEncodedValue, encodedValue); }
public void ShiftInChar_Roundtrip_Success() { // Arrange & Act var encodedValue = PercentEncodingHelpers.PercentEncode("\x0f"); var decodedValue = Uri.UnescapeDataString("%0F"); // Assert Assert.AreEqual("%0F", encodedValue); Assert.AreEqual("\x0f", decodedValue); }
public void PercentEncode_LargeUnicodeString_OverflowErrorThrown() { // Arrange var originalText = new string('元', int.MaxValue / 8); // Act var ex = Assert.Throws <InvalidOperationException>(() => PercentEncodingHelpers.PercentEncode(originalText)) !; // Assert Assert.AreEqual("Value is too large to encode.", ex.Message); }
public void PercentEncode_TrailingHighSurrogate_SurrogatePairCorrectlyEncoded() { // Arrange var originalText = "unmatchedLowSurrogate " + new string('£', PercentEncodingHelpers.MaxUnicodeCharsReallocate - 2) + "😀"; // Act var escaped = PercentEncodingHelpers.PercentEncode(originalText); // Assert Assert.IsTrue(escaped.EndsWith("%F0%9F%98%80"), escaped); Assert.AreEqual(originalText, Uri.UnescapeDataString(escaped)); }
public static void AssertTrailerStatus(this HttpResponseMessage response, StatusCode statusCode, string details) { var trailerValueString = response.TrailingHeaders.GetValues(GrpcProtocolConstants.StatusTrailer).Single(); Assert.AreEqual(statusCode.ToTrailerString(), trailerValueString, $"Expected grpc-status {statusCode} but got {(StatusCode)Convert.ToInt32(trailerValueString)}"); if (response.TrailingHeaders.TryGetValues(GrpcProtocolConstants.MessageTrailer, out var values)) { Assert.AreEqual(PercentEncodingHelpers.PercentEncode(details), values.Single()); } else { Assert.IsTrue(string.IsNullOrEmpty(details)); } }
public void ConsolidateTrailers_AppendsStatus_PercentEncodesMessage() { // Arrange var errorMessage = "\t\ntest with whitespace\r\nand Unicode BMP ☺ and non-BMP 😈\t\n"; var httpContext = new DefaultHttpContext(); httpContext.Features.Set <IHttpResponseTrailersFeature>(new TestHttpResponseTrailersFeature()); var serverCallContext = CreateServerCallContext(httpContext); serverCallContext.Status = new Status(StatusCode.Internal, errorMessage); // Act httpContext.Response.ConsolidateTrailers(serverCallContext); // Assert var responseTrailers = httpContext.Features.Get <IHttpResponseTrailersFeature>().Trailers; Assert.AreEqual(2, responseTrailers.Count); Assert.AreEqual(StatusCode.Internal.ToString("D"), responseTrailers[GrpcProtocolConstants.StatusTrailer]); Assert.AreEqual(PercentEncodingHelpers.PercentEncode(errorMessage), responseTrailers[GrpcProtocolConstants.MessageTrailer].ToString()); }