protected internal override ValueTask WriteContentAsync(int version, ReadOnlyMemory <byte> buffer, CancellationToken cancellationToken)
 {
     if (IsDisposed(version, out ValueTask task))
     {
         return(task);
     }
     return(_request.WriteContentAsync(buffer, cancellationToken));
 }
 public static async Task WriteContentAsync(this ValueHttpRequest request, List <string> content)
 {
     foreach (string chunk in content)
     {
         await request.WriteContentAsync(chunk).ConfigureAwait(false);
     }
 }
Example #3
0
        private async Task ClientSendHelperAsync(ValueHttpRequest client, Uri serverUri, int testIdx, TestHeadersSink requestHeaders, List <string> requestContent, TestHeadersSink?requestTrailingHeaders)
        {
            long contentLength = requestContent.Sum(x => (long)x.Length);

            client.ConfigureRequest(contentLength, hasTrailingHeaders: requestTrailingHeaders != null);
            client.WriteRequest(HttpMethod.Post, serverUri);
            client.WriteHeader("Content-Length", contentLength.ToString(CultureInfo.InvariantCulture));
            client.WriteHeader("Test-Index", testIdx.ToString(CultureInfo.InvariantCulture));
            client.WriteHeaders(requestHeaders);

            foreach (string content in requestContent)
            {
                await client.WriteContentAsync(content);
            }

            if (requestTrailingHeaders != null)
            {
                client.WriteTrailingHeaders(requestTrailingHeaders);
            }

            await client.CompleteRequestAsync();
        }
 public static ValueTask WriteContentAsync(this ValueHttpRequest request, string content) =>
 request.WriteContentAsync(Encoding.UTF8.GetBytes(content));
Example #5
0
        public override async ValueTask ProcessAsync(HttpMessage message)
        {
            var pipelineRequest = message.Request;
            var host            = pipelineRequest.Uri.Host;

            HttpMethod method = MapMethod(pipelineRequest.Method);

            Connection connection = await connectionFactory.ConnectAsync(new DnsEndPoint(host, 80));

            HttpConnection httpConnection = new Http1Connection(connection, HttpPrimitiveVersion.Version11);

            await using (ValueHttpRequest request = (await httpConnection.CreateNewRequestAsync(HttpPrimitiveVersion.Version11, HttpVersionPolicy.RequestVersionExact)).Value) {
                RequestContent pipelineContent = pipelineRequest.Content;
                long           contentLength   = 0;
                if (pipelineContent != null)
                {
                    if (!pipelineContent.TryComputeLength(out contentLength))
                    {
                        throw new NotImplementedException();
                    }
                }
                request.ConfigureRequest(contentLength: contentLength, hasTrailingHeaders: false);

                request.WriteRequest(method, pipelineRequest.Uri.ToUri());

                var pipelineHeaders = pipelineRequest.Headers;
                foreach (var header in pipelineHeaders)
                {
                    request.WriteHeader(header.Name, header.Value);
                }

                checked {
                    if (contentLength != 0)
                    {
                        using var ms = new MemoryStream((int)contentLength); // TODO: can the buffer be disposed here?
                        await pipelineContent.WriteToAsync(ms, message.CancellationToken);

                        await request.WriteContentAsync(ms.GetBuffer().AsMemory(0, (int)ms.Length));
                    }
                }

                await request.CompleteRequestAsync();

                var response = new NoAllocResponse();
                message.Response = response;

                await request.ReadToFinalResponseAsync();

                response.SetStatus((int)request.StatusCode);

                if (await request.ReadToHeadersAsync())
                {
                    await request.ReadHeadersAsync(response, state : null);
                }

                if (await request.ReadToContentAsync())
                {
                    var buffer = new byte[4096];
                    int readLen;
                    do
                    {
                        while ((readLen = await request.ReadContentAsync(buffer)) != 0)
                        {
                            if (readLen < 4096)
                            {
                                response.ContentStream = new MemoryStream(buffer, 0, readLen);
                            }
                            else
                            {
                                throw new NotImplementedException();
                            }
                        }
                    }while (await request.ReadToNextContentAsync());
                }

                if (await request.ReadToTrailingHeadersAsync())
                {
                    await request.ReadHeadersAsync(response, state : null);
                }
            }
        }