Skip to content

Commit 64db801

Browse files
committed
Multi-targeting for netcoreapp3.0 and net461 to fix build-failures
1 parent c678148 commit 64db801

File tree

1 file changed

+79
-30
lines changed

1 file changed

+79
-30
lines changed

src/Shared/WebEncoders/WebEncoders.cs

Lines changed: 79 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -190,36 +190,6 @@ public static int GetArraySizeRequiredToDecode(int count)
190190
return checked(count + numPaddingCharsToAdd);
191191
}
192192

193-
/// <summary>
194-
/// Encodes <paramref name="input"/> using base64url encoding.
195-
/// </summary>
196-
/// <param name="input">The binary input to encode.</param>
197-
/// <returns>The base64url-encoded form of <paramref name="input"/>.</returns>
198-
public static string Base64UrlEncode(ReadOnlySpan<byte> input)
199-
{
200-
if (input.IsEmpty)
201-
{
202-
return string.Empty;
203-
}
204-
205-
int bufferSize = GetArraySizeRequiredToEncode(input.Length);
206-
207-
char[] bufferToReturnToPool = null;
208-
Span<char> buffer = bufferSize <= 128
209-
? stackalloc char[bufferSize]
210-
: bufferToReturnToPool = ArrayPool<char>.Shared.Rent(bufferSize);
211-
212-
var numBase64Chars = Base64UrlEncode(input, buffer);
213-
var base64Url = new string(buffer.Slice(0, numBase64Chars));
214-
215-
if (bufferToReturnToPool != null)
216-
{
217-
ArrayPool<char>.Shared.Return(bufferToReturnToPool);
218-
}
219-
220-
return base64Url;
221-
}
222-
223193
/// <summary>
224194
/// Encodes <paramref name="input"/> using base64url encoding.
225195
/// </summary>
@@ -251,7 +221,20 @@ public static string Base64UrlEncode(byte[] input, int offset, int count)
251221

252222
ValidateParameters(input.Length, nameof(input), offset, count);
253223

224+
#if NETCOREAPP3_0
254225
return Base64UrlEncode(input.AsSpan(offset, count));
226+
#else
227+
// Special-case empty input
228+
if (count == 0)
229+
{
230+
return string.Empty;
231+
}
232+
233+
var buffer = new char[GetArraySizeRequiredToEncode(count)];
234+
var numBase64Chars = Base64UrlEncode(input, offset, buffer, outputOffset: 0, count: count);
235+
236+
return new string(buffer, startIndex: 0, length: numBase64Chars);
237+
#endif
255238
}
256239

257240
/// <summary>
@@ -302,7 +285,41 @@ public static int Base64UrlEncode(byte[] input, int offset, char[] output, int o
302285
nameof(count));
303286
}
304287

288+
#if NETCOREAPP3_0
305289
return Base64UrlEncode(input.AsSpan(offset, count), output.AsSpan(outputOffset));
290+
#else
291+
// Special-case empty input.
292+
if (count == 0)
293+
{
294+
return 0;
295+
}
296+
297+
// Use base64url encoding with no padding characters. See RFC 4648, Sec. 5.
298+
299+
// Start with default Base64 encoding.
300+
var numBase64Chars = Convert.ToBase64CharArray(input, offset, count, output, outputOffset);
301+
302+
// Fix up '+' -> '-' and '/' -> '_'. Drop padding characters.
303+
for (var i = outputOffset; i - outputOffset < numBase64Chars; i++)
304+
{
305+
var ch = output[i];
306+
if (ch == '+')
307+
{
308+
output[i] = '-';
309+
}
310+
else if (ch == '/')
311+
{
312+
output[i] = '_';
313+
}
314+
else if (ch == '=')
315+
{
316+
// We've reached a padding character; truncate the remainder.
317+
return i - outputOffset;
318+
}
319+
}
320+
321+
return numBase64Chars;
322+
#endif
306323
}
307324

308325
/// <summary>
@@ -319,6 +336,37 @@ public static int GetArraySizeRequiredToEncode(int count)
319336
return checked(numWholeOrPartialInputBlocks * 4);
320337
}
321338

339+
#if NETCOREAPP3_0
340+
/// <summary>
341+
/// Encodes <paramref name="input"/> using base64url encoding.
342+
/// </summary>
343+
/// <param name="input">The binary input to encode.</param>
344+
/// <returns>The base64url-encoded form of <paramref name="input"/>.</returns>
345+
public static string Base64UrlEncode(ReadOnlySpan<byte> input)
346+
{
347+
if (input.IsEmpty)
348+
{
349+
return string.Empty;
350+
}
351+
352+
int bufferSize = GetArraySizeRequiredToEncode(input.Length);
353+
354+
char[] bufferToReturnToPool = null;
355+
Span<char> buffer = bufferSize <= 128
356+
? stackalloc char[bufferSize]
357+
: bufferToReturnToPool = ArrayPool<char>.Shared.Rent(bufferSize);
358+
359+
var numBase64Chars = Base64UrlEncode(input, buffer);
360+
var base64Url = new string(buffer.Slice(0, numBase64Chars));
361+
362+
if (bufferToReturnToPool != null)
363+
{
364+
ArrayPool<char>.Shared.Return(bufferToReturnToPool);
365+
}
366+
367+
return base64Url;
368+
}
369+
322370
private static int Base64UrlEncode(ReadOnlySpan<byte> input, Span<char> output)
323371
{
324372
Debug.Assert(output.Length >= GetArraySizeRequiredToEncode(input.Length));
@@ -353,6 +401,7 @@ private static int Base64UrlEncode(ReadOnlySpan<byte> input, Span<char> output)
353401

354402
return charsWritten;
355403
}
404+
#endif
356405

357406
private static int GetNumBase64PaddingCharsInString(string str)
358407
{

0 commit comments

Comments
 (0)