tools/test-proxy/sample-clients/net/http-pipeline/Azure.Sdk.Tools.TestProxy.HttpPipelineSample/TestProxyTransport.cs (57 lines of code) (raw):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Azure.Core.Pipeline;
using Azure.Core;
namespace Azure.Sdk.Tools.TestProxy.HttpPipelineSample
{
/// <summary>
/// This is a custom transport implementation that will automatically redirect requests to the TestProxy.
///
/// Test implementors will pass this transport to the class they are testing, so that their recordings can work.
/// </summary>
public class TestProxyTransport : HttpPipelineTransport
{
private readonly HttpPipelineTransport _transport;
private readonly string _host;
private readonly int? _port;
private readonly string _recordingId;
private readonly string _mode;
public TestProxyTransport(HttpPipelineTransport transport, string host, int? port, string recordingId, string mode)
{
_transport = transport;
_host = host;
_port = port;
_recordingId = recordingId;
_mode = mode;
}
public override Request CreateRequest()
{
return _transport.CreateRequest();
}
public override void Process(HttpMessage message)
{
RedirectToTestProxy(message);
_transport.Process(message);
}
public override ValueTask ProcessAsync(HttpMessage message)
{
RedirectToTestProxy(message);
return _transport.ProcessAsync(message);
}
private void RedirectToTestProxy(HttpMessage message)
{
message.Request.Headers.Add("x-recording-id", _recordingId);
message.Request.Headers.Add("x-recording-mode", _mode);
var baseUri = new RequestUriBuilder()
{
Scheme = message.Request.Uri.Scheme,
Host = message.Request.Uri.Host,
Port = message.Request.Uri.Port,
};
message.Request.Headers.Add("x-recording-upstream-base-uri", baseUri.ToString());
message.Request.Uri.Host = _host;
if (_port.HasValue)
{
message.Request.Uri.Port = _port.Value;
}
}
}
}