Add doc strings for public APIs in Http.Abstractions and Routing.Abstractions (#26468)

* Add doc strings to Http.Abstractions and Routing.Abstractions

* Address feedback from peer review

* Update src/Http/Http.Abstractions/src/ConnectionInfo.cs

Co-authored-by: James Newton-King <james@newtonking.com>

Co-authored-by: James Newton-King <james@newtonking.com>
This commit is contained in:
Safia Abdalla 2020-09-30 13:50:31 -07:00 committed by GitHub
parent a218c3bea6
commit e2b1b20633
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 456 additions and 24 deletions

View File

@ -8,6 +8,9 @@ using System.Threading.Tasks;
namespace Microsoft.AspNetCore.Http namespace Microsoft.AspNetCore.Http
{ {
/// <summary>
/// Represents the underlying connection for a request.
/// </summary>
public abstract class ConnectionInfo public abstract class ConnectionInfo
{ {
/// <summary> /// <summary>
@ -15,16 +18,35 @@ namespace Microsoft.AspNetCore.Http
/// </summary> /// </summary>
public abstract string Id { get; set; } public abstract string Id { get; set; }
/// <summary>
/// Gets or sets the IP address of the remote target. Can be null.
/// </summary>
public abstract IPAddress? RemoteIpAddress { get; set; } public abstract IPAddress? RemoteIpAddress { get; set; }
/// <summary>
/// Gets or sets the port of the remote target.
/// </summary>
public abstract int RemotePort { get; set; } public abstract int RemotePort { get; set; }
/// <summary>
/// Gets or sets the IP address of the local host.
/// </summary>
public abstract IPAddress? LocalIpAddress { get; set; } public abstract IPAddress? LocalIpAddress { get; set; }
/// <summary>
/// Gets or sets the port of the local host.
/// </summary>
public abstract int LocalPort { get; set; } public abstract int LocalPort { get; set; }
/// <summary>
/// Gets or sets the client certificate.
/// </summary>
public abstract X509Certificate2? ClientCertificate { get; set; } public abstract X509Certificate2? ClientCertificate { get; set; }
/// <summary>
/// Retrieves the client certificate.
/// </summary>
/// <returns>Asynchronously returns an <see cref="X509Certificate2" />. Can be null.</returns>
public abstract Task<X509Certificate2?> GetClientCertificateAsync(CancellationToken cancellationToken = new CancellationToken()); public abstract Task<X509Certificate2?> GetClientCertificateAsync(CancellationToken cancellationToken = new CancellationToken());
} }
} }

View File

@ -5,6 +5,9 @@ using Microsoft.Extensions.Primitives;
namespace Microsoft.AspNetCore.Http namespace Microsoft.AspNetCore.Http
{ {
/// <summary>
/// Contains extension methods for modifying an <see cref="IHeaderDictionary"/> instance.
/// </summary>
public static class HeaderDictionaryExtensions public static class HeaderDictionaryExtensions
{ {
/// <summary> /// <summary>

View File

@ -8,6 +8,10 @@ using Microsoft.Net.Http.Headers;
namespace Microsoft.AspNetCore.Http namespace Microsoft.AspNetCore.Http
{ {
/// <summary>
/// Contains extension methods for modifying the `Trailer` response header
/// and trailing headers in an <see cref="HttpResponse" />.
/// </summary>
public static class ResponseTrailerExtensions public static class ResponseTrailerExtensions
{ {
/// <summary> /// <summary>

View File

@ -105,6 +105,11 @@ namespace Microsoft.AspNetCore.Http
return new FragmentString(fragmentValue); return new FragmentString(fragmentValue);
} }
/// <summary>
/// Evaluates if the current fragment is equal to another fragment <paramref name="other"/>.
/// </summary>
/// <param name="other">A <see cref="FragmentString" /> to compare.</param>
/// <returns><see langword="true" /> if the fragments are equal.</returns>
public bool Equals(FragmentString other) public bool Equals(FragmentString other)
{ {
if (!HasValue && !other.HasValue) if (!HasValue && !other.HasValue)
@ -114,6 +119,11 @@ namespace Microsoft.AspNetCore.Http
return string.Equals(_value, other._value, StringComparison.Ordinal); return string.Equals(_value, other._value, StringComparison.Ordinal);
} }
/// <summary>
/// Evaluates if the current fragment is equal to an object <paramref name="obj"/>.
/// </summary>
/// <param name="obj">An object to compare.</param>
/// <returns><see langword="true" /> if the fragments are equal.</returns>
public override bool Equals(object? obj) public override bool Equals(object? obj)
{ {
if (ReferenceEquals(null, obj)) if (ReferenceEquals(null, obj))
@ -123,16 +133,32 @@ namespace Microsoft.AspNetCore.Http
return obj is FragmentString && Equals((FragmentString)obj); return obj is FragmentString && Equals((FragmentString)obj);
} }
/// <summary>
/// Gets a hash code for the value.
/// </summary>
/// <returns>The hash code as an <see cref="int"/>.</returns>
public override int GetHashCode() public override int GetHashCode()
{ {
return (HasValue ? _value.GetHashCode() : 0); return (HasValue ? _value.GetHashCode() : 0);
} }
/// <summary>
/// Evaluates if one fragment is equal to another.
/// </summary>
/// <param name="left">A <see cref="FragmentString"/> instance.</param>
/// <param name="right">A <see cref="FragmentString"/> instance.</param>
/// <returns><see langword="true" /> if the fragments are equal.</returns>
public static bool operator ==(FragmentString left, FragmentString right) public static bool operator ==(FragmentString left, FragmentString right)
{ {
return left.Equals(right); return left.Equals(right);
} }
/// <summary>
/// Evalutes if one framgent is not equal to another.
/// </summary>
/// <param name="left">A <see cref="FragmentString"/> instance.</param>
/// <param name="right">A <see cref="FragmentString"/> instance.</param>
/// <returns><see langword="true" /> if the fragments are not equal.</returns>
public static bool operator !=(FragmentString left, FragmentString right) public static bool operator !=(FragmentString left, FragmentString right)
{ {
return !left.Equals(right); return !left.Equals(right);

View File

@ -65,6 +65,9 @@ namespace Microsoft.AspNetCore.Http
get { return _value; } get { return _value; }
} }
/// <summary>
/// Returns true if the host is set.
/// </summary>
public bool HasValue public bool HasValue
{ {
get { return !string.IsNullOrEmpty(_value); } get { return !string.IsNullOrEmpty(_value); }

View File

@ -6,7 +6,7 @@ using System;
namespace Microsoft.AspNetCore.Http namespace Microsoft.AspNetCore.Http
{ {
/// <summary> /// <summary>
/// Contains methods to verify the request method of an HTTP request. /// Contains methods to verify the request method of an HTTP request.
/// </summary> /// </summary>
public static class HttpMethods public static class HttpMethods
{ {
@ -18,18 +18,45 @@ namespace Microsoft.AspNetCore.Http
// and allow us to optimize comparisons when these constants are used. // and allow us to optimize comparisons when these constants are used.
// Please do NOT change these to 'const' // Please do NOT change these to 'const'
/// <summary>
/// HTTP "CONNECT" method.
/// </summary>
public static readonly string Connect = "CONNECT"; public static readonly string Connect = "CONNECT";
/// <summary>
/// HTTP "DELETE" method.
/// </summary>
public static readonly string Delete = "DELETE"; public static readonly string Delete = "DELETE";
/// <summary>
/// HTTP "GET" method.
/// </summary>
public static readonly string Get = "GET"; public static readonly string Get = "GET";
/// <summary>
/// HTTP "HEAD" method.
/// </summary>
public static readonly string Head = "HEAD"; public static readonly string Head = "HEAD";
/// <summary>
/// HTTP "OPTIONS" method.
/// </summary>
public static readonly string Options = "OPTIONS"; public static readonly string Options = "OPTIONS";
/// <summary>
/// HTTP "PATCH" method.
/// </summary>
public static readonly string Patch = "PATCH"; public static readonly string Patch = "PATCH";
/// <summary>
/// HTTP "POST" method.
/// </summary>
public static readonly string Post = "POST"; public static readonly string Post = "POST";
/// <summary>
/// HTTP "PUT" method.
/// </summary>
public static readonly string Put = "PUT"; public static readonly string Put = "PUT";
/// <summary>
/// HTTP "TRACE" method.
/// </summary>
public static readonly string Trace = "TRACE"; public static readonly string Trace = "TRACE";
/// <summary> /// <summary>
/// Returns a value that indicates if the HTTP request method is CONNECT. /// Returns a value that indicates if the HTTP request method is CONNECT.
/// </summary> /// </summary>
/// <param name="method">The HTTP request method.</param> /// <param name="method">The HTTP request method.</param>
/// <returns> /// <returns>
@ -41,7 +68,7 @@ namespace Microsoft.AspNetCore.Http
} }
/// <summary> /// <summary>
/// Returns a value that indicates if the HTTP request method is DELETE. /// Returns a value that indicates if the HTTP request method is DELETE.
/// </summary> /// </summary>
/// <param name="method">The HTTP request method.</param> /// <param name="method">The HTTP request method.</param>
/// <returns> /// <returns>
@ -53,7 +80,7 @@ namespace Microsoft.AspNetCore.Http
} }
/// <summary> /// <summary>
/// Returns a value that indicates if the HTTP request method is GET. /// Returns a value that indicates if the HTTP request method is GET.
/// </summary> /// </summary>
/// <param name="method">The HTTP request method.</param> /// <param name="method">The HTTP request method.</param>
/// <returns> /// <returns>
@ -65,7 +92,7 @@ namespace Microsoft.AspNetCore.Http
} }
/// <summary> /// <summary>
/// Returns a value that indicates if the HTTP request method is HEAD. /// Returns a value that indicates if the HTTP request method is HEAD.
/// </summary> /// </summary>
/// <param name="method">The HTTP request method.</param> /// <param name="method">The HTTP request method.</param>
/// <returns> /// <returns>
@ -77,7 +104,7 @@ namespace Microsoft.AspNetCore.Http
} }
/// <summary> /// <summary>
/// Returns a value that indicates if the HTTP request method is OPTIONS. /// Returns a value that indicates if the HTTP request method is OPTIONS.
/// </summary> /// </summary>
/// <param name="method">The HTTP request method.</param> /// <param name="method">The HTTP request method.</param>
/// <returns> /// <returns>
@ -89,7 +116,7 @@ namespace Microsoft.AspNetCore.Http
} }
/// <summary> /// <summary>
/// Returns a value that indicates if the HTTP request method is PATCH. /// Returns a value that indicates if the HTTP request method is PATCH.
/// </summary> /// </summary>
/// <param name="method">The HTTP request method.</param> /// <param name="method">The HTTP request method.</param>
/// <returns> /// <returns>
@ -101,7 +128,7 @@ namespace Microsoft.AspNetCore.Http
} }
/// <summary> /// <summary>
/// Returns a value that indicates if the HTTP request method is POST. /// Returns a value that indicates if the HTTP request method is POST.
/// </summary> /// </summary>
/// <param name="method">The HTTP request method.</param> /// <param name="method">The HTTP request method.</param>
/// <returns> /// <returns>
@ -113,7 +140,7 @@ namespace Microsoft.AspNetCore.Http
} }
/// <summary> /// <summary>
/// Returns a value that indicates if the HTTP request method is PUT. /// Returns a value that indicates if the HTTP request method is PUT.
/// </summary> /// </summary>
/// <param name="method">The HTTP request method.</param> /// <param name="method">The HTTP request method.</param>
/// <returns> /// <returns>
@ -125,7 +152,7 @@ namespace Microsoft.AspNetCore.Http
} }
/// <summary> /// <summary>
/// Returns a value that indicates if the HTTP request method is TRACE. /// Returns a value that indicates if the HTTP request method is TRACE.
/// </summary> /// </summary>
/// <param name="method">The HTTP request method.</param> /// <param name="method">The HTTP request method.</param>
/// <returns> /// <returns>
@ -156,7 +183,7 @@ namespace Microsoft.AspNetCore.Http
}; };
/// <summary> /// <summary>
/// Returns a value that indicates if the HTTP methods are the same. /// Returns a value that indicates if the HTTP methods are the same.
/// </summary> /// </summary>
/// <param name="methodA">The first HTTP request method to compare.</param> /// <param name="methodA">The first HTTP request method to compare.</param>
/// <param name="methodB">The second HTTP request method to compare.</param> /// <param name="methodB">The second HTTP request method to compare.</param>

View File

@ -6,7 +6,7 @@ using System;
namespace Microsoft.AspNetCore.Http namespace Microsoft.AspNetCore.Http
{ {
/// <summary> /// <summary>
/// Contains methods to verify the request protocol version of an HTTP request. /// Contains methods to verify the request protocol version of an HTTP request.
/// </summary> /// </summary>
public static class HttpProtocol public static class HttpProtocol
{ {
@ -18,13 +18,26 @@ namespace Microsoft.AspNetCore.Http
// and allow us to optimize comparisons when these constants are used. // and allow us to optimize comparisons when these constants are used.
// Please do NOT change these to 'const' // Please do NOT change these to 'const'
/// <summary>
/// HTTP protocol version 1.0.
/// </summary>
public static readonly string Http10 = "HTTP/1.0"; public static readonly string Http10 = "HTTP/1.0";
/// <summary>
/// HTTP protocol version 1.1.
/// </summary>
public static readonly string Http11 = "HTTP/1.1"; public static readonly string Http11 = "HTTP/1.1";
/// <summary>
/// HTTP protocol version 2.
/// </summary>
public static readonly string Http2 = "HTTP/2"; public static readonly string Http2 = "HTTP/2";
/// <summary>
/// HTTP protcol version 3.
/// </summary>
public static readonly string Http3 = "HTTP/3"; public static readonly string Http3 = "HTTP/3";
/// <summary> /// <summary>
/// Returns a value that indicates if the HTTP request protocol is HTTP/1.0. /// Returns a value that indicates if the HTTP request protocol is HTTP/1.0.
/// </summary> /// </summary>
/// <param name="protocol">The HTTP request protocol.</param> /// <param name="protocol">The HTTP request protocol.</param>
/// <returns> /// <returns>
@ -36,7 +49,7 @@ namespace Microsoft.AspNetCore.Http
} }
/// <summary> /// <summary>
/// Returns a value that indicates if the HTTP request protocol is HTTP/1.1. /// Returns a value that indicates if the HTTP request protocol is HTTP/1.1.
/// </summary> /// </summary>
/// <param name="protocol">The HTTP request protocol.</param> /// <param name="protocol">The HTTP request protocol.</param>
/// <returns> /// <returns>
@ -48,7 +61,7 @@ namespace Microsoft.AspNetCore.Http
} }
/// <summary> /// <summary>
/// Returns a value that indicates if the HTTP request protocol is HTTP/2. /// Returns a value that indicates if the HTTP request protocol is HTTP/2.
/// </summary> /// </summary>
/// <param name="protocol">The HTTP request protocol.</param> /// <param name="protocol">The HTTP request protocol.</param>
/// <returns> /// <returns>
@ -60,7 +73,7 @@ namespace Microsoft.AspNetCore.Http
} }
/// <summary> /// <summary>
/// Returns a value that indicates if the HTTP request protocol is HTTP/3. /// Returns a value that indicates if the HTTP request protocol is HTTP/3.
/// </summary> /// </summary>
/// <param name="protocol">The HTTP request protocol.</param> /// <param name="protocol">The HTTP request protocol.</param>
/// <returns> /// <returns>

View File

@ -12,7 +12,7 @@ Microsoft.AspNetCore.Http.HttpResponse</Description>
<IsAspNetCoreApp>true</IsAspNetCoreApp> <IsAspNetCoreApp>true</IsAspNetCoreApp>
<GenerateDocumentationFile>true</GenerateDocumentationFile> <GenerateDocumentationFile>true</GenerateDocumentationFile>
<PackageTags>aspnetcore</PackageTags> <PackageTags>aspnetcore</PackageTags>
<NoWarn>$(NoWarn);CS1591</NoWarn> <NoWarn>$(NoWarn.Replace('1591', ''))</NoWarn>
<IsPackable>false</IsPackable> <IsPackable>false</IsPackable>
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
</PropertyGroup> </PropertyGroup>

View File

@ -22,7 +22,7 @@ namespace Microsoft.AspNetCore.Http
/// <summary> /// <summary>
/// Initialize the query string with a given value. This value must be in escaped and delimited format with /// Initialize the query string with a given value. This value must be in escaped and delimited format with
/// a leading '?' character. /// a leading '?' character.
/// </summary> /// </summary>
/// <param name="value">The query string to be assigned to the Value property.</param> /// <param name="value">The query string to be assigned to the Value property.</param>
public QueryString(string? value) public QueryString(string? value)
@ -45,7 +45,7 @@ namespace Microsoft.AspNetCore.Http
public bool HasValue => !string.IsNullOrEmpty(Value); public bool HasValue => !string.IsNullOrEmpty(Value);
/// <summary> /// <summary>
/// Provides the query string escaped in a way which is correct for combining into the URI representation. /// Provides the query string escaped in a way which is correct for combining into the URI representation.
/// A leading '?' character will be included unless the Value is null or empty. Characters which are potentially /// A leading '?' character will be included unless the Value is null or empty. Characters which are potentially
/// dangerous are escaped. /// dangerous are escaped.
/// </summary> /// </summary>
@ -56,7 +56,7 @@ namespace Microsoft.AspNetCore.Http
} }
/// <summary> /// <summary>
/// Provides the query string escaped in a way which is correct for combining into the URI representation. /// Provides the query string escaped in a way which is correct for combining into the URI representation.
/// A leading '?' character will be included unless the Value is null or empty. Characters which are potentially /// A leading '?' character will be included unless the Value is null or empty. Characters which are potentially
/// dangerous are escaped. /// dangerous are escaped.
/// </summary> /// </summary>
@ -170,6 +170,11 @@ namespace Microsoft.AspNetCore.Http
return new QueryString(builder.ToString()); return new QueryString(builder.ToString());
} }
/// <summary>
/// Concatenates <paramref name="other"/> to the current query string.
/// </summary>
/// <param name="other">The <see cref="QueryString"/> to concatenate.</param>
/// <returns>The concatenated <see cref="QueryString"/>.</returns>
public QueryString Add(QueryString other) public QueryString Add(QueryString other)
{ {
if (!HasValue || Value!.Equals("?", StringComparison.Ordinal)) if (!HasValue || Value!.Equals("?", StringComparison.Ordinal))
@ -185,6 +190,13 @@ namespace Microsoft.AspNetCore.Http
return new QueryString(Value + "&" + other.Value.Substring(1)); return new QueryString(Value + "&" + other.Value.Substring(1));
} }
/// <summary>
/// Concatenates a query string with <paramref name="name"/> and <paramref name="value"/>
/// to the current query string.
/// </summary>
/// <param name="name">The name of the query string to concatenate.</param>
/// <param name="value">The value of the query string to concatenate.</param>
/// <returns>The concatenated <see cref="QueryString"/>.</returns>
public QueryString Add(string name, string value) public QueryString Add(string name, string value)
{ {
if (name == null) if (name == null)
@ -202,6 +214,11 @@ namespace Microsoft.AspNetCore.Http
return new QueryString(builder.ToString()); return new QueryString(builder.ToString());
} }
/// <summary>
/// Evalutes if the current query string is equal to <paramref name="other"/>.
/// </summary>
/// <param name="other">The <see cref="QueryString"/> to compare.</param>
/// <returns><see langword="true"/> if the ssquery strings are equal.</returns>
public bool Equals(QueryString other) public bool Equals(QueryString other)
{ {
if (!HasValue && !other.HasValue) if (!HasValue && !other.HasValue)
@ -211,6 +228,11 @@ namespace Microsoft.AspNetCore.Http
return string.Equals(Value, other.Value, StringComparison.Ordinal); return string.Equals(Value, other.Value, StringComparison.Ordinal);
} }
/// <summary>
/// Evaluates if the current query string is equal to an object <paramref name="obj"/>.
/// </summary>
/// <param name="obj">An object to compare.</param>
/// <returns><see langword="true" /> if the query strings are equal.</returns>
public override bool Equals(object? obj) public override bool Equals(object? obj)
{ {
if (ReferenceEquals(null, obj)) if (ReferenceEquals(null, obj))
@ -220,21 +242,43 @@ namespace Microsoft.AspNetCore.Http
return obj is QueryString && Equals((QueryString)obj); return obj is QueryString && Equals((QueryString)obj);
} }
/// <summary>
/// Gets a hash code for the value.
/// </summary>
/// <returns>The hash code as an <see cref="int"/>.</returns>
public override int GetHashCode() public override int GetHashCode()
{ {
return (HasValue ? Value!.GetHashCode() : 0); return (HasValue ? Value!.GetHashCode() : 0);
} }
/// <summary>
/// Evaluates if one query string is equal to another.
/// </summary>
/// <param name="left">A <see cref="QueryString"/> instance.</param>
/// <param name="right">A <see cref="QueryString"/> instance.</param>
/// <returns><see langword="true" /> if the query strings are equal.</returns>
public static bool operator ==(QueryString left, QueryString right) public static bool operator ==(QueryString left, QueryString right)
{ {
return left.Equals(right); return left.Equals(right);
} }
/// <summary>
/// Evaluates if one query string is not equal to another.
/// </summary>
/// <param name="left">A <see cref="QueryString"/> instance.</param>
/// <param name="right">A <see cref="QueryString"/> instance.</param>
/// <returns><see langword="true" /> if the query strings are not equal.</returns>
public static bool operator !=(QueryString left, QueryString right) public static bool operator !=(QueryString left, QueryString right)
{ {
return !left.Equals(right); return !left.Equals(right);
} }
/// <summary>
/// Concatenates <paramref name="left"/> and <paramref name="right"/> into a single query string.
/// </summary>
/// <param name="left">A <see cref="QueryString"/> instance.</param>
/// <param name="right">A <see cref="QueryString"/> instance.</param>
/// <returns>The concatenated <see cref="QueryString"/>.</returns>
public static QueryString operator +(QueryString left, QueryString right) public static QueryString operator +(QueryString left, QueryString right)
{ {
return left.Add(right); return left.Add(right);

View File

@ -44,6 +44,9 @@ namespace Microsoft.AspNetCore.Http
/// </summary> /// </summary>
public RequestDelegate RequestDelegate { get; } public RequestDelegate RequestDelegate { get; }
/// <summary>
/// Returns a string representation of the endpoint.
/// </summary>
public override string? ToString() => DisplayName ?? base.ToString(); public override string? ToString() => DisplayName ?? base.ToString();
} }
} }

View File

@ -187,7 +187,7 @@ namespace Microsoft.AspNetCore.Routing
// We're calling this here for the side-effect of converting from properties // We're calling this here for the side-effect of converting from properties
// to array. We need to create the array even if we just set an existing value since // to array. We need to create the array even if we just set an existing value since
// property storage is immutable. // property storage is immutable.
EnsureCapacity(_count); EnsureCapacity(_count);
var index = FindIndex(key); var index = FindIndex(key);
@ -661,11 +661,16 @@ namespace Microsoft.AspNetCore.Routing
return false; return false;
} }
/// <inheritdoc />
public struct Enumerator : IEnumerator<KeyValuePair<string, object?>> public struct Enumerator : IEnumerator<KeyValuePair<string, object?>>
{ {
private readonly RouteValueDictionary _dictionary; private readonly RouteValueDictionary _dictionary;
private int _index; private int _index;
/// <summary>
/// Instantiates a new enumerator with the values provided in <paramref name="dictionary"/>.
/// </summary>
/// <param name="dictionary">A <see cref="RouteValueDictionary"/>.</param>
public Enumerator(RouteValueDictionary dictionary) public Enumerator(RouteValueDictionary dictionary)
{ {
if (dictionary == null) if (dictionary == null)
@ -679,15 +684,20 @@ namespace Microsoft.AspNetCore.Routing
_index = 0; _index = 0;
} }
/// <inheritdoc />
public KeyValuePair<string, object?> Current { get; private set; } public KeyValuePair<string, object?> Current { get; private set; }
object IEnumerator.Current => Current; object IEnumerator.Current => Current;
/// <summary>
/// Releases resources used by the <see cref="Enumerator"/>.
/// </summary>
public void Dispose() public void Dispose()
{ {
} }
// Similar to the design of List<T>.Enumerator - Split into fast path and slow path for inlining friendliness // Similar to the design of List<T>.Enumerator - Split into fast path and slow path for inlining friendliness
/// <inheritdoc />
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public bool MoveNext() public bool MoveNext()
{ {
@ -721,6 +731,7 @@ namespace Microsoft.AspNetCore.Routing
return false; return false;
} }
/// <inheritdoc />
public void Reset() public void Reset()
{ {
Current = default; Current = default;

View File

@ -3,77 +3,338 @@
namespace Microsoft.AspNetCore.Http namespace Microsoft.AspNetCore.Http
{ {
// Status Codes listed at http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml /// <summary>
/// A collection of contants for HTTP status codes.
///
/// Status Codes listed at http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml
/// </summary>
public static class StatusCodes public static class StatusCodes
{ {
/// <summary>
/// HTTP status code 100.
/// </summary>
public const int Status100Continue = 100; public const int Status100Continue = 100;
/// <summary>
/// HTTP status code 101.
/// </summary>
public const int Status101SwitchingProtocols = 101; public const int Status101SwitchingProtocols = 101;
/// <summary>
/// HTTP status code 102.
/// </summary>
public const int Status102Processing = 102; public const int Status102Processing = 102;
/// <summary>
/// HTTP status code 200.
/// </summary>
public const int Status200OK = 200; public const int Status200OK = 200;
/// <summary>
/// HTTP status code 201.
/// </summary>
public const int Status201Created = 201; public const int Status201Created = 201;
/// <summary>
/// HTTP status code 202.
/// </summary>
public const int Status202Accepted = 202; public const int Status202Accepted = 202;
/// <summary>
/// HTTP status code 203.
/// </summary>
public const int Status203NonAuthoritative = 203; public const int Status203NonAuthoritative = 203;
/// <summary>
/// HTTP status code 204.
/// </summary>
public const int Status204NoContent = 204; public const int Status204NoContent = 204;
/// <summary>
/// HTTP status code 205.
/// </summary>
public const int Status205ResetContent = 205; public const int Status205ResetContent = 205;
/// <summary>
/// HTTP status code 206.
/// </summary>
public const int Status206PartialContent = 206; public const int Status206PartialContent = 206;
/// <summary>
/// HTTP status code 207.
/// </summary>
public const int Status207MultiStatus = 207; public const int Status207MultiStatus = 207;
/// <summary>
/// HTTP status code 208.
/// </summary>
public const int Status208AlreadyReported = 208; public const int Status208AlreadyReported = 208;
/// <summary>
/// HTTP status code 226.
/// </summary>
public const int Status226IMUsed = 226; public const int Status226IMUsed = 226;
/// <summary>
/// HTTP status code 300.
/// </summary>
public const int Status300MultipleChoices = 300; public const int Status300MultipleChoices = 300;
/// <summary>
/// HTTP status code 301.
/// </summary>
public const int Status301MovedPermanently = 301; public const int Status301MovedPermanently = 301;
/// <summary>
/// HTTP status code 302.
/// </summary>
public const int Status302Found = 302; public const int Status302Found = 302;
/// <summary>
/// HTTP status code 303.
/// </summary>
public const int Status303SeeOther = 303; public const int Status303SeeOther = 303;
/// <summary>
/// HTTP status code 304.
/// </summary>
public const int Status304NotModified = 304; public const int Status304NotModified = 304;
/// <summary>
/// HTTP status code 305.
/// </summary>
public const int Status305UseProxy = 305; public const int Status305UseProxy = 305;
/// <summary>
/// HTTP status code 306.
/// </summary>
public const int Status306SwitchProxy = 306; // RFC 2616, removed public const int Status306SwitchProxy = 306; // RFC 2616, removed
/// <summary>
/// HTTP status code 307.
/// </summary>
public const int Status307TemporaryRedirect = 307; public const int Status307TemporaryRedirect = 307;
/// <summary>
/// HTTP status code 308.
/// </summary>
public const int Status308PermanentRedirect = 308; public const int Status308PermanentRedirect = 308;
/// <summary>
/// HTTP status code 400.
/// </summary>
public const int Status400BadRequest = 400; public const int Status400BadRequest = 400;
/// <summary>
/// HTTP status code 401.
/// </summary>
public const int Status401Unauthorized = 401; public const int Status401Unauthorized = 401;
/// <summary>
/// HTTP status code 402.
/// </summary>
public const int Status402PaymentRequired = 402; public const int Status402PaymentRequired = 402;
/// <summary>
/// HTTP status code 403.
/// </summary>
public const int Status403Forbidden = 403; public const int Status403Forbidden = 403;
/// <summary>
/// HTTP status code 404.
/// </summary>
public const int Status404NotFound = 404; public const int Status404NotFound = 404;
/// <summary>
/// HTTP status code 405.
/// </summary>
public const int Status405MethodNotAllowed = 405; public const int Status405MethodNotAllowed = 405;
/// <summary>
/// HTTP status code 406.
/// </summary>
public const int Status406NotAcceptable = 406; public const int Status406NotAcceptable = 406;
/// <summary>
/// HTTP status code 407.
/// </summary>
public const int Status407ProxyAuthenticationRequired = 407; public const int Status407ProxyAuthenticationRequired = 407;
/// <summary>
/// HTTP status code 408.
/// </summary>
public const int Status408RequestTimeout = 408; public const int Status408RequestTimeout = 408;
/// <summary>
/// HTTP status code 409.
/// </summary>
public const int Status409Conflict = 409; public const int Status409Conflict = 409;
/// <summary>
/// HTTP status code 410.
/// </summary>
public const int Status410Gone = 410; public const int Status410Gone = 410;
/// <summary>
/// HTTP status code 411.
/// </summary>
public const int Status411LengthRequired = 411; public const int Status411LengthRequired = 411;
/// <summary>
/// HTTP status code 412.
/// </summary>
public const int Status412PreconditionFailed = 412; public const int Status412PreconditionFailed = 412;
/// <summary>
/// HTTP status code 413.
/// </summary>
public const int Status413RequestEntityTooLarge = 413; // RFC 2616, renamed public const int Status413RequestEntityTooLarge = 413; // RFC 2616, renamed
/// <summary>
/// HTTP status code 413.
/// </summary>
public const int Status413PayloadTooLarge = 413; // RFC 7231 public const int Status413PayloadTooLarge = 413; // RFC 7231
/// <summary>
/// HTTP status code 414.
/// </summary>
public const int Status414RequestUriTooLong = 414; // RFC 2616, renamed public const int Status414RequestUriTooLong = 414; // RFC 2616, renamed
/// <summary>
/// HTTP status code 414.
/// </summary>
public const int Status414UriTooLong = 414; // RFC 7231 public const int Status414UriTooLong = 414; // RFC 7231
/// <summary>
/// HTTP status code 415.
/// </summary>
public const int Status415UnsupportedMediaType = 415; public const int Status415UnsupportedMediaType = 415;
/// <summary>
/// HTTP status code 416.
/// </summary>
public const int Status416RequestedRangeNotSatisfiable = 416; // RFC 2616, renamed public const int Status416RequestedRangeNotSatisfiable = 416; // RFC 2616, renamed
/// <summary>
/// HTTP status code 416.
/// </summary>
public const int Status416RangeNotSatisfiable = 416; // RFC 7233 public const int Status416RangeNotSatisfiable = 416; // RFC 7233
/// <summary>
/// HTTP status code 417.
/// </summary>
public const int Status417ExpectationFailed = 417; public const int Status417ExpectationFailed = 417;
/// <summary>
/// HTTP status code 418.
/// </summary>
public const int Status418ImATeapot = 418; public const int Status418ImATeapot = 418;
/// <summary>
/// HTTP status code 419.
/// </summary>
public const int Status419AuthenticationTimeout = 419; // Not defined in any RFC public const int Status419AuthenticationTimeout = 419; // Not defined in any RFC
/// <summary>
/// HTTP status code 422.
/// </summary>
public const int Status421MisdirectedRequest = 421; public const int Status421MisdirectedRequest = 421;
/// <summary>
/// HTTP status code 422.
/// </summary>
public const int Status422UnprocessableEntity = 422; public const int Status422UnprocessableEntity = 422;
/// <summary>
/// HTTP status code 423.
/// </summary>
public const int Status423Locked = 423; public const int Status423Locked = 423;
/// <summary>
/// HTTP status code 424.
/// </summary>
public const int Status424FailedDependency = 424; public const int Status424FailedDependency = 424;
/// <summary>
/// HTTP status code 426.
/// </summary>
public const int Status426UpgradeRequired = 426; public const int Status426UpgradeRequired = 426;
/// <summary>
/// HTTP status code 428.
/// </summary>
public const int Status428PreconditionRequired = 428; public const int Status428PreconditionRequired = 428;
/// <summary>
/// HTTP status code 429.
/// </summary>
public const int Status429TooManyRequests = 429; public const int Status429TooManyRequests = 429;
/// <summary>
/// HTTP status code 431.
/// </summary>
public const int Status431RequestHeaderFieldsTooLarge = 431; public const int Status431RequestHeaderFieldsTooLarge = 431;
/// <summary>
/// HTTP status code 451.
/// </summary>
public const int Status451UnavailableForLegalReasons = 451; public const int Status451UnavailableForLegalReasons = 451;
/// <summary>
/// HTTP status code 500.
/// </summary>
public const int Status500InternalServerError = 500; public const int Status500InternalServerError = 500;
/// <summary>
/// HTTP status code 501.
/// </summary>
public const int Status501NotImplemented = 501; public const int Status501NotImplemented = 501;
/// <summary>
/// HTTP status code 502.
/// </summary>
public const int Status502BadGateway = 502; public const int Status502BadGateway = 502;
/// <summary>
/// HTTP status code 503.
/// </summary>
public const int Status503ServiceUnavailable = 503; public const int Status503ServiceUnavailable = 503;
/// <summary>
/// HTTP status code 504.
/// </summary>
public const int Status504GatewayTimeout = 504; public const int Status504GatewayTimeout = 504;
/// <summary>
/// HTTP status code 505.
/// </summary>
public const int Status505HttpVersionNotsupported = 505; public const int Status505HttpVersionNotsupported = 505;
/// <summary>
/// HTTP status code 506.
/// </summary>
public const int Status506VariantAlsoNegotiates = 506; public const int Status506VariantAlsoNegotiates = 506;
/// <summary>
/// HTTP status code 507.
/// </summary>
public const int Status507InsufficientStorage = 507; public const int Status507InsufficientStorage = 507;
/// <summary>
/// HTTP status code 508.
/// </summary>
public const int Status508LoopDetected = 508; public const int Status508LoopDetected = 508;
/// <summary>
/// HTTP status code 510.
/// </summary>
public const int Status510NotExtended = 510; public const int Status510NotExtended = 510;
/// <summary>
/// HTTP status code 511.
/// </summary>
public const int Status511NetworkAuthenticationRequired = 511; public const int Status511NetworkAuthenticationRequired = 511;
} }
} }

View File

@ -5,10 +5,22 @@ using System.Threading.Tasks;
namespace Microsoft.AspNetCore.Routing namespace Microsoft.AspNetCore.Routing
{ {
/// <summary>
///
/// </summary>
public interface IRouter public interface IRouter
{ {
/// <summary>
/// Asynchronously routes based on the current <paramref name="context"/>.
/// </summary>
/// <param name="context">A <see cref="RouteContext"/> instance.</param>
Task RouteAsync(RouteContext context); Task RouteAsync(RouteContext context);
/// <summary>
/// Returns the URL that is assicated with the route details provided in <paramref name="context"/>
/// </summary>
/// <param name="context">A <see cref="VirtualPathContext"/> instance.</param>
/// <returns>A <see cref="VirtualPathData"/> object. Can be null.</returns>
VirtualPathData? GetVirtualPath(VirtualPathContext context); VirtualPathData? GetVirtualPath(VirtualPathContext context);
} }
} }

View File

@ -3,6 +3,9 @@
namespace Microsoft.AspNetCore.Routing namespace Microsoft.AspNetCore.Routing
{ {
/// <summary>
/// Configures options for generated URLs.
/// </summary>
public class LinkOptions public class LinkOptions
{ {
/// <summary> /// <summary>
@ -13,7 +16,7 @@ namespace Microsoft.AspNetCore.Routing
/// <summary> /// <summary>
/// Gets or sets a value indicating whether a generated query strings are lowercase. /// Gets or sets a value indicating whether a generated query strings are lowercase.
/// This property will be unless <see cref="LowercaseUrls" /> is also <c>true</c>. /// This property will be false unless <see cref="LowercaseUrls" /> is also <c>true</c>.
/// </summary> /// </summary>
public bool? LowercaseQueryStrings { get; set; } public bool? LowercaseQueryStrings { get; set; }

View File

@ -7,7 +7,7 @@ Microsoft.AspNetCore.Routing.IRouter
Microsoft.AspNetCore.Routing.RouteData</Description> Microsoft.AspNetCore.Routing.RouteData</Description>
<TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework> <TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
<IsAspNetCoreApp>true</IsAspNetCoreApp> <IsAspNetCoreApp>true</IsAspNetCoreApp>
<NoWarn>$(NoWarn);CS1591</NoWarn> <NoWarn>$(NoWarn.Replace('1591', ''))</NoWarn>
<GenerateDocumentationFile>true</GenerateDocumentationFile> <GenerateDocumentationFile>true</GenerateDocumentationFile>
<PackageTags>aspnetcore;routing</PackageTags> <PackageTags>aspnetcore;routing</PackageTags>
<IsPackable>false</IsPackable> <IsPackable>false</IsPackable>