|
3 | 3 | using System; |
4 | 4 | using System.Security.Cryptography; |
5 | 5 |
|
6 | | -using Smdn.Formats; |
7 | | -using Smdn.Text; |
8 | | - |
9 | 6 | namespace Smdn.Formats.PercentEncodings { |
10 | 7 | /* |
11 | 8 | * http://tools.ietf.org/html/rfc3986 |
12 | 9 | * RFC 3986 - Uniform Resource Identifier (URI): Generic Syntax |
13 | 10 | * 2.1. Percent-Encoding |
14 | | - * |
| 11 | + * |
15 | 12 | * http://tools.ietf.org/html/rfc2396 |
16 | 13 | * RFC 2396 - Uniform Resource Identifiers (URI): Generic Syntax |
17 | 14 | */ |
@@ -53,48 +50,24 @@ private byte[] GetEscapeOctets(string str) |
53 | 50 | return octets; |
54 | 51 | } |
55 | 52 |
|
56 | | - public bool CanTransformMultipleBlocks { |
57 | | - get { return true; } |
58 | | - } |
59 | | - |
60 | | - public bool CanReuseTransform { |
61 | | - get { return true; } |
62 | | - } |
63 | | - |
64 | | - public int InputBlockSize { |
65 | | - get { return 1; } |
66 | | - } |
67 | | - |
68 | | - public int OutputBlockSize { |
69 | | - get { return 3; } |
70 | | - } |
| 53 | + public bool CanTransformMultipleBlocks => true; |
| 54 | + public bool CanReuseTransform => true; |
| 55 | + public int InputBlockSize => 1; |
| 56 | + public int OutputBlockSize => 3; |
71 | 57 |
|
72 | 58 | public ToPercentEncodedTransform(ToPercentEncodedTransformMode mode) |
73 | 59 | { |
74 | | - switch (mode & ToPercentEncodedTransformMode.ModeMask) { |
75 | | - case ToPercentEncodedTransformMode.Rfc2396Uri: |
76 | | - escapeOctets = GetEscapeOctets(Rfc2396UriEscapeChars); |
77 | | - break; |
78 | | - case ToPercentEncodedTransformMode.Rfc2396Data: |
79 | | - escapeOctets = GetEscapeOctets(Rfc2396DataEscapeChars); |
80 | | - break; |
81 | | - case ToPercentEncodedTransformMode.Rfc3986Uri: |
82 | | - escapeOctets = GetEscapeOctets(Rfc3986UriEscapeChars); |
83 | | - break; |
84 | | - case ToPercentEncodedTransformMode.Rfc3986Data: |
85 | | - escapeOctets = GetEscapeOctets(Rfc3986DataEscapeChars); |
86 | | - break; |
87 | | - case ToPercentEncodedTransformMode.Rfc5092Uri: |
88 | | - escapeOctets = GetEscapeOctets(Rfc5092AChars); |
89 | | - break; |
90 | | - case ToPercentEncodedTransformMode.Rfc5092Path: |
91 | | - escapeOctets = GetEscapeOctets(Rfc5092BChars); |
92 | | - break; |
93 | | - default: |
94 | | - throw ExceptionUtils.CreateNotSupportedEnumValue(mode); |
95 | | - } |
96 | | - |
97 | | - escapeSpaceToPlus = (int)(mode & ToPercentEncodedTransformMode.EscapeSpaceToPlus) != 0; |
| 60 | + escapeOctets = (mode & ToPercentEncodedTransformMode.ModeMask) switch { |
| 61 | + ToPercentEncodedTransformMode.Rfc2396Uri => GetEscapeOctets(Rfc2396UriEscapeChars), |
| 62 | + ToPercentEncodedTransformMode.Rfc2396Data => GetEscapeOctets(Rfc2396DataEscapeChars), |
| 63 | + ToPercentEncodedTransformMode.Rfc3986Uri => GetEscapeOctets(Rfc3986UriEscapeChars), |
| 64 | + ToPercentEncodedTransformMode.Rfc3986Data => GetEscapeOctets(Rfc3986DataEscapeChars), |
| 65 | + ToPercentEncodedTransformMode.Rfc5092Uri => GetEscapeOctets(Rfc5092AChars), |
| 66 | + ToPercentEncodedTransformMode.Rfc5092Path => GetEscapeOctets(Rfc5092BChars), |
| 67 | + _ => throw ExceptionUtils.CreateNotSupportedEnumValue(mode), |
| 68 | + }; |
| 69 | + |
| 70 | + escapeSpaceToPlus = (mode & ToPercentEncodedTransformMode.EscapeSpaceToPlus) != 0; |
98 | 71 | } |
99 | 72 |
|
100 | 73 | public void Clear() |
@@ -133,14 +106,13 @@ public int TransformBlock(byte[] inputBuffer, int inputOffset, int inputCount, b |
133 | 106 | for (var i = 0; i < inputCount; i++) { |
134 | 107 | var octet = inputBuffer[inputOffset++]; |
135 | 108 |
|
136 | | - var escape = |
137 | | - !((0x30 <= octet && octet <= 0x39) || // DIGIT |
138 | | - (0x41 <= octet && octet <= 0x5a) || // UPALPHA |
139 | | - (0x61 <= octet && octet <= 0x7a) // LOWALPHA |
140 | | - ) && |
141 | | - (octet < 0x20 || 0x80 <= octet); |
| 109 | + var isPrintable = octet is >= 0x20 and < 0x80; |
| 110 | + var isDigit = isPrintable && octet is >= 0x30 and <= 0x39; // DIGIT |
| 111 | + var isUpAlpha = isPrintable && octet is >= 0x41 and <= 0x5a; // UPALPHA |
| 112 | + var isLowAlpha = isPrintable && octet is >= 0x61 and <= 0x7a; // UPALPHA |
| 113 | + var escape = !isPrintable && !(isDigit || isUpAlpha || isLowAlpha); |
142 | 114 |
|
143 | | - escape |= (0 <= Array.BinarySearch(escapeOctets, octet)); |
| 115 | + escape |= 0 <= Array.BinarySearch(escapeOctets, octet); |
144 | 116 |
|
145 | 117 | if (escape) { |
146 | 118 | if (octet == 0x20 && escapeSpaceToPlus) { |
@@ -192,7 +164,7 @@ public byte[] TransformFinalBlock(byte[] inputBuffer, int inputOffset, int input |
192 | 164 | } |
193 | 165 |
|
194 | 166 | private bool disposed = false; |
195 | | - private byte[] escapeOctets; |
196 | | - private bool escapeSpaceToPlus; |
| 167 | + private readonly byte[] escapeOctets; |
| 168 | + private readonly bool escapeSpaceToPlus; |
197 | 169 | } |
198 | 170 | } |
0 commit comments