public async Task TestGatewayModelSession() { ContainerProperties containerProperties = await this.Container.GetCachedContainerPropertiesAsync( false, Trace.GetRootTrace("Test"), CancellationToken.None); ISessionContainer sessionContainer = this.cosmosClient.DocumentClient.sessionContainer; string docLink = "dbs/" + this.database.Id + "/colls/" + containerProperties.Id + "/docs/3"; Documents.Collections.INameValueCollection headers = new StoreRequestNameValueCollection(); headers.Set(HttpConstants.HttpHeaders.PartitionKey, "[\"Status3\"]"); DocumentServiceRequest request = DocumentServiceRequest.Create(OperationType.Read, ResourceType.Document, docLink, AuthorizationTokenType.PrimaryMasterKey, headers); string globalSessionToken = sessionContainer.ResolveGlobalSessionToken(request); Assert.IsTrue(globalSessionToken.Split(',').Length > 1); await GatewayStoreModel.ApplySessionTokenAsync(request, Cosmos.ConsistencyLevel.Session, sessionContainer, await this.cosmosClient.DocumentClient.GetPartitionKeyRangeCacheAsync(NoOpTrace.Singleton), await this.cosmosClient.DocumentClient.GetCollectionCacheAsync(NoOpTrace.Singleton)); string sessionToken = request.Headers[HttpConstants.HttpHeaders.SessionToken]; Assert.IsTrue(!string.IsNullOrEmpty(sessionToken) && sessionToken.Split(',').Length == 1); }
internal static async Task ApplySessionTokenAsync( DocumentServiceRequest request, ConsistencyLevel defaultConsistencyLevel, ISessionContainer sessionContainer, PartitionKeyRangeCache partitionKeyRangeCache, CollectionCache clientCollectionCache) { if (request.Headers == null) { Debug.Fail("DocumentServiceRequest does not have headers."); return; } // Master resource operations don't require session token. if (GatewayStoreModel.IsMasterOperation(request.ResourceType, request.OperationType)) { if (!string.IsNullOrEmpty(request.Headers[HttpConstants.HttpHeaders.SessionToken])) { request.Headers.Remove(HttpConstants.HttpHeaders.SessionToken); } return; } if (!string.IsNullOrEmpty(request.Headers[HttpConstants.HttpHeaders.SessionToken])) { return; // User is explicitly controlling the session. } string requestConsistencyLevel = request.Headers[HttpConstants.HttpHeaders.ConsistencyLevel]; bool sessionConsistency = defaultConsistencyLevel == ConsistencyLevel.Session || (!string.IsNullOrEmpty(requestConsistencyLevel) && string.Equals(requestConsistencyLevel, ConsistencyLevel.Session.ToString(), StringComparison.OrdinalIgnoreCase)); if (!sessionConsistency || (!request.IsReadOnlyRequest && request.OperationType != OperationType.Batch)) { return; // Only apply the session token in case of session consistency and the request is read only } (bool isSuccess, string sessionToken) = await GatewayStoreModel.TryResolveSessionTokenAsync( request, sessionContainer, partitionKeyRangeCache, clientCollectionCache); if (!isSuccess) { sessionToken = sessionContainer.ResolveGlobalSessionToken(request); } if (!string.IsNullOrEmpty(sessionToken)) { request.Headers[HttpConstants.HttpHeaders.SessionToken] = sessionToken; } }
internal static void ApplySessionToken( DocumentServiceRequest request, ConsistencyLevel defaultConsistencyLevel, ISessionContainer sessionContainer) { if (request.Headers == null) { Debug.Fail("DocumentServiceRequest does not have headers."); return; } // Master resource operations don't require session token. if (GatewayStoreModel.IsMasterOperation(request.ResourceType, request.OperationType)) { if (!string.IsNullOrEmpty(request.Headers[HttpConstants.HttpHeaders.SessionToken])) { request.Headers.Remove(HttpConstants.HttpHeaders.SessionToken); } return; } if (!string.IsNullOrEmpty(request.Headers[HttpConstants.HttpHeaders.SessionToken])) { return; // User is explicitly controlling the session. } string requestConsistencyLevel = request.Headers[HttpConstants.HttpHeaders.ConsistencyLevel]; bool sessionConsistency = defaultConsistencyLevel == ConsistencyLevel.Session || (!string.IsNullOrEmpty(requestConsistencyLevel) && string.Equals(requestConsistencyLevel, ConsistencyLevel.Session.ToString(), StringComparison.OrdinalIgnoreCase)); if (!sessionConsistency) { return; // Only apply the session token in case of session consistency } //Apply the ambient session. string sessionToken = sessionContainer.ResolveGlobalSessionToken(request); if (!string.IsNullOrEmpty(sessionToken)) { request.Headers[HttpConstants.HttpHeaders.SessionToken] = sessionToken; } }