mirror of
https://github.com/bitwarden/server.git
synced 2026-02-06 09:03:21 +08:00
* Revert "Encode into b64 to avoid illegal xml encoding when sending to Azure (#1425)"
This reverts commit 2c9a5bb4ab.
* Azure queue to use base64 encoding universally
* Ensure byte size calc is using encoded byte count
* Remove message text extension from blockIP svc
* Remove unused using on blockIp hosted service
96 lines
3.1 KiB
C#
96 lines
3.1 KiB
C#
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using Azure.Storage.Queues;
|
|
using Bit.Core.Utilities;
|
|
using Microsoft.EntityFrameworkCore.Internal;
|
|
using Newtonsoft.Json;
|
|
|
|
namespace Bit.Core.Services
|
|
{
|
|
public abstract class AzureQueueService<T>
|
|
{
|
|
protected QueueClient _queueClient;
|
|
protected JsonSerializerSettings _jsonSettings;
|
|
|
|
protected AzureQueueService(QueueClient queueClient, JsonSerializerSettings jsonSettings)
|
|
{
|
|
_queueClient = queueClient;
|
|
_jsonSettings = jsonSettings;
|
|
}
|
|
|
|
public async Task CreateAsync(T message)
|
|
{
|
|
var json = JsonConvert.SerializeObject(message, _jsonSettings);
|
|
var base64 = CoreHelpers.Base64EncodeString(json);
|
|
await _queueClient.SendMessageAsync(base64);
|
|
}
|
|
|
|
public async Task CreateManyAsync(IEnumerable<T> messages)
|
|
{
|
|
if (messages?.Any() != true)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (!messages.Skip(1).Any())
|
|
{
|
|
await CreateAsync(messages.First());
|
|
return;
|
|
}
|
|
|
|
foreach (var json in SerializeMany(messages, _jsonSettings))
|
|
{
|
|
await _queueClient.SendMessageAsync(json);
|
|
}
|
|
}
|
|
|
|
protected IEnumerable<string> SerializeMany(IEnumerable<T> messages, JsonSerializerSettings jsonSettings)
|
|
{
|
|
// Calculate Base-64 encoded text with padding
|
|
int getBase64Size(int byteCount) => ((4 * byteCount / 3) + 3) & ~3;
|
|
|
|
var messagesList = new List<string>();
|
|
var messagesListSize = 0;
|
|
|
|
int calculateByteSize(int totalSize, int toAdd) =>
|
|
// Calculate the total length this would be w/ "[]" and commas
|
|
getBase64Size(totalSize + toAdd + messagesList.Count + 2);
|
|
|
|
// Format the final array string, i.e. [{...},{...}]
|
|
string getArrayString()
|
|
{
|
|
if (messagesList.Count == 1)
|
|
{
|
|
return CoreHelpers.Base64EncodeString(messagesList[0]);
|
|
}
|
|
return CoreHelpers.Base64EncodeString(
|
|
string.Concat("[", string.Join(',', messagesList), "]"));
|
|
}
|
|
|
|
var serializedMessages = messages.Select(message =>
|
|
JsonConvert.SerializeObject(message, jsonSettings));
|
|
|
|
foreach (var message in serializedMessages)
|
|
{
|
|
var messageSize = Encoding.UTF8.GetByteCount(message);
|
|
if (calculateByteSize(messagesListSize, messageSize) > _queueClient.MessageMaxBytes)
|
|
{
|
|
yield return getArrayString();
|
|
messagesListSize = 0;
|
|
messagesList.Clear();
|
|
}
|
|
|
|
messagesList.Add(message);
|
|
messagesListSize += messageSize;
|
|
}
|
|
|
|
if (messagesList.Any())
|
|
{
|
|
yield return getArrayString();
|
|
}
|
|
}
|
|
}
|
|
}
|