e79aa3c0ed
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
177 lines
7.9 KiB
C#
177 lines
7.9 KiB
C#
// <copyright>
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
// </copyright>
|
|
|
|
namespace System.ServiceModel.Channels
|
|
{
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Net.Http;
|
|
using System.Net.Http.Headers;
|
|
using System.Runtime;
|
|
|
|
internal static class HttpResponseMessageExtensionMethods
|
|
{
|
|
internal static void AddHeader(this HttpResponseMessage httpResponseMessage, string header, string value)
|
|
{
|
|
Fx.Assert(httpResponseMessage != null, "The 'httpResponseMessage' parameter should never be null.");
|
|
Fx.Assert(!string.IsNullOrWhiteSpace(header), "The 'header' parameter should never be null or whitespace.");
|
|
|
|
HttpHeaderInfo headerInfo = HttpHeaderInfo.Create(header);
|
|
EnsureNotRequestHeader(headerInfo);
|
|
AddHeader(httpResponseMessage, headerInfo, value);
|
|
}
|
|
|
|
internal static void SetHeader(this HttpResponseMessage httpResponseMessage, string header, string value)
|
|
{
|
|
Fx.Assert(httpResponseMessage != null, "The 'httpResponseMessage' parameter should never be null.");
|
|
Fx.Assert(!string.IsNullOrWhiteSpace(header), "The 'header' parameter should never be null or whitespace.");
|
|
|
|
HttpHeaderInfo headerInfo = HttpHeaderInfo.Create(header);
|
|
EnsureNotRequestHeader(headerInfo);
|
|
RemoveHeader(httpResponseMessage, headerInfo);
|
|
AddHeader(httpResponseMessage, headerInfo, value);
|
|
}
|
|
|
|
internal static IEnumerable<string> GetHeader(this HttpResponseMessage httpResponseMessage, string header)
|
|
{
|
|
Fx.Assert(httpResponseMessage != null, "The 'httpResponseMessage' parameter should never be null.");
|
|
Fx.Assert(!string.IsNullOrWhiteSpace(header), "The 'header' parameter should never be null or whitespace.");
|
|
|
|
HttpHeaderInfo headerInfo = HttpHeaderInfo.Create(header);
|
|
EnsureNotRequestHeader(headerInfo);
|
|
return GetHeader(httpResponseMessage, headerInfo);
|
|
}
|
|
|
|
internal static void RemoveHeader(this HttpResponseMessage httpResponseMessage, string header)
|
|
{
|
|
Fx.Assert(httpResponseMessage != null, "The 'httpResponseMessage' parameter should never be null.");
|
|
Fx.Assert(!string.IsNullOrWhiteSpace(header), "The 'header' parameter should never be null or whitespace.");
|
|
|
|
HttpHeaderInfo headerInfo = HttpHeaderInfo.Create(header);
|
|
EnsureNotRequestHeader(headerInfo);
|
|
RemoveHeader(httpResponseMessage, headerInfo);
|
|
}
|
|
|
|
internal static HttpResponseMessage CreateBufferedCopy(this HttpResponseMessage httpResponseMessage)
|
|
{
|
|
Fx.Assert(httpResponseMessage != null, "The 'httpResponseMessage' parameter should never be null.");
|
|
|
|
HttpResponseMessage bufferedHttpResponseMessage = new HttpResponseMessage();
|
|
bufferedHttpResponseMessage.ReasonPhrase = httpResponseMessage.ReasonPhrase;
|
|
bufferedHttpResponseMessage.StatusCode = httpResponseMessage.StatusCode;
|
|
bufferedHttpResponseMessage.Version = (Version)(httpResponseMessage.Version != null ? httpResponseMessage.Version.Clone() : null);
|
|
|
|
if (httpResponseMessage.RequestMessage != null)
|
|
{
|
|
bufferedHttpResponseMessage.RequestMessage = httpResponseMessage.RequestMessage.CreateBufferedCopy();
|
|
}
|
|
|
|
foreach (KeyValuePair<string, IEnumerable<string>> header in httpResponseMessage.Headers)
|
|
{
|
|
bufferedHttpResponseMessage.Headers.AddHeaderWithoutValidation(header);
|
|
}
|
|
|
|
bufferedHttpResponseMessage.Content = HttpRequestMessageExtensionMethods.CreateBufferedCopyOfContent(httpResponseMessage.Content);
|
|
|
|
return bufferedHttpResponseMessage;
|
|
}
|
|
|
|
internal static void CopyPropertiesFromMessage(this HttpResponseMessage httpResponseMessage, Message message)
|
|
{
|
|
Fx.Assert(httpResponseMessage != null, "The 'httpRequestMessage' parameter should not be null.");
|
|
Fx.Assert(message != null, "The 'message' parameter should not be null.");
|
|
|
|
HttpRequestMessage request = httpResponseMessage.RequestMessage;
|
|
if (request != null)
|
|
{
|
|
request.CopyPropertiesFromMessage(message);
|
|
}
|
|
}
|
|
|
|
private static void EnsureNotRequestHeader(HttpHeaderInfo headerInfo)
|
|
{
|
|
if (!headerInfo.IsResponseHeader && !headerInfo.IsContentHeader && headerInfo.IsResponseHeader)
|
|
{
|
|
throw FxTrace.Exception.AsError(
|
|
new InvalidOperationException(
|
|
SR.GetString(SR.RequestHeaderWithResponseHeadersCollection, headerInfo.Name)));
|
|
}
|
|
}
|
|
|
|
private static IEnumerable<string> GetHeader(HttpResponseMessage httpResponseMessage, HttpHeaderInfo headerInfo)
|
|
{
|
|
Fx.Assert(httpResponseMessage != null, "The 'httpResponseMessage' parameter should never be null.");
|
|
Fx.Assert(headerInfo != null, "The 'headerInfo' parameter should never be null.");
|
|
Fx.Assert(headerInfo.IsResponseHeader || headerInfo.IsContentHeader, "The 'headerInfo' parameter should be either a response or content header.");
|
|
|
|
IEnumerable<string> values = null;
|
|
|
|
if (headerInfo.IsResponseHeader)
|
|
{
|
|
values = headerInfo.TryGetHeader(httpResponseMessage.Headers);
|
|
}
|
|
|
|
if (values == null &&
|
|
headerInfo.IsContentHeader &&
|
|
httpResponseMessage.Content != null)
|
|
{
|
|
values = headerInfo.TryGetHeader(httpResponseMessage.Content.Headers);
|
|
}
|
|
|
|
return values;
|
|
}
|
|
|
|
private static void RemoveHeader(HttpResponseMessage httpResponseMessage, HttpHeaderInfo headerInfo)
|
|
{
|
|
Fx.Assert(httpResponseMessage != null, "The 'httpResponseMessage' parameter should never be null.");
|
|
Fx.Assert(headerInfo != null, "The 'headerInfo' parameter should never be null.");
|
|
Fx.Assert(headerInfo.IsResponseHeader || headerInfo.IsContentHeader, "The 'headerInfo' parameter should be either a response or content header.");
|
|
|
|
if (headerInfo.IsResponseHeader)
|
|
{
|
|
headerInfo.TryRemoveHeader(httpResponseMessage.Headers);
|
|
}
|
|
|
|
if (headerInfo.IsContentHeader && httpResponseMessage.Content != null)
|
|
{
|
|
headerInfo.TryRemoveHeader(httpResponseMessage.Content.Headers);
|
|
}
|
|
}
|
|
|
|
private static void AddHeader(HttpResponseMessage httpResponseMessage, HttpHeaderInfo headerInfo, string value)
|
|
{
|
|
Fx.Assert(httpResponseMessage != null, "The 'httpResponseMessage' parameter should never be null.");
|
|
Fx.Assert(headerInfo != null, "The 'headerInfo' parameter should never be null.");
|
|
Fx.Assert(headerInfo.IsResponseHeader || headerInfo.IsContentHeader, "The 'headerInfo' parameter should be either a response or content header.");
|
|
|
|
if (headerInfo.IsResponseHeader)
|
|
{
|
|
if (headerInfo.TryAddHeader(httpResponseMessage.Headers, value))
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
|
|
if (headerInfo.IsContentHeader)
|
|
{
|
|
CreateContentIfNull(httpResponseMessage);
|
|
headerInfo.TryAddHeader(httpResponseMessage.Content.Headers, value);
|
|
}
|
|
}
|
|
|
|
private static bool CreateContentIfNull(HttpResponseMessage httpResponseMessage)
|
|
{
|
|
Fx.Assert(httpResponseMessage != null, "The 'httpResponseMessage' parameter should never be null.");
|
|
|
|
if (httpResponseMessage.Content == null)
|
|
{
|
|
httpResponseMessage.Content = new ByteArrayContent(EmptyArray<byte>.Instance);
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
}
|
|
}
|