tools/test-proxy/sample-clients/net/storage-blob/Program.cs (169 lines of code) (raw):

using Azure.Core; using Azure.Core.Pipeline; using Azure.Storage.Blobs; using System; using System.IO; using System.Linq; using System.Net.Http; using System.Text; using System.Threading.Tasks; namespace Azure.Sdk.Tools.TestProxy.StorageBlobSample { class Program { private static readonly string _connectionString = Environment.GetEnvironmentVariable("STORAGE_CONNECTION_STRING"); private static readonly string _containerName = "net-storage-blob-sample" + Guid.NewGuid().ToString(); private const string _blobName = "sample"; private static readonly Uri _proxy = new Uri("https://localhost:5001"); private static readonly string _recordingFile = "recordings/net-storage-blob-sample.json"; private static readonly HttpClient _httpClient = new HttpClient(new HttpClientHandler() { ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => true }); private static readonly HttpPipelineTransport _httpClientTransport = new HttpClientTransport(_httpClient); static async Task Main(string[] args) { Console.WriteLine($"Recording File: {_recordingFile}"); Console.WriteLine(); var serviceClient = new BlobServiceClient(_connectionString); var containerClient = serviceClient.GetBlobContainerClient(_containerName); var blobClient = containerClient.GetBlobClient(_blobName); try { // Create container and upload blob await containerClient.CreateIfNotExistsAsync(); await blobClient.UploadAsync(new MemoryStream(Encoding.UTF8.GetBytes("sample"))); // Download blob directly from service await SendRequest(_httpClientTransport); await Record(); await Playback(); } finally { await containerClient.DeleteIfExistsAsync(); } } private static async Task Record() { var recordingId = await StartRecording(); var transport = new TestProxyTransport(new HttpClientTransport(_httpClient), _proxy.Host, _proxy.Port, recordingId, "record"); await SendRequest(transport); await Task.Delay(TimeSpan.FromSeconds(2)); await SendRequest(transport); await StopRecording(recordingId); } private static async Task Playback() { var recordingId = await StartPlayback(); var transport = new TestProxyTransport(new HttpClientTransport(_httpClient), _proxy.Host, _proxy.Port, recordingId, "playback"); await SendRequest(transport); await SendRequest(transport); await StopPlayback(recordingId); } private static async Task<string> StartPlayback() { Console.WriteLine("StartPlayback"); var message = new HttpRequestMessage(HttpMethod.Post, _proxy + "playback/start"); var json = "{\"x-recording-file\":\"" + _recordingFile + "\"}"; var content = new System.Net.Http.StringContent(json, Encoding.UTF8, "application/json"); message.Content = content; var response = await _httpClient.SendAsync(message); var recordingId = response.Headers.GetValues("x-recording-id").Single(); Console.WriteLine($" x-recording-id: {recordingId}"); Console.WriteLine(); return recordingId; } private static async Task StopPlayback(string recordingId) { Console.WriteLine("StopPlayback"); Console.WriteLine(); var message = new HttpRequestMessage(HttpMethod.Post, _proxy + "playback/stop"); message.Headers.Add("x-recording-id", recordingId); await _httpClient.SendAsync(message); } private static async Task<string> StartRecording() { Console.WriteLine("StartRecording"); var message = new HttpRequestMessage(HttpMethod.Post, _proxy + "record/start"); var json = "{\"x-recording-file\":\"" + _recordingFile + "\"}"; var content = new System.Net.Http.StringContent(json, Encoding.UTF8, "application/json"); message.Content = content; var response = await _httpClient.SendAsync(message); var recordingId = response.Headers.GetValues("x-recording-id").Single(); Console.WriteLine($" x-recording-id: {recordingId}"); Console.WriteLine(); return recordingId; } private static async Task StopRecording(string recordingId) { Console.WriteLine("StopRecording"); Console.WriteLine(); var message = new HttpRequestMessage(HttpMethod.Post, _proxy + "record/stop"); message.Headers.Add("x-recording-id", recordingId); message.Headers.Add("x-recording-save", bool.TrueString); await _httpClient.SendAsync(message); } private static async Task SendRequest(HttpPipelineTransport transport) { Console.WriteLine("Request"); var serviceClient = new BlobServiceClient(_connectionString, new BlobClientOptions() { Transport = transport, }); var containerClient = serviceClient.GetBlobContainerClient(_containerName); var blobClient = containerClient.GetBlobClient(_blobName); var stream = new MemoryStream(); var response = await blobClient.DownloadToAsync(stream); Console.WriteLine("Headers:"); Console.WriteLine($" Date: {response.Headers.Date.Value.LocalDateTime}"); Console.WriteLine($"Content: {Encoding.UTF8.GetString(stream.ToArray())}"); Console.WriteLine(); } private 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; message.Request.Uri.Scheme = _proxy.Scheme; if (_port.HasValue) { message.Request.Uri.Port = _port.Value; } } } private class TestClientOptions : ClientOptions { } } }