Пример #1
0
        /// <summary>
        /// Create batch.
        /// </summary>
        /// <param name="batch">List of usages.</param>
        /// <returns>Id of new created batch - Guid.</returns>
        public static async Task <ODataSingleValueResponse <Guid> > PostBatch(APBatch batch)
        {
            await SetAuthHeader();

            var content  = new StringContent(Serialize(batch), Encoding.UTF8, "application/json");
            var response = await Client.PostAsync($"/odata/Batches", content);

            return(JsonConvert.DeserializeObject <ODataSingleValueResponse <Guid> >(await response.Content.ReadAsStringAsync()));
        }
 public async Task MultiCallerWithUserUpdateTest()
 {
     var user = await UserHelper.CreateNewUserAsync();
     user.SetAttribute("IsTestUser", "true");
     APBatch batch = new APBatch();
     batch.SaveObject(user);
     await batch.ExecuteAsync();
     Assert.AreEqual(1, batch.UpdatedObjects.Count());
 }
 public async Task MulticallerCanOnlyBeExecutedOnceTest()
 {
     var newObj = ObjectHelper.NewInstance();
     APBatch batch = new APBatch();
     batch.SaveObject(newObj);
     await batch.ExecuteAsync();
     try
     {
         await batch.ExecuteAsync();
         Assert.Fail("This should have failed.");
     }
     catch (AppacitiveRuntimeException)
     {
     }
 }
 public void HasBatchReferencesShouldBeTrueForConnectionsWithBatchReferences()
 {
     APBatch batch = new APBatch();
     var obj = ObjectHelper.NewInstance();
     var objReference = batch.SaveObject(obj);
     var connA = new APConnection("type", "labelA", "IdA", "labelB", "idB");
     var connB = new APConnection("type", "labelA", obj, "labelB", obj);
     var connC = new APConnection("type", "labelA", obj, "labelB", "IdB");
     var connD = new APConnection("type", "labelA", "IdA", "labelB", objReference);
     var connE = new APConnection("type", "labelA", objReference, "labelB", objReference);
     var connF = new APConnection("type", "labelA", obj, "labelB", objReference);
     
     Assert.IsFalse(connA.Endpoints.HasBatchReference);
     Assert.IsFalse(connB.Endpoints.HasBatchReference);
     Assert.IsFalse(connC.Endpoints.HasBatchReference);
     Assert.IsTrue(connD.Endpoints.HasBatchReference);
     Assert.IsTrue(connE.Endpoints.HasBatchReference);
     Assert.IsTrue(connF.Endpoints.HasBatchReference);
 }
        public async Task AllMultiCallerOperationsTest()
        {
            var newObj = ObjectHelper.NewInstance();
            var existing = await ObjectHelper.CreateNewAsync();
            var objToBeDeleted = await ObjectHelper.CreateNewAsync();

            var newConn = APConnection.New("sibling")
                            .FromNewObject("object", ObjectHelper.NewInstance())
                            .ToNewObject("object", ObjectHelper.NewInstance());
            var existingConn = await APConnection.New("sibling")
                            .FromNewObject("object", ObjectHelper.NewInstance())
                            .ToNewObject("object", ObjectHelper.NewInstance())
                            .SaveAsync();
            var toBeDeletedConn = await APConnection.New("sibling")
                            .FromNewObject("object", ObjectHelper.NewInstance())
                            .ToNewObject("object", ObjectHelper.NewInstance())
                            .SaveAsync();

            existing.Set("textfield", Guid.NewGuid().ToString());
            existingConn.SetAttribute("testAttr", Guid.NewGuid().ToString());
            APBatch batch = new APBatch();
            batch.SaveObject(newObj);
            batch.SaveObject(existing);
            batch.SaveConnection(newConn);
            batch.SaveConnection(existingConn);
            batch.DeleteObject(objToBeDeleted);
            batch.DeleteConnection(toBeDeletedConn);
            await batch.ExecuteAsync();

            Assert.AreEqual(1, batch.CreatedObjects.Count());
            Assert.AreEqual(1, batch.CreatedConnections.Count());
            Assert.AreEqual(1, batch.UpdatedObjects.Count());
            Assert.AreEqual(1, batch.UpdatedConnections.Count());
            Assert.AreEqual(1, batch.DeletedObjects.Count());
            Assert.AreEqual(1, batch.DeletedConnections.Count());

        }
Пример #6
0
        /// <summary>
        /// Batches the example.
        /// </summary>
        /// <returns>Task.</returns>
        private static async Task BatchExample()
        {
            var batchUrl = $"{_baseAddress}/odata/$batches";
            // Global batch request
            var batchRequest = new HttpRequestMessage(HttpMethod.Post, batchUrl);

            batchRequest.Headers.Authorization = new AuthenticationHeaderValue("bearer", (await GetToken()).AccessToken);

            //POST Request
            //Create Batch Model
            var newBatch = new APBatch {
                BatchNo = "Batch No"
            };
            //Send request
            var batchPK = (await PostBatch(newBatch)).Value;

            // Multiple GET Requests
            var batchContent = new MultipartContent("mixed", $"batches_{Guid.NewGuid()}")
            {
                ComposeGetContent($"{_baseAddress}/odata/Inventory({new Guid("4311192f-c46f-4655-8d51-fc2f49aabf78")})"),
                ComposeGetContent($"{_baseAddress}/odata/Inventory({new Guid("71395601-8db7-4f3a-b466-106663990c90")})"),
                ComposeGetContent($"{_baseAddress}/odata/Inventory({new Guid("2a3e66aa-2e15-4035-8534-cb8a2280beea")})")
            };

            // Multiple POST Requests
            // multi-part content that represents the change-set container
            MultipartContent changeSet = new MultipartContent("mixed", $"changeset_{Guid.NewGuid()}");

            // Add POST content to the change-set
            var content1 = new StringContent(Serialize(GetNewInventory()), Encoding.UTF8, "application/json");
            var content2 = new StringContent(Serialize(GetNewInventory()), Encoding.UTF8, "application/json");
            var content3 = new StringContent(Serialize(GetNewInventory()), Encoding.UTF8, "application/json");

            changeSet.Add(ComposePostContent($"{_baseAddress}/odata/Inventory", content1));
            changeSet.Add(ComposePostContent($"{_baseAddress}/odata/Inventory", content2));
            changeSet.Add(ComposePostContent($"{_baseAddress}/odata/Inventory", content3));

            // Add the change-set to the batch content
            batchContent.Add(changeSet);

            batchRequest.Content = batchContent;

            var http = new HttpClient();
            HttpResponseMessage response = await http.SendAsync(batchRequest);

            var result = await response.Content.ReadAsMultipartAsync();

            // Batch response handling
            foreach (HttpContent currentContent in result.Contents)
            {
                // 1. a "single" response
                if (currentContent.Headers.ContentType.MediaType.Equals("application/http", StringComparison.OrdinalIgnoreCase) &&
                    !currentContent.Headers.ContentType.Parameters.Any(parameter => parameter.Name.Equals("msgtype", StringComparison.OrdinalIgnoreCase) && parameter.Value.Equals("response", StringComparison.OrdinalIgnoreCase)))
                {
                    currentContent.Headers.ContentType.Parameters.Add(new NameValueHeaderValue("msgtype", "response"));
                    await currentContent.ReadAsHttpResponseMessageAsync();

                    // The workingResponse object contains a classic exploitable HttpResponseMessage (with IsSuccessStatusCode, Content.ReadAsStringAsync().Result, etc.)
                }
                // 2. a change-set response with multi-part content
                else
                {
                    var subMultipartContent = await currentContent.ReadAsMultipartAsync();

                    foreach (HttpContent currentSubContent in subMultipartContent.Contents)
                    {
                        currentSubContent.Headers.ContentType.Parameters.Add(new NameValueHeaderValue("msgtype", "response"));
                        await currentSubContent.ReadAsHttpResponseMessageAsync();

                        // Same here, the workingResponse object contains a classic exploitable HttpResponseMessage
                    }
                }
            }
        }
        public async Task MultiCallerWithInternalReferenceTest()
        {
            APBatch batch = new APBatch();
            var newObj = ObjectHelper.NewInstance();
            var objReference = batch.SaveObject(newObj);
            var newConn = APConnection.New("sibling")
                            .FromNewObject("object", ObjectHelper.NewInstance())
                            .ToBatchObjectReference("object", objReference);
            var connReference = batch.SaveConnection(newConn);
            
            await batch.ExecuteAsync();

            Assert.AreEqual(1, batch.CreatedObjects.Count());
            Assert.AreEqual(1, batch.CreatedConnections.Count());
            Assert.IsNotNull(batch.CreatedObjects[objReference]);
            Assert.IsNotNull(batch.CreatedConnections[connReference]);

        }
 public async Task SaveForConnectionWithBatchReferenceShouldFaultTest()
 {
     APBatch batch = new APBatch();
     var obj = ObjectHelper.NewInstance();
     var objReference = batch.SaveObject(obj);
     var conn = APConnection
         .New("siblings")
         .FromNewObject("object", ObjectHelper.NewInstance())
         .ToBatchObjectReference("object", objReference);
     try
     {
         await conn.SaveAsync();
         Assert.Fail("This should have failed.");
     }
     catch (AppacitiveRuntimeException)
     {
     }   
 }