< Summary

Class:Azure.Core.Pipeline.HttpPipeline
Assembly:Azure.Core
File(s):C:\Git\azure-sdk-for-net\sdk\core\Azure.Core\src\Pipeline\HttpPipeline.cs
Covered lines:25
Uncovered lines:0
Coverable lines:25
Total lines:130
Line coverage:100% (25 of 25)
Covered branches:5
Total branches:6
Branch coverage:83.3% (5 of 6)

Metrics

MethodCyclomatic complexity Line coverage Branch coverage
.ctor(...)-100%83.33%
CreateRequest()-100%100%
CreateMessage()-100%100%
get_ResponseClassifier()-100%100%
SendAsync(...)-100%100%
Send(...)-100%100%
SendRequestAsync()-100%100%
SendRequest(...)-100%100%
CreateClientRequestIdScope(...)-100%100%

File(s)

C:\Git\azure-sdk-for-net\sdk\core\Azure.Core\src\Pipeline\HttpPipeline.cs

#LineLine coverage
 1// Copyright (c) Microsoft Corporation. All rights reserved.
 2// Licensed under the MIT License.
 3
 4using System;
 5using System.Threading;
 6using System.Threading.Tasks;
 7
 8namespace Azure.Core.Pipeline
 9{
 10    /// <summary>
 11    /// Represents a primitive for sending HTTP requests and receiving responses extensible by adding <see cref="HttpPip
 12    /// </summary>
 13    public class HttpPipeline
 14    {
 15        private readonly HttpPipelineTransport _transport;
 16
 17        private readonly ReadOnlyMemory<HttpPipelinePolicy> _pipeline;
 18
 19        /// <summary>
 20        /// Creates a new instance of <see cref="HttpPipeline"/> with the provided transport, policies and response clas
 21        /// </summary>
 22        /// <param name="transport">The <see cref="HttpPipelineTransport"/> to use for sending the requests.</param>
 23        /// <param name="policies">Policies to be invoked as part of the pipeline in order.</param>
 24        /// <param name="responseClassifier">The response classifier to be used in invocations.</param>
 134825        public HttpPipeline(HttpPipelineTransport transport, HttpPipelinePolicy[]? policies = null, ResponseClassifier? 
 26        {
 134827            _transport = transport ?? throw new ArgumentNullException(nameof(transport));
 134828            ResponseClassifier = responseClassifier ?? new ResponseClassifier();
 29
 134830            policies = policies ?? Array.Empty<HttpPipelinePolicy>();
 31
 134832            var all = new HttpPipelinePolicy[policies.Length + 1];
 134833            all[policies.Length] = new HttpPipelineTransportPolicy(_transport);
 134834            policies.CopyTo(all, 0);
 35
 134836            _pipeline = all;
 134837        }
 38
 39        /// <summary>
 40        /// Creates a new <see cref="Request"/> instance.
 41        /// </summary>
 42        /// <returns>The request.</returns>
 43        public Request CreateRequest()
 293844            => _transport.CreateRequest();
 45
 46        /// <summary>
 47        /// Creates a new <see cref="HttpMessage"/> instance.
 48        /// </summary>
 49        /// <returns>The message.</returns>
 50        public HttpMessage CreateMessage()
 51        {
 246452            return new HttpMessage(CreateRequest(), ResponseClassifier);
 53        }
 54
 55        /// <summary>
 56        /// The <see cref="ResponseClassifier"/> instance used in this pipeline invocations.
 57        /// </summary>
 256058        public ResponseClassifier ResponseClassifier { get; }
 59
 60        /// <summary>
 61        /// Invokes the pipeline asynchronously. After the task completes response would be set to the <see cref="HttpMe
 62        /// </summary>
 63        /// <param name="message">The <see cref="HttpMessage"/> to send.</param>
 64        /// <param name="cancellationToken">The <see cref="CancellationToken"/> to use.</param>
 65        /// <returns>The <see cref="ValueTask"/> representing the asynchronous operation.</returns>
 66        public ValueTask SendAsync(HttpMessage message, CancellationToken cancellationToken)
 67        {
 150268            message.CancellationToken = cancellationToken;
 150269            return _pipeline.Span[0].ProcessAsync(message, _pipeline.Slice(1));
 70        }
 71
 72        /// <summary>
 73        /// Invokes the pipeline synchronously. After the task completes response would be set to the <see cref="HttpMes
 74        /// </summary>
 75        /// <param name="message">The <see cref="HttpMessage"/> to send.</param>
 76        /// <param name="cancellationToken">The <see cref="CancellationToken"/> to use.</param>
 77        public void Send(HttpMessage message, CancellationToken cancellationToken)
 78        {
 146279            message.CancellationToken = cancellationToken;
 146280            _pipeline.Span[0].Process(message, _pipeline.Slice(1));
 122281        }
 82        /// <summary>
 83        /// Invokes the pipeline asynchronously with the provided request.
 84        /// </summary>
 85        /// <param name="request">The <see cref="Request"/> to send.</param>
 86        /// <param name="cancellationToken">The <see cref="CancellationToken"/> to use.</param>
 87        /// <returns>The <see cref="ValueTask{T}"/> representing the asynchronous operation.</returns>
 88        public async ValueTask<Response> SendRequestAsync(Request request, CancellationToken cancellationToken)
 89        {
 6890            HttpMessage message = new HttpMessage(request, ResponseClassifier);
 6891            await SendAsync(message, cancellationToken).ConfigureAwait(false);
 6892            return message.Response;
 6893        }
 94
 95        /// <summary>
 96        /// Invokes the pipeline synchronously with the provided request.
 97        /// </summary>
 98        /// <param name="request">The <see cref="Request"/> to send.</param>
 99        /// <param name="cancellationToken">The <see cref="CancellationToken"/> to use.</param>
 100        /// <returns>The <see cref="Response"/> from the server.</returns>
 101        public Response SendRequest(Request request, CancellationToken cancellationToken)
 102        {
 28103            HttpMessage message = new HttpMessage(request, ResponseClassifier);
 28104            Send(message, cancellationToken);
 28105            return message.Response;
 106        }
 107
 108        /// <summary>
 109        /// Creates a scope in which all outgoing requests would use the provided
 110        /// </summary>
 111        /// <param name="clientRequestId">The client request id value to be sent with request.</param>
 112        /// <returns>The <see cref="IDisposable"/> instance that needs to be disposed when client request id shouldn't b
 113        /// <example>
 114        /// Sample usage:
 115        /// <code snippet="Snippet:ClientRequestId">
 116        /// var secretClient = new SecretClient(new Uri(&quot;http://example.com&quot;), new DefaultAzureCredential());
 117        ///
 118        /// using (HttpPipeline.CreateClientRequestIdScope(&quot;&lt;custom-client-request-id&gt;&quot;))
 119        /// {
 120        ///     // The HTTP request resulting from the client call would have x-ms-client-request-id value set to &lt;cu
 121        ///     secretClient.GetSecret(&quot;&lt;secret-name&gt;&quot;);
 122        /// }
 123        /// </code>
 124        /// </example>
 125        public static IDisposable CreateClientRequestIdScope(string? clientRequestId)
 126        {
 10127            return ReadClientRequestIdPolicy.StartScope(clientRequestId);
 128        }
 129    }
 130}