コード例 #1
0
ファイル: BatchWriter.cs プロジェクト: zhonli/odata.net
        public static void WriteBatchRequest(BatchRequest batchRequest, StringWriter writer)
        {
            //--batchresponse_aa2a62c3-d5f4-447e-9302-d31f062b02f7
            //Content-Type: multipart/mixed; boundary=changesetresponse_1837899f-f0ce-447e-a980-d2596a561051

            string batchBoundary = "batch_" + batchRequest.Identifier;

            foreach (BatchChangeset changeset in batchRequest.Changesets)
            {
                string setBoundary = "changeset_" + changeset.Identifier;
                writer.Write("--");
                writer.WriteLine(batchBoundary);
                writer.WriteLine("Content-Type: " + RequestUtil.RandomizeContentTypeCapitalization("multipart/mixed; boundary=" + setBoundary));
                writer.WriteLine();

                foreach (AstoriaRequest request in changeset)
                {
                    writer.Write("--");
                    writer.WriteLine(setBoundary);

                    WriteBatchRequestFragment(request, writer);
                }

                writer.Write("--");
                writer.Write(setBoundary);
                writer.WriteLine("--");
            }

            foreach (AstoriaRequest request in batchRequest.Requests)
            {
                // TODO: newline?
                writer.Write("--");
                writer.WriteLine(batchBoundary);
                // TODO: newline?

                WriteBatchRequestFragment(request, writer);
            }

            writer.Write("--");
            writer.Write(batchBoundary);
            writer.WriteLine("--");
        }
コード例 #2
0
ファイル: AstoriaRequest.cs プロジェクト: zhonli/odata.net
        public virtual AstoriaResponse GetResponse()
        {
            LogRequest();

            OnSend(this);

            // NOTHING should come in between this and actually sending the request
#if !ClientSKUFramework
            SetupAPICallLog();
#endif
            AstoriaResponse response;
            if (AstoriaTestProperties.BatchAllRequests)
            {
                BatchRequest batchRequest = new BatchRequest(Workspace);
                if (Verb_Internal == RequestVerb.Get)
                {
                    batchRequest.Add(this);
                }
                else
                {
                    BatchChangeset changeset = batchRequest.GetChangeset();
                    changeset.Add(this);
                }
                BatchResponse batchResponse = batchRequest.GetResponse() as BatchResponse;
                response = batchResponse.Responses.FirstOrDefault();
            }
            else
            {
                response = RequestSender.SendRequest(this);
            }

#if !ClientSKUFramework
            // NOTHING should come in between this and actually recieving the response
            RetrieveAPICallLog();
#endif

            OnReceive(this, response);

            return(response);
        }
コード例 #3
0
ファイル: BatchRequest.cs プロジェクト: zhonli/odata.net
 internal BatchChangeset(BatchRequest parent)
     : this(parent, Guid.NewGuid().ToString())
 {
 }
コード例 #4
0
ファイル: BatchRequest.cs プロジェクト: zhonli/odata.net
 internal BatchChangeset(BatchRequest parent, string id)
     : base()
 {
     _parent    = parent;
     Identifier = id;
 }
コード例 #5
0
ファイル: BatchReader.cs プロジェクト: zhonli/odata.net
        public static void ParseBatchResponse(BatchResponse response)
        {
            string contentType = response.ContentType;

            string[] pieces = contentType.Split(new string[] { "; boundary=" }, StringSplitOptions.None);
            if (pieces.Length < 2)
            {
                AstoriaTestLog.FailAndThrow(String.Format("Could not retrieve boundary from response's content-type header. Value found was '{0}'", contentType));
            }
            string boundary = pieces[1].Trim();

            // even if content-id is specified, we may not get it back in error cases. This doesn't feel entirely correct, it seems like there should
            // always be a 1-1 mapping that explicitly honors content-id's

            // TODO: responses / requests without content IDs should be matched up in order within changeset only
            // changesets should have the right number of responses too

            BatchRequest batchRequest = response.Request as BatchRequest;

            List <ResponseFragment> unmatchedFragments = new List <ResponseFragment>();
            List <AstoriaRequest>   unmatchedRequests  = batchRequest.Requests
                                                         .Union(batchRequest.Changesets.SelectMany(changeset => changeset.AsEnumerable()))
                                                         .ToList();

            using (StringReader reader = new StringReader(response.Payload))
            {
                foreach (ResponseFragment fragment in ParseBatchResponse(reader, boundary))
                {
                    AstoriaRequest request = null;

                    if (fragment.ContentID != null)
                    {
                        request = unmatchedRequests
                                  .FirstOrDefault(r => r.Headers.ContainsKey("Content-ID") &&
                                                  r.Headers["Content-ID"].Equals(fragment.ContentID));
                    }

                    if (request == null)
                    {
                        unmatchedFragments.Add(fragment);
                    }
                    else
                    {
                        unmatchedRequests.Remove(request);
                        response.Responses.Add(FragmentToResponse(request, fragment));
                    }
                }
            }

            if (unmatchedFragments.Any())
            {
                if (unmatchedFragments.Count < unmatchedRequests.Count)
                {
                    AstoriaTestLog.WriteLine("Warning: recieved fewer batch response fragments than expected");
                }
                else if (unmatchedFragments.Count > unmatchedRequests.Count)
                {
                    AstoriaTestLog.FailAndThrow("Recieved more batch fragments than expected");
                }

                for (int i = 0; i < unmatchedFragments.Count; i++)
                {
                    response.Responses.Add(FragmentToResponse(unmatchedRequests[i], unmatchedFragments[i]));
                }
            }
        }