Skip to content
This repository was archived by the owner on Aug 30, 2025. It is now read-only.

Commit b7a0722

Browse files
authored
Merge pull request #8 from TechNobre/develop
Deploy nuget version 1.2.0
2 parents f2095d1 + b6cf509 commit b7a0722

File tree

5 files changed

+160
-44
lines changed

5 files changed

+160
-44
lines changed

CHANGELOG.md

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,40 @@
33

44

55

6+
## [1.2.0] - 2022-03-02
7+
[Full Changelog](https://github.com/TechNobre/PowerUtils.Net.Primitives/compare/v1.1.1...v1.2.0)
8+
9+
10+
### New Features
11+
12+
- Added constant for Status Code I'm a teapot 418;
13+
- Added constant for Status Code Too Early 425;
14+
- Added constant for Status Code Precondition Required 428;
15+
- Added constant for Status Code Too Many Requests 429;
16+
- Added constant for Status Code Request Header Fields Too Large 431;
17+
- Added constant for Status Code Unavailable For Legal Reasons 451;
18+
- Added constant for Status Code Variant Also Negotiates 506;
19+
- Added constant for Status Code Insufficient Storage 507;
20+
- Added constant for Status Code Loop Detected 508;
21+
- Added constant for Status Code Not Extended 510;
22+
- Added constant for Status Code Network Authentication Required 511;
23+
- Added utils `int.GetStatusCodeLinkOrDefault()`;
24+
25+
26+
### Fixed
27+
28+
- Fixed methods documentation;
29+
30+
31+
32+
633
## [1.1.1] - 2022-02-25
734
[Full Changelog](https://github.com/TechNobre/PowerUtils.Net.Primitives/compare/v1.1.0...v1.1.1)
835

936

10-
### New Features
37+
### Fixed
1138

12-
- Fixed link for status code UNPROCESSABLE_ENTITY 422;
39+
- Fixed link for status code Unprocessable Entity 422;
1340

1441

1542

@@ -20,7 +47,7 @@
2047

2148
### New Features
2249

23-
- Added constant for Status Code UNPROCESSABLE ENTITY 422;
50+
- Added constant for Status Code Unprocessable Entity 422;
2451

2552

2653
### Enhancements

README.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,18 +72,30 @@ dotnet add package PowerUtils.Net.Primitives
7272
- `StatusCodeLink.UNSUPPORTED_MEDIA_TYPE`;
7373
- `StatusCodeLink.REQUESTED_RANGE_NOT_SATISFIABLE`;
7474
- `StatusCodeLink.EXPECTATION_FAILED`;
75+
- `StatusCodeLink.I_AM_A_TEAPOT`;
7576
- `StatusCodeLink.UNPROCESSABLE_ENTITY`;
77+
- `StatusCodeLink.TOO_EARLY`;
7678
- `StatusCodeLink.UPGRADE_REQUIRED`;
79+
- `StatusCodeLink.PRECONDITION_REQUIRED`;
80+
- `StatusCodeLink.TOO_MANY_REQUESTS`;
81+
- `StatusCodeLink.REQUEST_HEADER_FIELDS_TOO_LARGE`;
82+
- `StatusCodeLink.UNAVAILABLE_FOR_LEGAL_REASONS`;
7783
- `StatusCodeLink.INTERNAL_SERVER_ERROR`;
7884
- `StatusCodeLink.NOT_IMPLEMENTED`;
7985
- `StatusCodeLink.BAD_GATEWAY`;
8086
- `StatusCodeLink.SERVICE_UNAVAILABLE`;
8187
- `StatusCodeLink.GATEWAY_TIMEOUT`;
8288
- `StatusCodeLink.HTTP_VERSION_NOT_SUPPORTED`;
89+
- `StatusCodeLink.VARIANT_ALSO_NEGOTIATES`;
90+
- `StatusCodeLink.INSUFFICIENT_STORAGE`;
91+
- `StatusCodeLink.LOOP_DETECTED`;
92+
- `StatusCodeLink.NOT_EXTENDED`;
93+
- `StatusCodeLink.NETWORK_AUTHENTICATION_REQUIRED`;
8394

8495
- **Methods:**
8596
- `StatusCodeLink.GetStatusCodeLink(this int statuCode)`: Get documentation link by status code;
8697
- `StatusCodeLink.GetStatusCodeLink(this int? statuCode)`: Get documentation link by status code;
98+
- `StatusCodeLink.GetStatusCodeLinkOrDefault(this int statuCode)`: Get documentation link by status code;
8799

88100

89101

src/1.PowerUtils.Net.Primitives.csproj

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
<PackageId>PowerUtils.Net.Primitives</PackageId>
1414
<title>PowerUtils.Net.Primitives</title>
1515
<Product>PowerUtils.Net.Primitives</Product>
16-
<Version>1.1.1</Version>
16+
<Version>1.2.0</Version>
1717

1818
<Authors>Nelson Nobre</Authors>
1919
<Company>TechNobre</Company>
@@ -24,7 +24,9 @@
2424

2525
<Description>Provides additional types and constants for network-based libraries.</Description>
2626
<PackageReleaseNotes>
27-
Fixed link for status code UNPROCESSABLE_ENTITY 422
27+
- Added new constants for status codes;
28+
- Added utils `int.GetStatusCodeLinkOrDefault()`;
29+
- Fixed link for status code Unprocessable Entity 422;
2830
</PackageReleaseNotes>
2931
<Description>Provides additional types and constants for network-based libraries.</Description>
3032
<PackageTags>PowerUtils;Utils;Net;Primitives;Types;Constants;Web</PackageTags>

src/Constants/StatusCodeLink.cs

Lines changed: 74 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,70 @@
1-
using System;
1+
#region License
2+
// https://github.com/ofpinewood/http-exceptions/blob/main/LICENSE
3+
//
4+
// The latest version of this file can be found at https://github.com/ofpinewood/http-exceptions/blob/main/src/Opw.HttpExceptions/ResponseStatusCodeLink.cs
5+
#endregion
6+
7+
8+
using System;
29

310
namespace PowerUtils.Net.Constants
411
{
5-
// Reference: https://github.com/ofpinewood/http-exceptions/blob/main/src/Opw.HttpExceptions/ResponseStatusCodeLink.cs
12+
// Reference: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status#information_responses
613

714
/// <summary>
815
/// Status code information links to https://tools.ietf.org/html/rfc7231.
916
/// </summary>
1017
public static class StatusCodeLink
1118
{
12-
private const string BASE_URL = "https://tools.ietf.org/";
19+
private const string BASE_URL = "https://tools.ietf.org/html/";
1320

14-
public const string STATUS_CODES = BASE_URL + "html/rfc7231#section-6";
21+
public const string STATUS_CODES = BASE_URL + "rfc7231#section-6";
22+
23+
public const string BAD_REQUEST = BASE_URL + "rfc7231#section-6.5.1";
24+
public const string UNAUTHORIZED = BASE_URL + "rfc7235#section-3.1";
25+
public const string PAYMENT_REQUIRED = BASE_URL + "rfc7231#section-6.5.2";
26+
public const string FORBIDDEN = BASE_URL + "rfc7231#section-6.5.3";
27+
public const string NOT_FOUND = BASE_URL + "rfc7231#section-6.5.4";
28+
public const string METHOD_NOT_ALLOWED = BASE_URL + "rfc7231#section-6.5.5";
29+
public const string NOT_ACCEPTABLE = BASE_URL + "rfc7231#section-6.5.6";
30+
public const string PROXY_AUTHENTICATION_REQUIRED = BASE_URL + "rfc7235#section-3.2";
31+
public const string REQUEST_TIMEOUT = BASE_URL + "rfc7231#section-6.5.7";
32+
public const string CONFLICT = BASE_URL + "rfc7231#section-6.5.8";
33+
public const string GONE = BASE_URL + "rfc7231#section-6.5.9";
34+
public const string LENGTH_REQUIRED = BASE_URL + "rfc7231#section-6.5.10";
35+
public const string PRECONDITION_FAILED = BASE_URL + "rfc7232#section-4.2";
36+
public const string REQUEST_ENTITY_TOO_LARGE = BASE_URL + "rfc7231#section-6.5.11";
37+
public const string REQUEST_URI_TOO_LONG = BASE_URL + "rfc7231#section-6.5.12";
38+
public const string UNSUPPORTED_MEDIA_TYPE = BASE_URL + "rfc7231#section-6.5.13";
39+
public const string REQUESTED_RANGE_NOT_SATISFIABLE = BASE_URL + "rfc7233#section-4.4";
40+
public const string EXPECTATION_FAILED = BASE_URL + "rfc7231#section-6.5.14";
41+
public const string I_AM_A_TEAPOT = BASE_URL + "rfc2324#section-2.3.2";
42+
public const string UNPROCESSABLE_ENTITY = BASE_URL + "rfc4918#section-11.2";
43+
public const string TOO_EARLY = "https://httpwg.org/specs/rfc8470.html#status";
44+
public const string UPGRADE_REQUIRED = BASE_URL + "rfc7231#section-6.5.15";
45+
public const string PRECONDITION_REQUIRED = BASE_URL + "rfc6585#section-3";
46+
public const string TOO_MANY_REQUESTS = BASE_URL + "rfc6585#section-4";
47+
public const string REQUEST_HEADER_FIELDS_TOO_LARGE = BASE_URL + "rfc6585#section-5";
48+
public const string UNAVAILABLE_FOR_LEGAL_REASONS = "https://httpwg.org/specs/rfc7725.html#n-451-unavailable-for-legal-reasons";
49+
public const string INTERNAL_SERVER_ERROR = BASE_URL + "rfc7231#section-6.6.1";
50+
public const string NOT_IMPLEMENTED = BASE_URL + "rfc7231#section-6.6.2";
51+
public const string BAD_GATEWAY = BASE_URL + "rfc7231#section-6.6.3";
52+
public const string SERVICE_UNAVAILABLE = BASE_URL + "rfc7231#section-6.6.4";
53+
public const string GATEWAY_TIMEOUT = BASE_URL + "rfc7231#section-6.6.5";
54+
public const string HTTP_VERSION_NOT_SUPPORTED = BASE_URL + "rfc7231#section-6.6.6";
55+
public const string VARIANT_ALSO_NEGOTIATES = BASE_URL + "rfc2295#section-8.1";
56+
public const string INSUFFICIENT_STORAGE = BASE_URL + "rfc4918#section-11.5";
57+
public const string LOOP_DETECTED = BASE_URL + "rfc5842#section-7.2";
58+
public const string NOT_EXTENDED = BASE_URL + "rfc2774#section-7";
59+
public const string NETWORK_AUTHENTICATION_REQUIRED = BASE_URL + "rfc6585#section-6";
1560

16-
public const string BAD_REQUEST = BASE_URL + "html/rfc7231#section-6.5.1";
17-
public const string UNAUTHORIZED = BASE_URL + "html/rfc7235#section-3.1";
18-
public const string PAYMENT_REQUIRED = BASE_URL + "html/rfc7231#section-6.5.2";
19-
public const string FORBIDDEN = BASE_URL + "html/rfc7231#section-6.5.3";
20-
public const string NOT_FOUND = BASE_URL + "html/rfc7231#section-6.5.4";
21-
public const string METHOD_NOT_ALLOWED = BASE_URL + "html/rfc7231#section-6.5.5";
22-
public const string NOT_ACCEPTABLE = BASE_URL + "html/rfc7231#section-6.5.6";
23-
public const string PROXY_AUTHENTICATION_REQUIRED = BASE_URL + "html/rfc7235#section-3.2";
24-
public const string REQUEST_TIMEOUT = BASE_URL + "html/rfc7231#section-6.5.7";
25-
public const string CONFLICT = BASE_URL + "html/rfc7231#section-6.5.8";
26-
public const string GONE = BASE_URL + "html/rfc7231#section-6.5.9";
27-
public const string LENGTH_REQUIRED = BASE_URL + "html/rfc7231#section-6.5.10";
28-
public const string PRECONDITION_FAILED = BASE_URL + "html/rfc7232#section-4.2";
29-
public const string REQUEST_ENTITY_TOO_LARGE = BASE_URL + "html/rfc7231#section-6.5.11";
30-
public const string REQUEST_URI_TOO_LONG = BASE_URL + "html/rfc7231#section-6.5.12";
31-
public const string UNSUPPORTED_MEDIA_TYPE = BASE_URL + "html/rfc7231#section-6.5.13";
32-
public const string REQUESTED_RANGE_NOT_SATISFIABLE = BASE_URL + "html/rfc7233#section-4.4";
33-
public const string EXPECTATION_FAILED = BASE_URL + "html/rfc7231#section-6.5.14";
34-
public const string UNPROCESSABLE_ENTITY = BASE_URL + "html/rfc4918#section-11.2";
35-
public const string UPGRADE_REQUIRED = BASE_URL + "html/rfc7231#section-6.5.15";
36-
public const string INTERNAL_SERVER_ERROR = BASE_URL + "html/rfc7231#section-6.6.1";
37-
public const string NOT_IMPLEMENTED = BASE_URL + "html/rfc7231#section-6.6.2";
38-
public const string BAD_GATEWAY = BASE_URL + "html/rfc7231#section-6.6.3";
39-
public const string SERVICE_UNAVAILABLE = BASE_URL + "html/rfc7231#section-6.6.4";
40-
public const string GATEWAY_TIMEOUT = BASE_URL + "html/rfc7231#section-6.6.5";
41-
public const string HTTP_VERSION_NOT_SUPPORTED = BASE_URL + "html/rfc7231#section-6.6.6";
4261

4362
/// <summary>
4463
/// Get documentation link by status code
4564
/// </summary>
46-
/// <param name="statuCode">Http statu code</param>
47-
/// <exception cref="ArgumentException">The <paramref name="statuCode">info</paramref> parameter does not exist.</exception>
48-
/// <returns>Documentation link</returns>
49-
public static string GetStatusCodeLink(this int statuCode)
65+
/// <param name="statuCode">Http status code</param>
66+
/// <returns>Documentation link. If the status code does not exists return NULL</returns>
67+
public static string GetStatusCodeLinkOrDefault(this int statuCode)
5068
=> statuCode switch
5169
{
5270
// 4XX
@@ -68,8 +86,14 @@ public static string GetStatusCodeLink(this int statuCode)
6886
415 => UNSUPPORTED_MEDIA_TYPE,
6987
416 => REQUESTED_RANGE_NOT_SATISFIABLE,
7088
417 => EXPECTATION_FAILED,
89+
418 => I_AM_A_TEAPOT,
7190
422 => UNPROCESSABLE_ENTITY,
91+
425 => TOO_EARLY,
7292
426 => UPGRADE_REQUIRED,
93+
428 => PRECONDITION_REQUIRED,
94+
429 => TOO_MANY_REQUESTS,
95+
431 => REQUEST_HEADER_FIELDS_TOO_LARGE,
96+
451 => UNAVAILABLE_FOR_LEGAL_REASONS,
7397

7498
// 5XX
7599
500 => INTERNAL_SERVER_ERROR,
@@ -78,14 +102,28 @@ public static string GetStatusCodeLink(this int statuCode)
78102
503 => SERVICE_UNAVAILABLE,
79103
504 => GATEWAY_TIMEOUT,
80104
505 => HTTP_VERSION_NOT_SUPPORTED,
105+
506 => VARIANT_ALSO_NEGOTIATES,
106+
507 => INSUFFICIENT_STORAGE,
107+
508 => LOOP_DETECTED,
108+
510 => NOT_EXTENDED,
109+
511 => NETWORK_AUTHENTICATION_REQUIRED,
81110

82-
_ => throw new ArgumentException($"Unknown status code: '{statuCode}'"),
111+
_ => null,
83112
};
84113

85114
/// <summary>
86115
/// Get documentation link by status code
87116
/// </summary>
88-
/// <param name="statuCode">Http statu code</param>
117+
/// <param name="statuCode">Http status code</param>
118+
/// <exception cref="ArgumentException">The <paramref name="statuCode">info</paramref> parameter does not exist.</exception>
119+
/// <returns>Documentation link</returns>
120+
public static string GetStatusCodeLink(this int statuCode)
121+
=> statuCode.GetStatusCodeLinkOrDefault() ?? throw new ArgumentException($"Unknown status code: '{statuCode}'");
122+
123+
/// <summary>
124+
/// Get documentation link by status code
125+
/// </summary>
126+
/// <param name="statuCode">Http status code</param>
89127
/// <exception cref="ArgumentException">The <paramref name="statuCode">info</paramref> parameter does not exist.</exception>
90128
/// <returns>Documentation link</returns>
91129
public static string GetStatusCodeLink(this int? statuCode)

tests/PowerUtils.Net.Primitives.Tests/ConstantsTests/StatusCodeLinksTests.cs

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,30 +28,67 @@ public class StatusCodeLinksTests
2828
[InlineData(415, StatusCodeLink.UNSUPPORTED_MEDIA_TYPE)]
2929
[InlineData(416, StatusCodeLink.REQUESTED_RANGE_NOT_SATISFIABLE)]
3030
[InlineData(417, StatusCodeLink.EXPECTATION_FAILED)]
31+
[InlineData(418, StatusCodeLink.I_AM_A_TEAPOT)]
3132
[InlineData(422, StatusCodeLink.UNPROCESSABLE_ENTITY)]
33+
[InlineData(425, StatusCodeLink.TOO_EARLY)]
3234
[InlineData(426, StatusCodeLink.UPGRADE_REQUIRED)]
35+
[InlineData(428, StatusCodeLink.PRECONDITION_REQUIRED)]
36+
[InlineData(429, StatusCodeLink.TOO_MANY_REQUESTS)]
37+
[InlineData(431, StatusCodeLink.REQUEST_HEADER_FIELDS_TOO_LARGE)]
38+
[InlineData(451, StatusCodeLink.UNAVAILABLE_FOR_LEGAL_REASONS)]
3339
[InlineData(500, StatusCodeLink.INTERNAL_SERVER_ERROR)]
3440
[InlineData(501, StatusCodeLink.NOT_IMPLEMENTED)]
3541
[InlineData(502, StatusCodeLink.BAD_GATEWAY)]
3642
[InlineData(503, StatusCodeLink.SERVICE_UNAVAILABLE)]
3743
[InlineData(504, StatusCodeLink.GATEWAY_TIMEOUT)]
3844
[InlineData(505, StatusCodeLink.HTTP_VERSION_NOT_SUPPORTED)]
45+
[InlineData(506, StatusCodeLink.VARIANT_ALSO_NEGOTIATES)]
46+
[InlineData(507, StatusCodeLink.INSUFFICIENT_STORAGE)]
47+
[InlineData(508, StatusCodeLink.LOOP_DETECTED)]
48+
[InlineData(510, StatusCodeLink.NOT_EXTENDED)]
49+
[InlineData(511, StatusCodeLink.NETWORK_AUTHENTICATION_REQUIRED)]
3950
public void GetStatusCodeLink_StatusCodes_ReturnLinks(int? statusCode, string statusCodeLink)
4051
{
4152
// Arrange & Act
4253
var act = statusCode.GetStatusCodeLink();
4354

4455
// Assert
45-
act.Should().Be(statusCodeLink);
56+
act.Should()
57+
.Be(statusCodeLink);
4658
}
4759

48-
[Fact(DisplayName = "Http status codes invalid - Should return an exception")]
60+
[Fact(DisplayName = "Http status codes non-existent - Should return an exception")]
4961
public void GetStatusCodeLink_InvalidStatusCode_ReturnLinks()
5062
{
5163
// Arrange & Act
5264
var act = () => 666.GetStatusCodeLink();
5365

5466
// Assert
55-
act.Should().Throw<ArgumentException>();
67+
act.Should()
68+
.Throw<ArgumentException>();
69+
}
70+
71+
[Fact(DisplayName = "Http status codes non-existent - Should return null")]
72+
public void GetStatusCodeLinkOrDefault_NonExistent_Null()
73+
{
74+
// Arrange & Act
75+
var act = 666.GetStatusCodeLinkOrDefault();
76+
77+
78+
// Assert
79+
act.Should()
80+
.BeNull();
81+
}
82+
83+
[Fact(DisplayName = "Http status codes existent - Should return the link")]
84+
public void GetStatusCodeLinkOrDefault_Existent_Link()
85+
{
86+
// Arrange & Act
87+
var act = 510.GetStatusCodeLinkOrDefault();
88+
89+
90+
// Assert
91+
act.Should()
92+
.NotBeNull();
5693
}
5794
}

0 commit comments

Comments
 (0)