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); } }
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));
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); } } }