private static async Task RunTest(string baseAddress)
        {
            HttpClient client = new HttpClient();

            HttpRequestMessage batchRequest = new HttpRequestMessage(
                HttpMethod.Post,
                baseAddress + "/api/batch"
            );

            MultipartContent batchContent = new MultipartContent("batch");
            batchRequest.Content = batchContent;

            CreateBatchedRequest(baseAddress, batchContent);

            using (var stdout = Console.OpenStandardOutput())
            {
                Console.WriteLine("<<< REQUEST >>>");
                Console.WriteLine();
                Console.WriteLine(batchRequest);
                Console.WriteLine();
                await batchContent.CopyToAsync(stdout);
                Console.WriteLine();

                var batchResponse = await client.SendAsync(batchRequest);

                Console.WriteLine("<<< RESPONSE >>>");
                Console.WriteLine();
                Console.WriteLine(batchResponse);
                Console.WriteLine();
                await batchResponse.Content.CopyToAsync(stdout);
                Console.WriteLine();
                Console.WriteLine();
            }
        }
        public Task ExecuteResultAsync(ActionContext context)
        {
            var stringContent = new StringContent(statement.ToJson(format), Encoding.UTF8, MediaTypes.Application.Json);

            if (statement.Attachments.Any(x => x.Payload != null))
            {
                var multipart = new MultipartContent("mixed")
                {
                    stringContent
                };
                foreach (var attachment in statement.Attachments)
                {
                    if (attachment.Payload != null)
                    {
                        var byteArrayContent = new ByteArrayContent(attachment.Payload);
                        byteArrayContent.Headers.ContentType = new MediaTypeHeaderValue(attachment.ContentType);
                        byteArrayContent.Headers.Add(ApiHeaders.ContentTransferEncoding, "binary");
                        byteArrayContent.Headers.Add(ApiHeaders.XExperienceApiHash, attachment.SHA2);
                        multipart.Add(byteArrayContent);
                    }
                }

                return(multipart.CopyToAsync(context.HttpContext.Response.Body));
            }

            return(stringContent.CopyToAsync(context.HttpContext.Response.Body));
        }
Exemplo n.º 3
0
        public Task ExecuteResultAsync(ActionContext context)
        {
            var stringContent = new StringContent(result.ToJson(format), Encoding.UTF8, MediaTypes.Application.Json);

            var attachmentsWithPayload = result.Statements.SelectMany(x => x.Attachments.Where(a => a.Payload != null));

            if (attachmentsWithPayload.Count() > 0)
            {
                string boundary = Guid.NewGuid().ToString();
                using var multipart = new MultipartContent("mixed", boundary)
                      {
                          stringContent
                      };

                foreach (var attachment in attachmentsWithPayload)
                {
                    var byteArrayContent    = new ByteArrayContent(attachment.Payload);
                    var attachmentMediaType = MediaTypeHeaderValue.Parse(attachment.ContentType);

                    byteArrayContent.Headers.ContentType = attachmentMediaType;
                    byteArrayContent.Headers.Add(ApiHeaders.ContentTransferEncoding, "binary");
                    byteArrayContent.Headers.Add(ApiHeaders.XExperienceApiHash, attachment.SHA2);
                    multipart.Add(byteArrayContent);
                }

                // Write Content-Type header with Boundary parameter
                var mediaType = MediaTypeHeaderValue.Parse(MediaTypes.Multipart.Mixed);
                mediaType.Parameters.Add(new NameValueHeaderValue("boundary", boundary));
                context.HttpContext.Response.ContentType = mediaType.ToString();

                return(multipart.CopyToAsync(context.HttpContext.Response.Body));
            }

            return(stringContent.CopyToAsync(context.HttpContext.Response.Body));
        }
        public async Task MimeMultipartParserTestMultipartContent(string boundary)
        {
            MultipartContent content = new MultipartContent("mixed", boundary);

            content.Add(new StringContent("A"));
            content.Add(new StringContent("B"));
            content.Add(new StringContent("C"));

            MemoryStream memStream = new MemoryStream();
            await content.CopyToAsync(memStream);

            memStream.Position = 0;
            byte[] data = memStream.ToArray();

            for (var readSize = 1; readSize <= data.Length; readSize++)
            {
                MimeMultipartParser parser = CreateMimeMultipartParser(boundary);

                int                       totalBytesConsumed;
                List <string>             bodyParts;
                MimeMultipartParser.State state = ParseBufferInSteps(parser, data, readSize, out bodyParts, out totalBytesConsumed);
                Assert.Equal(MimeMultipartParser.State.BodyPartCompleted, state);
                Assert.Equal(data.Length, totalBytesConsumed);

                Assert.Equal(4, bodyParts.Count);
                Assert.Empty(bodyParts[0]);

                Assert.EndsWith("A", bodyParts[1]);
                Assert.EndsWith("B", bodyParts[2]);
                Assert.EndsWith("C", bodyParts[3]);
            }
        }
Exemplo n.º 5
0
        public void MimeMultipartParserTestMultipartContent(string boundary)
        {
            MultipartContent content = new MultipartContent("mixed", boundary);

            content.Add(new StringContent("A"));
            content.Add(new StringContent("B"));
            content.Add(new StringContent("C"));

            MemoryStream memStream = new MemoryStream();

            content.CopyToAsync(memStream).Wait();
            memStream.Position = 0;
            byte[] data = memStream.ToArray();

            for (var cnt = 1; cnt <= data.Length; cnt++)
            {
                MimeMultipartParser parser = CreateMimeMultipartParser(data.Length, boundary);
                Assert.NotNull(parser);

                int                       totalBytesConsumed;
                List <string>             bodyParts;
                MimeMultipartParser.State state = ParseBufferInSteps(parser, data, cnt, out bodyParts, out totalBytesConsumed);
                Assert.Equal(MimeMultipartParser.State.BodyPartCompleted, state);
                Assert.Equal(data.Length, totalBytesConsumed);

                Assert.Equal(4, bodyParts.Count);
                Assert.Empty(bodyParts[0]);

                Assert.True(bodyParts[1].EndsWith("A"));
                Assert.True(bodyParts[2].EndsWith("B"));
                Assert.True(bodyParts[3].EndsWith("C"));
            }
        }
Exemplo n.º 6
0
        private static async Task <string> MultipartContentToStringAsync(MultipartContent content, MultipartContentToStringMode mode, bool async)
        {
            Stream stream;

            switch (mode)
            {
            case MultipartContentToStringMode.ReadAsStreamAsync:
                stream = await content.ReadAsStreamAsync(async);

                break;

            default:
                stream = new MemoryStream();
                if (async)
                {
                    await content.CopyToAsync(stream);
                }
                else
                {
                    content.CopyTo(stream, null, default);
                }
                stream.Position = 0;
                break;
            }

            using (var reader = new StreamReader(stream))
            {
                return(await reader.ReadToEndAsync());
            }
        }
        /// <summary>
        /// Prepare an archived response based on a folder or fileStore in the response.
        /// </summary>
        /// <param name="targetStream">
        /// The target Stream.
        /// </param>
        /// <param name="resourceResponse">
        /// The resource response.
        /// </param>
        /// <param name="requestDataModelVersion">
        /// The request data model version.
        /// </param>
        /// <param name="partition">
        /// The database partition (schema) where the requested resource is stored.
        /// </param>
        ///  <param name="routeSegments">
        /// The route segments.
        /// </param>
        private void PrepareArchivedResponse(
            Stream targetStream,
            List <Thing> resourceResponse,
            Version requestDataModelVersion,
            string partition,
            dynamic routeSegments)
        {
            string folderPath = this.FileArchiveService.CreateFileStructure(resourceResponse, partition, routeSegments);

            try
            {
                var content = new MultipartContent("mixed", "----Boundary");

                using (var stream = new MemoryStream())
                {
                    this.CreateFilteredResponseStream(resourceResponse, stream, requestDataModelVersion);

                    // rewind stream prior to reading
                    stream.Position = 0;

                    // write out the json content to the first multipart content entry
                    var jsonContent = new StringContent(new StreamReader(stream).ReadToEnd());
                    jsonContent.Headers.Clear();
                    jsonContent.Headers.Add(this.ContentTypeHeader, this.MimeTypeJson);
                    content.Add(jsonContent);

                    stream.Flush();
                }

                this.FileArchiveService.CreateZipArchive(folderPath);

                byte[] buffer;
                long   fileSize;
                using (var fileStream = new FileStream(folderPath + ".zip", FileMode.Open))
                {
                    fileSize = fileStream.Length;
                    buffer   = new byte[(int)fileSize];
                    fileStream.Read(buffer, 0, (int)fileSize);
                }

                var binaryContent = new ByteArrayContent(buffer);
                binaryContent.Headers.Add(this.ContentTypeHeader, this.MimeTypeOctetStream);

                // use the file hash value to easily identify the multipart content for each respective filerevision hash entry
                binaryContent.Headers.Add(
                    ContentDispositionHeader,
                    string.Format("attachment; filename={0}", folderPath + ".zip"));
                binaryContent.Headers.Add(ContentLengthHeader, fileSize.ToString());
                content.Add(binaryContent);

                // stream the multipart content to the request contents target stream
                content.CopyToAsync(targetStream);
            }
            finally
            {
                this.FileArchiveService.DeleteFileStructureWithArchive(folderPath);
            }
        }
Exemplo n.º 8
0
        static void Main(string[] args)
        {
            var client       = new HttpClient();
            var batchRequest = new HttpRequestMessage(
                HttpMethod.Post,
                "http://fsatnav:8080/api/batch"
                );

            var batchContent = new MultipartContent("mixed");

            batchRequest.Content = batchContent;

            batchContent.Add(
                new HttpMessageContent(
                    new HttpRequestMessage(
                        HttpMethod.Get,
                        "http://localhost:8080/api/products"
                        )
                    )
                );

            batchContent.Add(
                new HttpMessageContent(
                    new HttpRequestMessage(
                        HttpMethod.Put,
                        "http://localhost:8080/api/products"
                        )
            {
                Content = new StringContent("{\"Name\":\"Product X\",\"StockQuantity\":300}", Encoding.UTF8, "application/json")
            }
                    )
                );

            using (Stream stdout = Console.OpenStandardOutput())
            {
                Console.WriteLine("<<< REQUEST >>>");
                Console.WriteLine();
                Console.WriteLine(batchRequest);
                Console.WriteLine();
                batchContent.CopyToAsync(stdout).Wait();
                Console.WriteLine();

                var batchResponse = client.SendAsync(batchRequest).Result;

                Console.WriteLine("<<< RESPONSE >>>");
                Console.WriteLine();
                Console.WriteLine(batchResponse);
                Console.WriteLine();
                batchResponse.Content.CopyToAsync(stdout).Wait();
                Console.WriteLine();
                Console.WriteLine();
            }

            Console.ReadLine();
        }
        /// <summary>
        /// Prepare a multi part response based on all included fileRevisions in the response.
        /// </summary>
        /// <param name="targetStream">
        /// The target Stream.
        /// </param>
        /// <param name="fileRevisions">
        /// The file Revisions.
        /// </param>
        /// <param name="resourceResponse">
        /// The resource response.
        /// </param>
        /// <param name="requestDataModelVersion">
        /// The request data model version.
        /// </param>
        private void PrepareMultiPartResponse(
            Stream targetStream,
            List <FileRevision> fileRevisions,
            List <Thing> resourceResponse,
            Version requestDataModelVersion)
        {
            if (!fileRevisions.Any())
            {
                // do nothing if no file revisions are present
                return;
            }

            var content = new MultipartContent("mixed", BoundaryString);

            using (var stream = new MemoryStream())
            {
                this.CreateFilteredResponseStream(resourceResponse, stream, requestDataModelVersion);

                // rewind stream prior to reading
                stream.Position = 0;

                // write out the json content to the first multipart content entry
                var jsonContent = new StringContent(new StreamReader(stream).ReadToEnd());
                jsonContent.Headers.Clear();
                jsonContent.Headers.Add(this.ContentTypeHeader, this.MimeTypeJson);
                content.Add(jsonContent);

                stream.Flush();
            }

            foreach (var hash in fileRevisions.Select(x => x.ContentHash).Distinct())
            {
                byte[] buffer;
                long   fileSize;
                using (var fileStream = this.FileBinaryService.RetrieveBinaryData(hash))
                {
                    fileSize = fileStream.Length;
                    buffer   = new byte[(int)fileSize];
                    fileStream.Read(buffer, 0, (int)fileSize);
                }

                // write out the binary content to the first multipart content entry
                var binaryContent = new ByteArrayContent(buffer);
                binaryContent.Headers.Add(this.ContentTypeHeader, this.MimeTypeOctetStream);

                // use the file hash value to easily identify the multipart content for each respective filerevision hash entry
                binaryContent.Headers.Add(ContentDispositionHeader, $"attachment; filename={hash}");
                binaryContent.Headers.Add(ContentLengthHeader, fileSize.ToString());
                content.Add(binaryContent);
            }

            // stream the multipart content to the request contents target stream
            content.CopyToAsync(targetStream).Wait();
            this.AddMultiPartMimeEndpoint(targetStream);
        }
Exemplo n.º 10
0
        static void Main(string[] args)
        {
            var client = new HttpClient();
            var batchRequest = new HttpRequestMessage(
                HttpMethod.Post,
                "http://fsatnav:8080/api/batch"
            );

            var batchContent = new MultipartContent("mixed");
            batchRequest.Content = batchContent;

            batchContent.Add(
                new HttpMessageContent(
                    new HttpRequestMessage(
                        HttpMethod.Get,
                        "http://localhost:8080/api/products"
                    )
                )
            );

            batchContent.Add(
                new HttpMessageContent(
                    new HttpRequestMessage(
                        HttpMethod.Put,
                        "http://localhost:8080/api/products"
                    )
                    {
                        Content = new StringContent("{\"Name\":\"Product X\",\"StockQuantity\":300}", Encoding.UTF8, "application/json")
                    }
                )
            );

            using (Stream stdout = Console.OpenStandardOutput())
            {
                Console.WriteLine("<<< REQUEST >>>");
                Console.WriteLine();
                Console.WriteLine(batchRequest);
                Console.WriteLine();
                batchContent.CopyToAsync(stdout).Wait();
                Console.WriteLine();

                var batchResponse = client.SendAsync(batchRequest).Result;

                Console.WriteLine("<<< RESPONSE >>>");
                Console.WriteLine();
                Console.WriteLine(batchResponse);
                Console.WriteLine();
                batchResponse.Content.CopyToAsync(stdout).Wait();
                Console.WriteLine();
                Console.WriteLine();
            }

            Console.ReadLine();
        }
Exemplo n.º 11
0
        static void Main(string[] args)
        {
            var client = new HttpClient();
            var batchRequest = new HttpRequestMessage(
                HttpMethod.Post,
                "http://localhost:52857/api/$batch"
            );

            var batchContent = new MultipartContent("mixed");
            batchRequest.Content = batchContent;

            batchContent.Add(
                new HttpMessageContent(
                    new HttpRequestMessage(
                        HttpMethod.Get,
                        "http://localhost:52857/api/TestClassOne"
                    )
                )
            );

            batchContent.Add(
                new HttpMessageContent(
                    new HttpRequestMessage(
                        HttpMethod.Get,
                        "http://localhost:52857/api/TestClassTwo"
                    )
                )
            );

            using (Stream stdout = Console.OpenStandardOutput())
            {
                Console.WriteLine("<<< REQUEST >>>");
                Console.WriteLine();
                Console.WriteLine(batchRequest);
                Console.WriteLine();
                batchContent.CopyToAsync(stdout).Wait();
                Console.WriteLine();

                var batchResponse = client.SendAsync(batchRequest).Result;

                Console.WriteLine("<<< RESPONSE >>>");
                Console.WriteLine();
                Console.WriteLine(batchResponse);
                Console.WriteLine();
                batchResponse.Content.CopyToAsync(stdout).Wait();
                Console.WriteLine();
                Console.WriteLine();
            }

            Console.ReadLine();
        }
Exemplo n.º 12
0
        public async Task MultipartContent_TryComputeLength_ReturnsSameLengthAsCopyToAsync(MultipartContent multipartContent)
        {
            Assert.True(multipartContent.TryComputeLength(out long length));

            var copyToStream = new MemoryStream();

            multipartContent.CopyTo(copyToStream, context: null, cancellationToken: default);
            Assert.Equal(length, copyToStream.Length);

            var copyToAsyncStream = new MemoryStream();
            await multipartContent.CopyToAsync(copyToAsyncStream, context : null, cancellationToken : default);

            Assert.Equal(length, copyToAsyncStream.Length);

            Assert.Equal(copyToStream.ToArray(), copyToAsyncStream.ToArray());
        }
Exemplo n.º 13
0
        public async Task ReadAsStreamAsync_Seek_JumpsToSpecifiedPosition(bool nestedContent, bool readStreamAsync)
        {
            var mc = new MultipartContent();

            if (nestedContent)
            {
                mc.Add(new ByteArrayContent(Encoding.UTF8.GetBytes("This is a ByteArrayContent")));
                mc.Add(new StringContent("This is a StringContent"));
                mc.Add(new ByteArrayContent(Encoding.UTF8.GetBytes("Another ByteArrayContent :-)")));
            }

            var memStream = new MemoryStream();
            await mc.CopyToAsync(memStream);

            byte[] buf1 = new byte[1], buf2 = new byte[1];
            using (Stream s = await mc.ReadAsStreamAsync(readStreamAsync))
            {
                var targets = new[]
                {
                    new { Origin = SeekOrigin.Begin, Offset = memStream.Length / 2 },
                    new { Origin = SeekOrigin.Begin, Offset = memStream.Length - 1 },
                    new { Origin = SeekOrigin.Begin, Offset = memStream.Length },
                    new { Origin = SeekOrigin.Begin, Offset = memStream.Length + 1 },
                    new { Origin = SeekOrigin.Begin, Offset = 0L },
                    new { Origin = SeekOrigin.Begin, Offset = 1L },

                    new { Origin = SeekOrigin.Current, Offset = 1L },
                    new { Origin = SeekOrigin.Current, Offset = 2L },
                    new { Origin = SeekOrigin.Current, Offset = -2L },
                    new { Origin = SeekOrigin.Current, Offset = 0L },
                    new { Origin = SeekOrigin.Current, Offset = 1000L },

                    new { Origin = SeekOrigin.End, Offset = 0L },
                    new { Origin = SeekOrigin.End, Offset = memStream.Length },
                    new { Origin = SeekOrigin.End, Offset = memStream.Length / 2 },
                };
                foreach (var target in targets)
                {
                    memStream.Seek(target.Offset, target.Origin);
                    s.Seek(target.Offset, target.Origin);
                    Assert.Equal(memStream.Position, s.Position);

                    Assert.Equal(memStream.Read(buf1, 0, 1), s.Read(buf2, 0, 1));
                    Assert.Equal(buf1[0], buf2[0]);
                }
            }
        }
Exemplo n.º 14
0
        public async override Task ExecuteResultAsync(ActionContext context)
        {
            EnsureArg.IsNotNull(context, nameof(context));
            var content = new MultipartContent(MultipartContentSubType);

            foreach (MultipartItem item in _multipartItems)
            {
                content.Add(item.Content);
                context.HttpContext.Response.RegisterForDispose(item);
            }

            context.HttpContext.Response.ContentLength = content.Headers.ContentLength;
            context.HttpContext.Response.ContentType   = content.Headers.ContentType.ToString();
            context.HttpContext.Response.StatusCode    = _statusCode;

            await content.CopyToAsync(context.HttpContext.Response.Body);
        }
        public async Task CompareExample()
        {
            var mw = new MultipartContent("mixed", "batch_357647d1-a6b5-4e6a-aa73-edfc88d8866e")
            {
                new HttpApplicationContent(new HttpRequestMessage(HttpMethod.Get,
                                                                  "http://localhost:12345/api/WebCustomers?Query=Parts")),
                new HttpApplicationContent(
                    new HttpRequestMessage(HttpMethod.Post, "http://localhost:12345/api/WebCustomers")
                {
                    Content = new StringContent(
                        "{\"Id\":129,\"Name\":\"Name4752cbf0-e365-43c3-aa8d-1bbc8429dbf8\"}", Encoding.UTF8,
                        "application/json")
                }),
                new HttpApplicationContent(
                    new HttpRequestMessage(HttpMethod.Put, "http://localhost:12345/api/WebCustomers/1")
                {
                    Content = new StringContent("{\"Id\":1,\"Name\":\"Peter\"}", Encoding.UTF8, "application/json")
                }),
                new HttpApplicationContent(new HttpRequestMessage(HttpMethod.Delete,
                                                                  "http://localhost:12345/api/WebCustomers/2"))
            };
            string output;

            using (var memoryStream = new MemoryStream())
            {
                await mw.CopyToAsync(memoryStream).ConfigureAwait(false);

                memoryStream.Position = 0;
                output = Encoding.ASCII.GetString(memoryStream.ToArray());
            }

            string input;

            using (var refTextStream = TestUtilities.GetNormalizedContentStream("MultipartRequest.txt"))
            {
                Assert.NotNull(refTextStream);
                input = await refTextStream.ReadAsStringAsync().ConfigureAwait(false);
            }

            Assert.Equal(input, output);
        }
Exemplo n.º 16
0
        private static async Task RunTest(string baseAddress)
        {
            HttpClient client = new HttpClient();

            HttpRequestMessage batchRequest = new HttpRequestMessage(
                HttpMethod.Post,
                baseAddress + "/api/batch"
                );

            MultipartContent batchContent = new MultipartContent("batch");

            batchRequest.Content = batchContent;

            CreateBatchedRequest(baseAddress, batchContent);

            using (var stdout = Console.OpenStandardOutput())
            {
                Console.WriteLine("<<< REQUEST >>>");
                Console.WriteLine();
                Console.WriteLine(batchRequest);
                Console.WriteLine();
                await batchContent.CopyToAsync(stdout);

                Console.WriteLine();

                var batchResponse = await client.SendAsync(batchRequest);

                Console.WriteLine("<<< RESPONSE >>>");
                Console.WriteLine();
                Console.WriteLine(batchResponse);
                Console.WriteLine();
                await batchResponse.Content.CopyToAsync(stdout);

                Console.WriteLine();
                Console.WriteLine();
            }
        }
        public override Task WriteToStreamAsync(Type type, object value, Stream writeStream, HttpContent content, TransportContext transportContext)
        {
            var boundry = Guid.NewGuid().ToString();
            var multipartFormDataContent = new MultipartContent("mixed", boundry);

            //content. .StatusCode = (int)System.Net.HttpStatusCode.OK;
            var contentType = new MediaTypeHeaderValue("multipart/mixed"); // String.Format("multipart/mixed; boundary={0}", boundry));
            var boundaryParameter = new NameValueHeaderValue("boundary", boundry);
            contentType.Parameters.Add(boundaryParameter);
            contentType.Parameters.Add(new System.Net.Http.Headers.NameValueHeaderValue("revision", "0.1"));
            content.Headers.ContentType = contentType;
            //content.Headers.Add("Accept", "multipart/mixed");
            //content.Headers.Add("MIME-Version", "1.0");

            var entities = (IEnumerable<object>)value;
            foreach (var entity in entities)
            {
                var entityContent = new ObjectContent<object>(entity, new JsonMediaTypeFormatter());
                entityContent.Headers.LastModified = DateTime.UtcNow; // Add("Last-Modified", entity.LastModified.ToUniversalTime().ToString("R"));
                entityContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/x-" + entity.GetType().Name);
                multipartFormDataContent.Add(entityContent);
            }
            return multipartFormDataContent.CopyToAsync(writeStream);
        }
 public async Task ExecuteResultAsync(ActionContext context)
 {
     await _content.CopyToAsync(context.HttpContext.Response.Body);
 }
        public void ReadAsMultipartAsync_NestedMultipartContent(string boundary)
        {
            const int nesting = 10;
            const string innerText = "Content";

            MultipartContent innerContent = new MultipartContent("mixed", boundary);
            innerContent.Add(new StringContent(innerText));
            for (var cnt = 0; cnt < nesting; cnt++)
            {
                string outerBoundary = String.Format("{0}_{1}", boundary, cnt);
                MultipartContent outerContent = new MultipartContent("mixed", outerBoundary);
                outerContent.Add(innerContent);
                innerContent = outerContent;
            }

            MemoryStream memStream = new MemoryStream();
            innerContent.CopyToAsync(memStream).Wait();
            memStream.Position = 0;
            byte[] data = memStream.ToArray();
            HttpContent content = new ByteArrayContent(data);
            content.Headers.ContentType = innerContent.Headers.ContentType;

            for (var cnt = 0; cnt < nesting + 1; cnt++)
            {
                MultipartMemoryStreamProvider result = content.ReadAsMultipartAsync().Result;
                Assert.Equal(1, result.Contents.Count);
                content = result.Contents[0];
                Assert.NotNull(content);
            }

            string text = content.ReadAsStringAsync().Result;
            Assert.Equal(innerText, text);
        }
        public void ReadAsMultipartAsync_UsingMultipartContent(string boundary)
        {
            MultipartContent content = new MultipartContent("mixed", boundary);
            content.Add(new StringContent("A"));
            content.Add(new StringContent("B"));
            content.Add(new StringContent("C"));

            MemoryStream memStream = new MemoryStream();
            content.CopyToAsync(memStream).Wait();
            memStream.Position = 0;
            byte[] data = memStream.ToArray();
            var byteContent = new ByteArrayContent(data);
            byteContent.Headers.ContentType = content.Headers.ContentType;

            MultipartMemoryStreamProvider result = byteContent.ReadAsMultipartAsync().Result;
            Assert.Equal(3, result.Contents.Count);
            Assert.Equal("A", result.Contents[0].ReadAsStringAsync().Result);
            Assert.Equal("B", result.Contents[1].ReadAsStringAsync().Result);
            Assert.Equal("C", result.Contents[2].ReadAsStringAsync().Result);
        }
        public void MimeMultipartParserTestMultipartContent(string boundary)
        {
            MultipartContent content = new MultipartContent("mixed", boundary);
            content.Add(new StringContent("A"));
            content.Add(new StringContent("B"));
            content.Add(new StringContent("C"));

            MemoryStream memStream = new MemoryStream();
            content.CopyToAsync(memStream).Wait();
            memStream.Position = 0;
            byte[] data = memStream.ToArray();

            for (var readSize = 1; readSize <= data.Length; readSize++)
            {
                MimeMultipartParser parser = CreateMimeMultipartParser(boundary);

                int totalBytesConsumed;
                List<string> bodyParts;
                MimeMultipartParser.State state = ParseBufferInSteps(parser, data, readSize, out bodyParts, out totalBytesConsumed);
                Assert.Equal(MimeMultipartParser.State.BodyPartCompleted, state);
                Assert.Equal(data.Length, totalBytesConsumed);

                Assert.Equal(4, bodyParts.Count);
                Assert.Empty(bodyParts[0]);

                Assert.True(bodyParts[1].EndsWith("A"));
                Assert.True(bodyParts[2].EndsWith("B"));
                Assert.True(bodyParts[3].EndsWith("C"));
            }
        }
        public void ReadAsMultipartAsyncNestedMultipartContentAsync(string boundary)
        {
            const int nesting = 10;
            const string innerText = "Content";

            MultipartContent innerContent = new MultipartContent("mixed", boundary);
            innerContent.Add(new StringContent(innerText));
            for (var cnt = 0; cnt < nesting; cnt++)
            {
                string outerBoundary = String.Format("{0}_{1}", boundary, cnt);
                MultipartContent outerContent = new MultipartContent("mixed", outerBoundary);
                outerContent.Add(innerContent);
                innerContent = outerContent;
            }

            MemoryStream memStream = new MemoryStream();
            innerContent.CopyToAsync(memStream).Wait();
            memStream.Position = 0;
            byte[] data = memStream.ToArray();
            HttpContent content = new ByteArrayContent(data);
            content.Headers.ContentType = innerContent.Headers.ContentType;

            for (var cnt = 0; cnt < nesting + 1; cnt++)
            {
                Task<IEnumerable<HttpContent>> task = content.ReadAsMultipartAsync();
                task.Wait(TimeoutConstant.DefaultTimeout);
                IEnumerable<HttpContent> result = task.Result;
                Assert.Equal(1, result.Count());
                content = result.ElementAt(0);
                Assert.NotNull(content);
            }

            string text = content.ReadAsStringAsync().Result;
            Assert.Equal(innerText, text);
        }
Exemplo n.º 23
0
        private static async Task<string> MultipartContentToStringAsync(MultipartContent content, MultipartContentToStringMode mode)
        {
            Stream stream;

            switch (mode)
            {
                case MultipartContentToStringMode.ReadAsStreamAsync:
                    stream = await content.ReadAsStreamAsync();
                    break;

                default:
                    stream = new MemoryStream();
                    await content.CopyToAsync(stream);
                    stream.Position = 0;
                    break;
            }

            using (var reader = new StreamReader(stream))
            {
                return await reader.ReadToEndAsync();
            }
        }
Exemplo n.º 24
0
        public async Task ReadAsStreamAsync_Seek_JumpsToSpecifiedPosition(bool nestedContent)
        {
            var mc = new MultipartContent();
            if (nestedContent)
            {
                mc.Add(new ByteArrayContent(Encoding.UTF8.GetBytes("This is a ByteArrayContent")));
                mc.Add(new StringContent("This is a StringContent"));
                mc.Add(new ByteArrayContent(Encoding.UTF8.GetBytes("Another ByteArrayContent :-)")));
            }

            var memStream = new MemoryStream();
            await mc.CopyToAsync(memStream);

            byte[] buf1 = new byte[1], buf2 = new byte[1];
            using (Stream s = await mc.ReadAsStreamAsync())
            {
                var targets = new[]
                {
                    new { Origin = SeekOrigin.Begin, Offset = memStream.Length / 2 },
                    new { Origin = SeekOrigin.Begin, Offset = memStream.Length - 1 },
                    new { Origin = SeekOrigin.Begin, Offset = memStream.Length },
                    new { Origin = SeekOrigin.Begin, Offset = memStream.Length + 1 },
                    new { Origin = SeekOrigin.Begin, Offset = 0L },
                    new { Origin = SeekOrigin.Begin, Offset = 1L },

                    new { Origin = SeekOrigin.Current, Offset = 1L },
                    new { Origin = SeekOrigin.Current, Offset = 2L },
                    new { Origin = SeekOrigin.Current, Offset = -2L },
                    new { Origin = SeekOrigin.Current, Offset = 0L },
                    new { Origin = SeekOrigin.Current, Offset = 1000L },

                    new { Origin = SeekOrigin.End, Offset = 0L },
                    new { Origin = SeekOrigin.End, Offset = memStream.Length },
                    new { Origin = SeekOrigin.End, Offset = memStream.Length / 2 },
                };
                foreach (var target in targets)
                {
                    memStream.Seek(target.Offset, target.Origin);
                    s.Seek(target.Offset, target.Origin);
                    Assert.Equal(memStream.Position, s.Position);

                    Assert.Equal(memStream.Read(buf1, 0, 1), s.Read(buf2, 0, 1));
                    Assert.Equal(buf1[0], buf2[0]);
                }
            }
        }
        public void ReadAsMultipartAsyncUsingMultipartContentAsync(string boundary)
        {
            MultipartContent content = new MultipartContent("mixed", boundary);
            content.Add(new StringContent("A"));
            content.Add(new StringContent("B"));
            content.Add(new StringContent("C"));

            MemoryStream memStream = new MemoryStream();
            content.CopyToAsync(memStream).Wait();
            memStream.Position = 0;
            byte[] data = memStream.ToArray();
            var byteContent = new ByteArrayContent(data);
            byteContent.Headers.ContentType = content.Headers.ContentType;

            Task<IEnumerable<HttpContent>> task = byteContent.ReadAsMultipartAsync();
            task.Wait(TimeoutConstant.DefaultTimeout);
            IEnumerable<HttpContent> result = task.Result;
            Assert.Equal(3, result.Count());
            Assert.Equal("A", result.ElementAt(0).ReadAsStringAsync().Result);
            Assert.Equal("B", result.ElementAt(1).ReadAsStringAsync().Result);
            Assert.Equal("C", result.ElementAt(2).ReadAsStringAsync().Result);
        }
Exemplo n.º 26
0
        public override async Task ExecuteResultAsync(IWebDavResponse response, CancellationToken ct)
        {
            await base.ExecuteResultAsync(response, ct);

            response.Headers["Accept-Ranges"] = new[] { "bytes" };

            var properties = await _document.GetProperties(response.Dispatcher).ToList(ct);

            var etagProperty = properties.OfType <GetETagProperty>().FirstOrDefault();

            if (etagProperty != null)
            {
                var propValue = await etagProperty.GetValueAsync(ct);

                response.Headers["ETag"] = new[] { propValue.ToString() };
            }

            if (!_returnFile)
            {
                var lastModifiedProp = properties.OfType <LastModifiedProperty>().FirstOrDefault();
                if (lastModifiedProp != null)
                {
                    var propValue = await lastModifiedProp.GetValueAsync(ct);

                    response.Headers["Last-Modified"] = new[] { propValue.ToString("R") };
                }

                return;
            }

            var views = new List <StreamView>();

            try
            {
                foreach (var rangeItem in _rangeItems)
                {
                    var baseStream = await _document.OpenReadAsync(ct);

                    var streamView = await StreamView
                                     .CreateAsync(baseStream, rangeItem.From, rangeItem.Length, ct)
                    ;

                    views.Add(streamView);
                }

                string contentType;
                var    contentTypeProp = properties.OfType <GetContentTypeProperty>().FirstOrDefault();
                if (contentTypeProp != null)
                {
                    contentType = await contentTypeProp.GetValueAsync(ct);
                }
                else
                {
                    contentType = MimeTypesMap.DefaultMimeType;
                }

                if (_rangeItems.Count == 1)
                {
                    // No multipart content
                    var rangeItem  = _rangeItems.Single();
                    var streamView = views.Single();
                    using (var streamContent = new StreamContent(streamView))
                    {
                        streamContent.Headers.ContentRange = new ContentRangeHeaderValue(
                            rangeItem.From,
                            rangeItem.To,
                            _document.Length);
                        streamContent.Headers.ContentLength = rangeItem.Length;

                        streamContent.Headers.ContentType = MediaTypeHeaderValue.Parse(contentType);

                        await SetPropertiesToContentHeaderAsync(streamContent, properties, ct)
                        ;

                        foreach (var header in streamContent.Headers)
                        {
                            response.Headers.Add(header.Key, header.Value.ToArray());
                        }

                        // Use the CopyToAsync function of the stream itself, because
                        // we're able to pass the cancellation token. This is a workaround
                        // for issue dotnet/corefx#9071 and fixes FubarDevelopment/WebDavServer#47.
                        await streamView.CopyToAsync(response.Body, 81920, ct)
                        ;
                    }
                }
                else
                {
                    // Multipart content
                    using (var multipart = new MultipartContent("byteranges"))
                    {
                        var index = 0;
                        foreach (var rangeItem in _rangeItems)
                        {
                            var streamView  = views[index++];
                            var partContent = new StreamContent(streamView);
                            partContent.Headers.ContentRange = new ContentRangeHeaderValue(
                                rangeItem.From,
                                rangeItem.To,
                                _document.Length);
                            partContent.Headers.ContentType   = MediaTypeHeaderValue.Parse(contentType);
                            partContent.Headers.ContentLength = rangeItem.Length;
                            multipart.Add(partContent);
                        }

                        await SetPropertiesToContentHeaderAsync(multipart, properties, ct)
                        ;

                        foreach (var header in multipart.Headers)
                        {
                            response.Headers.Add(header.Key, header.Value.ToArray());
                        }

                        // TODO: Workaround for issue dotnet/corefx#9071
                        await multipart.CopyToAsync(response.Body);
                    }
                }
            }
            finally
            {
                foreach (var streamView in views)
                {
                    streamView.Dispose();
                }
            }
        }