Skip to content

Commit a5e4433

Browse files
Encode session data early when we know how much of the byte array to encode. (#25)
1 parent 333f136 commit a5e4433

File tree

1 file changed

+22
-12
lines changed

1 file changed

+22
-12
lines changed

src/CosmosDBSessionStateProviderAsync/CosmosDBSessionStateProviderAsync.cs

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -663,16 +663,16 @@ public override async Task CreateUninitializedItemAsync(
663663
throw new ArgumentNullException("id");
664664
}
665665

666-
byte[] buf;
666+
string encodedBuf;
667667

668668
var item = new SessionStateStoreData(new SessionStateItemCollection(),
669669
GetSessionStaticObjects(context.ApplicationInstance.Context),
670670
timeout);
671671

672-
SerializeStoreData(item, out buf, s_compressionEnabled);
672+
SerializeStoreData(item, out encodedBuf, s_compressionEnabled);
673673

674674
var timeoutInSecs = 60 * timeout;
675-
await CreateSessionStateItemAsync(id, timeoutInSecs, buf, true);
675+
await CreateSessionStateItemAsync(id, timeoutInSecs, encodedBuf, true);
676676
}
677677

678678
/// <inheritdoc />
@@ -776,7 +776,7 @@ public override async Task SetAndReleaseItemExclusiveAsync(
776776
bool newItem,
777777
CancellationToken cancellationToken)
778778
{
779-
byte[] buf;
779+
string encodedBuf;
780780
int lockCookie;
781781

782782
if (item == null)
@@ -790,7 +790,7 @@ public override async Task SetAndReleaseItemExclusiveAsync(
790790

791791
try
792792
{
793-
SerializeStoreData(item, out buf, s_compressionEnabled);
793+
SerializeStoreData(item, out encodedBuf, s_compressionEnabled);
794794
}
795795
catch
796796
{
@@ -804,15 +804,15 @@ public override async Task SetAndReleaseItemExclusiveAsync(
804804

805805
if (newItem)
806806
{
807-
await CreateSessionStateItemAsync(id, s_timeout, buf, false);
807+
await CreateSessionStateItemAsync(id, s_timeout, encodedBuf, false);
808808
}
809809
else
810810
{
811811
var spLink = UriFactory.CreateStoredProcedureUri(s_dbId, s_collectionId, UpdateSessionStateItemSPID);
812812
var spResponse = await ExecuteStoredProcedureWithWrapperAsync<object>(spLink, CreateRequestOptions(id),
813813
//sessionId, lockCookie, timeout, sessionItem
814814
// SessionStateStoreData.Timeout is in minutes, TTL in DocumentDB is in seconds
815-
id, lockCookie, 60 * item.Timeout, buf);
815+
id, lockCookie, 60 * item.Timeout, encodedBuf);
816816

817817
CheckSPResponseAndThrowIfNeeded(spResponse);
818818
}
@@ -1156,14 +1156,14 @@ internal static async Task<IStoredProcedureResponse<TValue>> ExecuteStoredProced
11561156
}
11571157
}
11581158

1159-
internal async Task CreateSessionStateItemAsync(string sessionid, int timeoutInSec, byte[] ssItems, bool uninitialized)
1159+
internal async Task CreateSessionStateItemAsync(string sessionid, int timeoutInSec, string encodedSsItems, bool uninitialized)
11601160
{
11611161
if (PartitionEnabled)
11621162
{
11631163
var spLink = UriFactory.CreateStoredProcedureUri(s_dbId, s_collectionId, CreateSessionStateItemInPartitionSPID);
11641164
var spResponse = await ExecuteStoredProcedureWithWrapperAsync<object>(spLink, CreateRequestOptions(sessionid),
11651165
// sessionId, partitionValue, timeout, lockCookie, sessionItem, uninitialized
1166-
sessionid, CreatePartitionValue(sessionid), timeoutInSec, DefaultLockCookie, ssItems, uninitialized);
1166+
sessionid, CreatePartitionValue(sessionid), timeoutInSec, DefaultLockCookie, encodedSsItems, uninitialized);
11671167

11681168
CheckSPResponseAndThrowIfNeeded(spResponse);
11691169
}
@@ -1172,7 +1172,7 @@ internal async Task CreateSessionStateItemAsync(string sessionid, int timeoutInS
11721172
var spLink = UriFactory.CreateStoredProcedureUri(s_dbId, s_collectionId, CreateSessionStateItemSPID);
11731173
var spResponse = await ExecuteStoredProcedureWithWrapperAsync<object>(spLink, CreateRequestOptions(sessionid),
11741174
// sessionId, timeout, lockCookie, sessionItem, uninitialized
1175-
sessionid, timeoutInSec, DefaultLockCookie, ssItems, uninitialized);
1175+
sessionid, timeoutInSec, DefaultLockCookie, encodedSsItems, uninitialized);
11761176

11771177
CheckSPResponseAndThrowIfNeeded(spResponse);
11781178
}
@@ -1186,7 +1186,7 @@ private static void CheckSPResponseAndThrowIfNeeded<T>(IStoredProcedureResponse<
11861186
}
11871187
}
11881188
// Internal code copied from SessionStateUtility
1189-
internal static void SerializeStoreData(SessionStateStoreData item, out byte[] buf, bool compressionEnabled)
1189+
internal static void SerializeStoreData(SessionStateStoreData item, out string encodedBuf, bool compressionEnabled)
11901190
{
11911191
using (MemoryStream s = new MemoryStream())
11921192
{
@@ -1206,10 +1206,20 @@ internal static void SerializeStoreData(SessionStateStoreData item, out byte[] b
12061206
// This shouldn't happen, but to be sure, we are padding with an extra byte
12071207
s.WriteByte((byte)0xff);
12081208
}
1209-
buf = s.GetBuffer();
1209+
encodedBuf = GetEncodedStringFromMemoryStream(s);
12101210
}
12111211
}
12121212

1213+
private static string GetEncodedStringFromMemoryStream(MemoryStream s)
1214+
{
1215+
ArraySegment<byte> bytes = new ArraySegment<byte>();
1216+
1217+
if (!s.TryGetBuffer(out bytes))
1218+
return null;
1219+
1220+
return Convert.ToBase64String(bytes.Array, bytes.Offset, bytes.Count);
1221+
}
1222+
12131223
private static void Serialize(SessionStateStoreData item, Stream stream)
12141224
{
12151225
bool hasItems = true;

0 commit comments

Comments
 (0)