Skip to content
This repository has been archived by the owner on Mar 19, 2019. It is now read-only.

Commit

Permalink
React to string[] -> StringValues changes.
Browse files Browse the repository at this point in the history
  • Loading branch information
Tratcher committed Aug 21, 2015
1 parent b4ea8a5 commit d858bf7
Show file tree
Hide file tree
Showing 15 changed files with 331 additions and 364 deletions.
9 changes: 5 additions & 4 deletions src/Microsoft.AspNet.Server.WebListener/FeatureContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
using System.Threading.Tasks;
using Microsoft.AspNet.Http.Features;
using Microsoft.AspNet.Http.Features.Authentication;
using Microsoft.AspNet.Primitives;
using Microsoft.Net.Http.Headers;
using Microsoft.Net.Http.Server;
using Microsoft.Net.WebSockets;
Expand Down Expand Up @@ -53,7 +54,7 @@ internal class FeatureContext :
private bool _enableResponseCaching;

private Stream _requestBody;
private IDictionary<string, string[]> _requestHeaders;
private IDictionary<string, StringValues> _requestHeaders;
private string _scheme;
private string _httpMethod;
private string _httpProtocolVersion;
Expand All @@ -71,7 +72,7 @@ internal class FeatureContext :
private IAuthenticationHandler _authHandler;
private CancellationToken? _disconnectToken;
private Stream _responseStream;
private IDictionary<string, string[]> _responseHeaders;
private IDictionary<string, StringValues> _responseHeaders;

internal FeatureContext(RequestContext requestContext, bool enableResponseCaching)
{
Expand Down Expand Up @@ -115,7 +116,7 @@ Stream IHttpRequestFeature.Body
set { _requestBody = value; }
}

IDictionary<string, string[]> IHttpRequestFeature.Headers
IDictionary<string, StringValues> IHttpRequestFeature.Headers
{
get
{
Expand Down Expand Up @@ -348,7 +349,7 @@ Stream IHttpResponseFeature.Body
set { _responseStream = value; }
}

IDictionary<string, string[]> IHttpResponseFeature.Headers
IDictionary<string, StringValues> IHttpResponseFeature.Headers
{
get
{
Expand Down
4 changes: 3 additions & 1 deletion src/Microsoft.Net.Http.Server/AuthenticationManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
using System.Runtime.InteropServices;
using System.Security.Claims;
using System.Security.Principal;
using Microsoft.AspNet.Primitives;

namespace Microsoft.Net.Http.Server
{
Expand Down Expand Up @@ -147,7 +148,8 @@ internal void SetAuthenticationChallenge(RequestContext context)

if (challenges.Count > 0)
{
context.Response.Headers.AppendValues(HttpKnownHeaderNames.WWWAuthenticate, challenges.ToArray());
context.Response.Headers[HttpKnownHeaderNames.WWWAuthenticate]
= StringValues.Concat(context.Response.Headers[HttpKnownHeaderNames.WWWAuthenticate], challenges.ToArray());
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Runtime.InteropServices;
using Microsoft.AspNet.Primitives;

namespace Microsoft.Net.Http.Server
{
Expand Down Expand Up @@ -1048,7 +1049,7 @@ internal static bool Supported

// Server API

internal static void GetUnknownHeaders(IDictionary<string, string[]> unknownHeaders, byte[] memoryBlob, IntPtr originalAddress)
internal static void GetUnknownHeaders(IDictionary<string, StringValues> unknownHeaders, byte[] memoryBlob, IntPtr originalAddress)
{
// Return value.
fixed (byte* pMemoryBlob = memoryBlob)
Expand Down Expand Up @@ -1079,7 +1080,7 @@ internal static void GetUnknownHeaders(IDictionary<string, string[]> unknownHead
}
// Note that Http.Sys currently collapses all headers of the same name to a single coma seperated string,
// so we can just call Set.
unknownHeaders[headerName] = new[] { headerValue };
unknownHeaders[headerName] = headerValue;
}
pUnknownHeader++;
}
Expand Down
95 changes: 26 additions & 69 deletions src/Microsoft.Net.Http.Server/RequestProcessing/HeaderCollection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,44 +4,49 @@
using System;
using System.Collections;
using System.Collections.Generic;
using Microsoft.AspNet.Primitives;

namespace Microsoft.Net.Http.Server
{
public class HeaderCollection : IDictionary<string, string[]>
public class HeaderCollection : IDictionary<string, StringValues>
{
public HeaderCollection()
: this(new Dictionary<string, string[]>(4, StringComparer.OrdinalIgnoreCase))
: this(new Dictionary<string, StringValues>(4, StringComparer.OrdinalIgnoreCase))
{
}

public HeaderCollection(IDictionary<string, string[]> store)
public HeaderCollection(IDictionary<string, StringValues> store)
{
Store = store;
}

private IDictionary<string, string[]> Store { get; set; }
private IDictionary<string, StringValues> Store { get; set; }

// Readonly after the response has been started.
public bool IsReadOnly { get; internal set; }

public string this[string key]
public StringValues this[string key]
{
get { return Get(key); }
get
{
StringValues values;
return TryGetValue(key, out values) ? values : StringValues.Empty;
}
set
{
ThrowIfReadOnly();
if (string.IsNullOrEmpty(value))
if (StringValues.IsNullOrEmpty(value))
{
Remove(key);
}
else
{
Set(key, value);
Store[key] = value;
}
}
}

string[] IDictionary<string, string[]>.this[string key]
StringValues IDictionary<string, StringValues>.this[string key]
{
get { return Store[key]; }
set
Expand All @@ -61,18 +66,18 @@ public ICollection<string> Keys
get { return Store.Keys; }
}

public ICollection<string[]> Values
public ICollection<StringValues> Values
{
get { return Store.Values; }
}

public void Add(KeyValuePair<string, string[]> item)
public void Add(KeyValuePair<string, StringValues> item)
{
ThrowIfReadOnly();
Store.Add(item);
}

public void Add(string key, string[] value)
public void Add(string key, StringValues value)
{
ThrowIfReadOnly();
Store.Add(key, value);
Expand All @@ -81,35 +86,9 @@ public void Add(string key, string[] value)
public void Append(string key, string value)
{
ThrowIfReadOnly();
string[] values;
if (Store.TryGetValue(key, out values))
{
var newValues = new string[values.Length + 1];
Array.Copy(values, newValues, values.Length);
newValues[values.Length] = value;
Store[key] = newValues;
}
else
{
Set(key, value);
}
}

public void AppendValues(string key, params string[] values)
{
ThrowIfReadOnly();
string[] oldValues;
if (Store.TryGetValue(key, out oldValues))
{
var newValues = new string[oldValues.Length + values.Length];
Array.Copy(oldValues, newValues, oldValues.Length);
Array.Copy(values, 0, newValues, oldValues.Length, values.Length);
Store[key] = newValues;
}
else
{
SetValues(key, values);
}
StringValues values;
Store.TryGetValue(key, out values);
Store[key] = StringValues.Concat(values, value);
}

public void Clear()
Expand All @@ -118,7 +97,7 @@ public void Clear()
Store.Clear();
}

public bool Contains(KeyValuePair<string, string[]> item)
public bool Contains(KeyValuePair<string, StringValues> item)
{
return Store.Contains(item);
}
Expand All @@ -128,37 +107,27 @@ public bool ContainsKey(string key)
return Store.ContainsKey(key);
}

public void CopyTo(KeyValuePair<string, string[]>[] array, int arrayIndex)
public void CopyTo(KeyValuePair<string, StringValues>[] array, int arrayIndex)
{
Store.CopyTo(array, arrayIndex);
}

public string Get(string key)
{
string[] values;
if (Store.TryGetValue(key, out values))
{
return string.Join(", ", values);
}
return null;
}

public IEnumerator<KeyValuePair<string, string[]>> GetEnumerator()
public IEnumerator<KeyValuePair<string, StringValues>> GetEnumerator()
{
return Store.GetEnumerator();
}

public IEnumerable<string> GetValues(string key)
{
string[] values;
StringValues values;
if (Store.TryGetValue(key, out values))
{
return HeaderParser.SplitValues(values);
}
return HeaderParser.Empty;
}

public bool Remove(KeyValuePair<string, string[]> item)
public bool Remove(KeyValuePair<string, StringValues> item)
{
ThrowIfReadOnly();
return Store.Remove(item);
Expand All @@ -170,19 +139,7 @@ public bool Remove(string key)
return Store.Remove(key);
}

public void Set(string key, string value)
{
ThrowIfReadOnly();
Store[key] = new[] { value };
}

public void SetValues(string key, params string[] values)
{
ThrowIfReadOnly();
Store[key] = values;
}

public bool TryGetValue(string key, out string[] value)
public bool TryGetValue(string key, out StringValues value)
{
return Store.TryGetValue(key, out value);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

using System;
using System.Collections.Generic;
using Microsoft.AspNet.Primitives;

namespace Microsoft.Net.Http.Server
{
Expand All @@ -11,7 +12,7 @@ internal static class HeaderParser
internal static IEnumerable<string> Empty = new string[0];

// Split on commas, except in quotes
internal static IEnumerable<string> SplitValues(string[] values)
internal static IEnumerable<string> SplitValues(StringValues values)
{
foreach (var value in values)
{
Expand Down
10 changes: 5 additions & 5 deletions src/Microsoft.Net.Http.Server/RequestProcessing/Request.cs
Original file line number Diff line number Diff line change
Expand Up @@ -231,16 +231,16 @@ public long? ContentLength
{
if (_contentBoundaryType == BoundaryType.None)
{
string transferEncoding = Headers.Get(HttpKnownHeaderNames.TransferEncoding) ?? string.Empty;
if (string.Equals("chunked", transferEncoding.Trim(), StringComparison.OrdinalIgnoreCase))
string transferEncoding = Headers[HttpKnownHeaderNames.TransferEncoding];
if (string.Equals("chunked", transferEncoding?.Trim(), StringComparison.OrdinalIgnoreCase))
{
_contentBoundaryType = BoundaryType.Chunked;
}
else
{
string length = Headers.Get(HttpKnownHeaderNames.ContentLength) ?? string.Empty;
string length = Headers[HttpKnownHeaderNames.ContentLength];
long value;
if (long.TryParse(length.Trim(), NumberStyles.None,
if (length != null && long.TryParse(length.Trim(), NumberStyles.None,
CultureInfo.InvariantCulture.NumberFormat, out value))
{
_contentBoundaryType = BoundaryType.ContentLength;
Expand Down Expand Up @@ -422,7 +422,7 @@ public string ContentType
{
get
{
return Headers.Get(HttpKnownHeaderNames.ContentType);
return Headers[HttpKnownHeaderNames.ContentType];
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -194,8 +194,8 @@ public bool IsWebSocketRequest
}

// Connection: Upgrade (some odd clients send Upgrade,KeepAlive)
string connection = Request.Headers[HttpKnownHeaderNames.Connection] ?? string.Empty;
if (connection.IndexOf(HttpKnownHeaderNames.Upgrade, StringComparison.OrdinalIgnoreCase) < 0)
string connection = Request.Headers[HttpKnownHeaderNames.Connection];
if (connection == null || connection.IndexOf(HttpKnownHeaderNames.Upgrade, StringComparison.OrdinalIgnoreCase) < 0)
{
return false;
}
Expand Down Expand Up @@ -244,8 +244,8 @@ private void ValidateWebSocketRequest()
}

// Connection: Upgrade (some odd clients send Upgrade,KeepAlive)
string connection = Request.Headers[HttpKnownHeaderNames.Connection] ?? string.Empty;
if (connection.IndexOf(HttpKnownHeaderNames.Upgrade, StringComparison.OrdinalIgnoreCase) < 0)
string connection = Request.Headers[HttpKnownHeaderNames.Connection];
if (connection == null || connection.IndexOf(HttpKnownHeaderNames.Upgrade, StringComparison.OrdinalIgnoreCase) < 0)
{
throw new InvalidOperationException("The Connection header is invalid: " + connection);
}
Expand Down Expand Up @@ -345,9 +345,9 @@ private async Task<WebSocket> AcceptWebSocketAsyncCore(
string secWebSocketKey = Request.Headers[HttpKnownHeaderNames.SecWebSocketKey];
string secWebSocketAccept = WebSocketHelpers.GetSecWebSocketAcceptString(secWebSocketKey);

Response.Headers.AppendValues(HttpKnownHeaderNames.Connection, HttpKnownHeaderNames.Upgrade);
Response.Headers.AppendValues(HttpKnownHeaderNames.Upgrade, WebSocketHelpers.WebSocketUpgradeToken);
Response.Headers.AppendValues(HttpKnownHeaderNames.SecWebSocketAccept, secWebSocketAccept);
Response.Headers.Append(HttpKnownHeaderNames.Connection, HttpKnownHeaderNames.Upgrade);
Response.Headers.Append(HttpKnownHeaderNames.Upgrade, WebSocketHelpers.WebSocketUpgradeToken);
Response.Headers.Append(HttpKnownHeaderNames.SecWebSocketAccept, secWebSocketAccept);

Stream opaqueStream = await UpgradeAsync();

Expand Down
Loading

0 comments on commit d858bf7

Please sign in to comment.