private async Task ProcessAsync(HttpPipelineMessage message, bool async) { string contentHash; using (var alg = SHA256.Create()) { using (var memoryStream = new MemoryStream()) using (var contentHashStream = new CryptoStream(memoryStream, alg, CryptoStreamMode.Write)) { if (message.Request.Content != null) { if (async) { await message.Request.Content.WriteToAsync(contentHashStream, message.Cancellation); } else { message.Request.Content.WriteTo(contentHashStream, message.Cancellation); } } } contentHash = Convert.ToBase64String(alg.Hash); } using (var hmac = new HMACSHA256(_secret)) { var uri = message.Request.UriBuilder.Uri; var host = uri.Host; var pathAndQuery = uri.PathAndQuery; string method = HttpPipelineMethodConverter.ToString(message.Request.Method); DateTimeOffset utcNow = DateTimeOffset.UtcNow; var utcNowString = utcNow.ToString("r"); var stringToSign = $"{method}\n{pathAndQuery}\n{utcNowString};{host};{contentHash}"; var signature = Convert.ToBase64String(hmac.ComputeHash(Encoding.ASCII.GetBytes(stringToSign))); // Calculate the signature string signedHeaders = "date;host;x-ms-content-sha256"; // Semicolon separated header names // TODO (pri 3): should date header writing be moved out from here? message.Request.Headers.Add("Date", utcNowString); message.Request.Headers.Add("x-ms-content-sha256", contentHash); message.Request.Headers.Add("Authorization", $"HMAC-SHA256 Credential={_credential}, SignedHeaders={signedHeaders}, Signature={signature}"); } }
public static RecordEntry Deserialize(JsonElement element) { var record = new RecordEntry(); if (element.TryGetProperty(nameof(RequestMethod), out JsonElement property)) { record.RequestMethod = HttpPipelineMethodConverter.Parse(property.GetString()); } if (element.TryGetProperty(nameof(RequestUri), out property)) { record.RequestUri = property.GetString(); } if (element.TryGetProperty(nameof(RequestHeaders), out property)) { DeserializeHeaders(record.RequestHeaders, property); } if (element.TryGetProperty(nameof(RequestBody), out property)) { record.RequestBody = DeserializeBody(record.RequestHeaders, property); } if (element.TryGetProperty(nameof(StatusCode), out property) && property.TryGetInt32(out var statusCode)) { record.StatusCode = statusCode; } if (element.TryGetProperty(nameof(ResponseHeaders), out property)) { DeserializeHeaders(record.ResponseHeaders, property); } if (element.TryGetProperty(nameof(ResponseBody), out property)) { record.ResponseBody = DeserializeBody(record.ResponseHeaders, property); } return(record); }