Ejemplo n.º 1
0
        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}");
            }
        }
Ejemplo n.º 2
0
        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);
        }