28 lines
1 KiB
C#
28 lines
1 KiB
C#
|
|
using System.Buffers;
|
||
|
|
using System.Buffers.Text;
|
||
|
|
using System.Text.Json;
|
||
|
|
using System.Text.Json.Serialization;
|
||
|
|
|
||
|
|
namespace IdentityShroud.Core.Helpers;
|
||
|
|
|
||
|
|
public class Base64UrlConverter : JsonConverter<byte[]>
|
||
|
|
{
|
||
|
|
public override byte[] Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
|
||
|
|
{
|
||
|
|
// GetValueSpan gives you the raw UTF-8 bytes of the JSON string value
|
||
|
|
if (reader.HasValueSequence)
|
||
|
|
{
|
||
|
|
var valueSequence = reader.ValueSequence.ToArray();
|
||
|
|
return Base64Url.DecodeFromUtf8(valueSequence);
|
||
|
|
}
|
||
|
|
return Base64Url.DecodeFromUtf8(reader.ValueSpan);
|
||
|
|
}
|
||
|
|
|
||
|
|
public override void Write(Utf8JsonWriter writer, byte[] value, JsonSerializerOptions options)
|
||
|
|
{
|
||
|
|
int encodedLength = Base64Url.GetEncodedLength(value.Length);
|
||
|
|
Span<byte> buffer = encodedLength <= 256 ? stackalloc byte[encodedLength] : new byte[encodedLength];
|
||
|
|
Base64Url.EncodeToUtf8(value, buffer);
|
||
|
|
writer.WriteStringValue(buffer);
|
||
|
|
}
|
||
|
|
}
|