<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic RE: API - AWS S3 in Product Forum</title>
    <link>https://community.blueprism.com/t5/Product-Forum/API-AWS-S3/m-p/57538#M11523</link>
    <description>Hi,&lt;BR /&gt;&lt;BR /&gt;Thanks for responding.&lt;BR /&gt;&lt;BR /&gt;Response Code is :-&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN style="background-color: #ffffff;"&gt;HTTP Status Code: 403&lt;BR /&gt;HTTP Response Content: SignatureDoesNotMatch&lt;BR /&gt;The request signature we calculated does not match the signature you provided. Check your key and signing method.&lt;BR /&gt;&lt;BR /&gt;Thanks&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;------------------------------&lt;BR /&gt;Dan Lister&lt;BR /&gt;Developer&lt;BR /&gt;Arvato&lt;BR /&gt;Europe/London&lt;BR /&gt;------------------------------&lt;BR /&gt;</description>
    <pubDate>Tue, 04 Feb 2020 08:42:00 GMT</pubDate>
    <dc:creator>Dan.Lister</dc:creator>
    <dc:date>2020-02-04T08:42:00Z</dc:date>
    <item>
      <title>API - AWS S3</title>
      <link>https://community.blueprism.com/t5/Product-Forum/API-AWS-S3/m-p/57536#M11521</link>
      <description>Hi Guys,&amp;nbsp;&lt;BR /&gt;&lt;BR /&gt;I'm trying to setup a Web API for AWS S3, but i'm struggling to get a response.&amp;nbsp;&lt;BR /&gt;&lt;BR /&gt;I've got it working using Postman, but I'm getting the error SignatureDoesNotMatch when using BP.&lt;BR /&gt;&lt;BR /&gt;I have downloaded and tweaked the AWS:Rekognition API to try and get this to work, but I don't think my Authorization Header is correct. I am using the code stage provided with the API to generation the header, with a couple of tweaks, but I'm not sure i'm doing it correctly.&lt;BR /&gt;&lt;BR /&gt;
&lt;DIV class="media" style="overflow: hidden; zoom: 1;"&gt;
&lt;DIV class="media" style="overflow: hidden; zoom: 1;"&gt;
&lt;DIV class="media" style="overflow: hidden; zoom: 1;"&gt;&lt;span class="lia-inline-image-display-wrapper" image-alt="13235.png"&gt;&lt;img src="https://community.blueprism.com/t5/image/serverpage/image-id/13398iFBEB4FCC4783C7C4/image-size/large?v=v2&amp;amp;px=999" role="button" title="13235.png" alt="13235.png" /&gt;&lt;/span&gt;&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;BR /&gt;&lt;BR /&gt;Has anyone done this before or can anyone point me in the right direction?&lt;BR /&gt;&lt;BR /&gt;Thanks&lt;BR /&gt;&lt;BR /&gt;------------------------------&lt;BR /&gt;Dan Lister&lt;BR /&gt;Developer&lt;BR /&gt;Europe/London&lt;BR /&gt;------------------------------&lt;BR /&gt;</description>
      <pubDate>Mon, 03 Feb 2020 12:55:00 GMT</pubDate>
      <guid>https://community.blueprism.com/t5/Product-Forum/API-AWS-S3/m-p/57536#M11521</guid>
      <dc:creator>Dan.Lister</dc:creator>
      <dc:date>2020-02-03T12:55:00Z</dc:date>
    </item>
    <item>
      <title>RE: API - AWS S3</title>
      <link>https://community.blueprism.com/t5/Product-Forum/API-AWS-S3/m-p/57537#M11522</link>
      <description>Hi,&lt;BR /&gt;&lt;BR /&gt;What is the response code and message that you get from AWS?&lt;BR /&gt;&lt;BR /&gt;------------------------------&lt;BR /&gt;Shashank Kumar&lt;BR /&gt;DX Integrations Partner Consultant&lt;BR /&gt;Blue Prism&lt;BR /&gt;Singapore&lt;BR /&gt;+6581326707&lt;BR /&gt;------------------------------&lt;BR /&gt;</description>
      <pubDate>Tue, 04 Feb 2020 08:35:00 GMT</pubDate>
      <guid>https://community.blueprism.com/t5/Product-Forum/API-AWS-S3/m-p/57537#M11522</guid>
      <dc:creator>shashank.kumar280</dc:creator>
      <dc:date>2020-02-04T08:35:00Z</dc:date>
    </item>
    <item>
      <title>RE: API - AWS S3</title>
      <link>https://community.blueprism.com/t5/Product-Forum/API-AWS-S3/m-p/57538#M11523</link>
      <description>Hi,&lt;BR /&gt;&lt;BR /&gt;Thanks for responding.&lt;BR /&gt;&lt;BR /&gt;Response Code is :-&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN style="background-color: #ffffff;"&gt;HTTP Status Code: 403&lt;BR /&gt;HTTP Response Content: SignatureDoesNotMatch&lt;BR /&gt;The request signature we calculated does not match the signature you provided. Check your key and signing method.&lt;BR /&gt;&lt;BR /&gt;Thanks&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;------------------------------&lt;BR /&gt;Dan Lister&lt;BR /&gt;Developer&lt;BR /&gt;Arvato&lt;BR /&gt;Europe/London&lt;BR /&gt;------------------------------&lt;BR /&gt;</description>
      <pubDate>Tue, 04 Feb 2020 08:42:00 GMT</pubDate>
      <guid>https://community.blueprism.com/t5/Product-Forum/API-AWS-S3/m-p/57538#M11523</guid>
      <dc:creator>Dan.Lister</dc:creator>
      <dc:date>2020-02-04T08:42:00Z</dc:date>
    </item>
    <item>
      <title>RE: API - AWS S3</title>
      <link>https://community.blueprism.com/t5/Product-Forum/API-AWS-S3/m-p/57539#M11524</link>
      <description>Hi Dan,&lt;BR /&gt;&lt;BR /&gt;It seems the signature passed from the vbo isn't matching with the POSTMAN request. Would you be able to share the screenshot of POSTMAN and the web api file?&lt;BR /&gt;&lt;BR /&gt;------------------------------&lt;BR /&gt;Shashank Kumar&lt;BR /&gt;DX Integrations Partner Consultant&lt;BR /&gt;Blue Prism&lt;BR /&gt;Singapore&lt;BR /&gt;+6581326707&lt;BR /&gt;------------------------------&lt;BR /&gt;</description>
      <pubDate>Tue, 04 Feb 2020 12:52:00 GMT</pubDate>
      <guid>https://community.blueprism.com/t5/Product-Forum/API-AWS-S3/m-p/57539#M11524</guid>
      <dc:creator>shashank.kumar280</dc:creator>
      <dc:date>2020-02-04T12:52:00Z</dc:date>
    </item>
    <item>
      <title>RE: API - AWS S3</title>
      <link>https://community.blueprism.com/t5/Product-Forum/API-AWS-S3/m-p/57540#M11525</link>
      <description>Hi,&amp;nbsp;&lt;BR /&gt;&lt;BR /&gt;I'm afraid I can't attach the Web API file, but here is the Postman Screenshot:&lt;BR /&gt;&lt;BR /&gt;
&lt;DIV class="media" style="overflow: hidden; zoom: 1;"&gt;&lt;span class="lia-inline-image-display-wrapper" image-alt="13224.png"&gt;&lt;img src="https://community.blueprism.com/t5/image/serverpage/image-id/13383iD7FBEFFDAF495219/image-size/large?v=v2&amp;amp;px=999" role="button" title="13224.png" alt="13224.png" /&gt;&lt;/span&gt;&lt;/DIV&gt;
&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;Thanks&lt;BR /&gt;&lt;BR /&gt;------------------------------&lt;BR /&gt;Dan Lister&lt;BR /&gt;Developer&lt;BR /&gt;Arvato&lt;BR /&gt;Europe/London&lt;BR /&gt;------------------------------&lt;BR /&gt;</description>
      <pubDate>Tue, 04 Feb 2020 14:44:00 GMT</pubDate>
      <guid>https://community.blueprism.com/t5/Product-Forum/API-AWS-S3/m-p/57540#M11525</guid>
      <dc:creator>Dan.Lister</dc:creator>
      <dc:date>2020-02-04T14:44:00Z</dc:date>
    </item>
    <item>
      <title>RE: API - AWS S3</title>
      <link>https://community.blueprism.com/t5/Product-Forum/API-AWS-S3/m-p/57541#M11526</link>
      <description>Hi,&amp;nbsp;&lt;BR /&gt;&lt;BR /&gt;I've just realised that I hadn't edited the Global Code on that object and it looks that this is set up for a POST request. I've tried tweaking again, but my knowledge just isn't good enough to understand and ensure I'm doing it correctly.&lt;BR /&gt;&lt;BR /&gt;I've been trying to follow this guide, but having no luck.&amp;nbsp;&lt;A title="AWS" href="https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html" target="_blank" rel="noopener"&gt;https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html&lt;/A&gt;&lt;BR /&gt;&lt;BR /&gt;Can anyone help?&lt;BR /&gt;&lt;BR /&gt;Thanks&lt;BR /&gt;&lt;BR /&gt;Global Code&lt;BR /&gt;
&lt;PRE class="language-csharp"&gt;&lt;SPAN class="token comment" spellcheck="true"&gt;// SHA256 hash of an empty request body&lt;/SPAN&gt;
&lt;SPAN class="token keyword"&gt;public&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt; EMPTY_BODY_SHA256 &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="token string"&gt;"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;

&lt;SPAN class="token keyword"&gt;public&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt; SCHEME &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="token string"&gt;"AWS4"&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="token keyword"&gt;public&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt; ALGORITHM &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="token string"&gt;"HMAC-SHA256"&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="token keyword"&gt;public&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt; TERMINATOR &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="token string"&gt;"aws4_request"&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;

&lt;SPAN class="token comment" spellcheck="true"&gt;// format strings for the date/time and date stamps required during signing&lt;/SPAN&gt;
&lt;SPAN class="token keyword"&gt;public&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt; ISO8601BasicFormat &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="token string"&gt;"yyyyMMddTHHmmssZ"&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="token keyword"&gt;public&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt; DateStringFormat &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="token string"&gt;"yyyyMMdd"&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;

&lt;SPAN class="token comment" spellcheck="true"&gt;// some common x-amz-* parameters&lt;/SPAN&gt;
&lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt; X_Amz_Algorithm &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="token string"&gt;"X-Amz-Algorithm"&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt; X_Amz_Credential &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="token string"&gt;"X-Amz-Credential"&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt; X_Amz_SignedHeaders &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="token string"&gt;"X-Amz-SignedHeaders"&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt; X_Amz_Date &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="token string"&gt;"X-Amz-Date"&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt; X_Amz_Signature &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="token string"&gt;"X-Amz-Signature"&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt; X_Amz_Expires &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="token string"&gt;"X-Amz-Expires"&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt; X_Amz_Content_SHA256 &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="token string"&gt;"X-Amz-Content-SHA256"&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt; X_Amz_Decoded_Content_Length &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="token string"&gt;"X-Amz-Decoded-Content-Length"&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt; X_Amz_Meta_UUID &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="token string"&gt;"X-Amz-Meta-UUID"&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;

&lt;SPAN class="token comment" spellcheck="true"&gt;// the name of the keyed hash algorithm used in signing&lt;/SPAN&gt;
&lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt; HMACSHA256 &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="token string"&gt;"HMACSHA256"&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;

Regex CompressWhitespaceRegex &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;new&lt;/SPAN&gt; &lt;SPAN class="token class-name"&gt;Regex&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token string"&gt;"\\s+"&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;

&lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt; strAction &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="token string"&gt;"POST"&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
Uri uri&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;

HashAlgorithm CanonicalRequestHashAlgorithm &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; HashAlgorithm&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;Create&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token string"&gt;"SHA-256"&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;

&lt;SPAN class="token keyword"&gt;public&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt; &lt;SPAN class="token function"&gt;ComputeSignature&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;IDictionary&lt;SPAN class="token operator"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt;&lt;SPAN class="token operator"&gt;&amp;gt;&lt;/SPAN&gt; headers&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt;
                            &lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt; dateTimeStamp&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt;   
			    &lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt; queryParameters&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt;
                            &lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt; bodyHash&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt;
                            &lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt; awsAccessKey&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt;
                            &lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt; awsSecretKey&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt;
			    &lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt; awsUri&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt;
			    &lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt; awsRegion&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt;
			    &lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt; awsService&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;
&lt;SPAN class="token punctuation"&gt;{&lt;/SPAN&gt;
    
	&lt;SPAN class="token comment" spellcheck="true"&gt;// first get the date and time for the subsequent request, and convert to ISO 8601 format&lt;/SPAN&gt;
    &lt;SPAN class="token comment" spellcheck="true"&gt;// for use in signature generation&lt;/SPAN&gt;
    &lt;SPAN class="token keyword"&gt;var&lt;/SPAN&gt; requestDateTime &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; DateTime&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;UtcNow&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;

    &lt;SPAN class="token comment" spellcheck="true"&gt;// update the headers with required 'x-amz-date' and 'host' values&lt;/SPAN&gt;
    headers&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;Add&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;X_Amz_Date&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt; dateTimeStamp&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;

    uri &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;new&lt;/SPAN&gt; &lt;SPAN class="token class-name"&gt;Uri&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;awsUri&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
	&lt;SPAN class="token keyword"&gt;var&lt;/SPAN&gt; hostHeader &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; uri&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;Host&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
    &lt;SPAN class="token keyword"&gt;if&lt;/SPAN&gt; &lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token operator"&gt;!&lt;/SPAN&gt;uri&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;IsDefaultPort&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;
        hostHeader &lt;SPAN class="token operator"&gt;+&lt;/SPAN&gt;&lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="token string"&gt;":"&lt;/SPAN&gt; &lt;SPAN class="token operator"&gt;+&lt;/SPAN&gt; uri&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;Port&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
    headers&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;Add&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token string"&gt;"Host"&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt; hostHeader&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;

    &lt;SPAN class="token comment" spellcheck="true"&gt;// canonicalize the headers; we need the set of header names as well as the&lt;/SPAN&gt;
    &lt;SPAN class="token comment" spellcheck="true"&gt;// names and values to go into the signature process&lt;/SPAN&gt;
    &lt;SPAN class="token keyword"&gt;var&lt;/SPAN&gt; canonicalizedHeaderNames &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="token function"&gt;CanonicalizeHeaderNames&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;headers&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
    &lt;SPAN class="token keyword"&gt;var&lt;/SPAN&gt; canonicalizedHeaders &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="token function"&gt;CanonicalizeHeaders&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;headers&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;

    &lt;SPAN class="token comment" spellcheck="true"&gt;// canonicalize the various components of the request&lt;/SPAN&gt;
    &lt;SPAN class="token keyword"&gt;var&lt;/SPAN&gt; canonicalRequest &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="token function"&gt;CanonicalizeRequest&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;uri&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt;
                                               strAction&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt;
                                               &lt;SPAN class="token keyword"&gt;null&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt;
                                               canonicalizedHeaderNames&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt;
                                               canonicalizedHeaders&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt;
                                               bodyHash&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;

    &lt;SPAN class="token comment" spellcheck="true"&gt;// generate a hash of the canonical request, to go into signature computation&lt;/SPAN&gt;
    &lt;SPAN class="token keyword"&gt;var&lt;/SPAN&gt; canonicalRequestHashBytes
        &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; CanonicalRequestHashAlgorithm&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;ComputeHash&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;Encoding&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;UTF8&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;GetBytes&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;canonicalRequest&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;

    &lt;SPAN class="token comment" spellcheck="true"&gt;// construct the string to be signed&lt;/SPAN&gt;
    &lt;SPAN class="token keyword"&gt;var&lt;/SPAN&gt; stringToSign &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;new&lt;/SPAN&gt; &lt;SPAN class="token class-name"&gt;StringBuilder&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;

    &lt;SPAN class="token keyword"&gt;var&lt;/SPAN&gt; dateStamp &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; requestDateTime&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;ToString&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;DateStringFormat&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt; CultureInfo&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;InvariantCulture&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
    &lt;SPAN class="token keyword"&gt;var&lt;/SPAN&gt; scope &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;Format&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token string"&gt;"{0}/{1}/{2}/{3}"&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt;
                              dateStamp&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt;
                              awsRegion&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt;
                              awsService&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt;
                              TERMINATOR&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;

    stringToSign&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;AppendFormat&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token string"&gt;"{0}-{1}\n{2}\n{3}\n"&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt; SCHEME&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt; ALGORITHM&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt; dateTimeStamp&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt; scope&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
    stringToSign&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;Append&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;ToHexString&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;canonicalRequestHashBytes&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;true&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;

    &lt;SPAN class="token comment" spellcheck="true"&gt;// compute the signing key&lt;/SPAN&gt;
    &lt;SPAN class="token keyword"&gt;var&lt;/SPAN&gt; kha &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; KeyedHashAlgorithm&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;Create&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;HMACSHA256&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
    kha&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;Key &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="token function"&gt;DeriveSigningKey&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;HMACSHA256&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt; awsSecretKey&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt; awsRegion&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt; dateStamp&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt; awsService&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;

    &lt;SPAN class="token comment" spellcheck="true"&gt;// compute the AWS4 signature and return it&lt;/SPAN&gt;
    &lt;SPAN class="token keyword"&gt;var&lt;/SPAN&gt; signature &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; kha&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;ComputeHash&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;Encoding&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;UTF8&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;GetBytes&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;stringToSign&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;ToString&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
    &lt;SPAN class="token keyword"&gt;var&lt;/SPAN&gt; signatureString &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="token function"&gt;ToHexString&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;signature&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;true&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
    &lt;SPAN class="token comment" spellcheck="true"&gt;//Console.WriteLine("\nSignature:\n{0}", signatureString);&lt;/SPAN&gt;

    &lt;SPAN class="token keyword"&gt;var&lt;/SPAN&gt; authString &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;new&lt;/SPAN&gt; &lt;SPAN class="token class-name"&gt;StringBuilder&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
    authString&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;AppendFormat&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token string"&gt;"{0}-{1} "&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt; SCHEME&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt; ALGORITHM&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
    authString&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;AppendFormat&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token string"&gt;"Credential={0}/{1}, "&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt; awsAccessKey&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt; scope&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
    authString&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;AppendFormat&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token string"&gt;"SignedHeaders={0}, "&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt; canonicalizedHeaderNames&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
    authString&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;AppendFormat&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token string"&gt;"Signature={0}"&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt; signatureString&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;

    &lt;SPAN class="token keyword"&gt;var&lt;/SPAN&gt; authorization &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; authString&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;ToString&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;

    &lt;SPAN class="token keyword"&gt;return&lt;/SPAN&gt; authorization&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="token punctuation"&gt;}&lt;/SPAN&gt;
&lt;SPAN class="token keyword"&gt;public&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt; &lt;SPAN class="token function"&gt;CanonicalizeRequest&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;Uri endpointUri&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt;
                             &lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt; httpMethod&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt;
                             &lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt; queryParameters&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt;
                             &lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt; canonicalizedHeaderNames&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt;
                             &lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt; canonicalizedHeaders&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt;
                             &lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt; bodyHash&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;
&lt;SPAN class="token punctuation"&gt;{&lt;/SPAN&gt;
    &lt;SPAN class="token keyword"&gt;var&lt;/SPAN&gt; canonicalRequest &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;new&lt;/SPAN&gt; &lt;SPAN class="token class-name"&gt;StringBuilder&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;

    canonicalRequest&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;AppendFormat&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token string"&gt;"{0}\n"&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt; httpMethod&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
    canonicalRequest&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;AppendFormat&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token string"&gt;"{0}\n"&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt; &lt;SPAN class="token function"&gt;CanonicalResourcePath&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;endpointUri&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
    canonicalRequest&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;AppendFormat&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token string"&gt;"{0}\n"&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt; queryParameters&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;

    canonicalRequest&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;AppendFormat&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token string"&gt;"{0}\n"&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt; canonicalizedHeaders&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
    canonicalRequest&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;AppendFormat&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token string"&gt;"{0}\n"&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt; canonicalizedHeaderNames&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;

    canonicalRequest&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;Append&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;bodyHash&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;

    &lt;SPAN class="token keyword"&gt;return&lt;/SPAN&gt; canonicalRequest&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;ToString&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="token punctuation"&gt;}&lt;/SPAN&gt;
&lt;SPAN class="token keyword"&gt;public&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt; &lt;SPAN class="token function"&gt;CanonicalResourcePath&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;Uri endpointUri&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;
&lt;SPAN class="token punctuation"&gt;{&lt;/SPAN&gt;
    &lt;SPAN class="token keyword"&gt;if&lt;/SPAN&gt; &lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;IsNullOrEmpty&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;endpointUri&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;AbsolutePath&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;
        &lt;SPAN class="token keyword"&gt;return&lt;/SPAN&gt; &lt;SPAN class="token string"&gt;"/"&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;

    &lt;SPAN class="token comment" spellcheck="true"&gt;// encode the path per RFC3986&lt;/SPAN&gt;
    &lt;SPAN class="token keyword"&gt;return&lt;/SPAN&gt; &lt;SPAN class="token function"&gt;UrlEncode&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;endpointUri&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;AbsolutePath&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;true&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="token punctuation"&gt;}&lt;/SPAN&gt;
&lt;SPAN class="token keyword"&gt;public&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;byte&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;[&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;]&lt;/SPAN&gt; &lt;SPAN class="token function"&gt;DeriveSigningKey&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt; algorithm&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt; awsSecretAccessKey&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt; awsRegion&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt; date&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt; awsService&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;
&lt;SPAN class="token punctuation"&gt;{&lt;/SPAN&gt;
    &lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt; ksecretPrefix &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; SCHEME&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
    &lt;SPAN class="token keyword"&gt;char&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;[&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;]&lt;/SPAN&gt; ksecret &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;null&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;

    ksecret &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;ksecretPrefix &lt;SPAN class="token operator"&gt;+&lt;/SPAN&gt; awsSecretAccessKey&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;ToCharArray&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;

    &lt;SPAN class="token keyword"&gt;byte&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;[&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;]&lt;/SPAN&gt; hashDate &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="token function"&gt;ComputeKeyedHash&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;algorithm&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt; Encoding&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;UTF8&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;GetBytes&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;ksecret&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt; Encoding&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;UTF8&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;GetBytes&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;date&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
    &lt;SPAN class="token keyword"&gt;byte&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;[&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;]&lt;/SPAN&gt; hashRegion &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="token function"&gt;ComputeKeyedHash&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;algorithm&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt; hashDate&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt; Encoding&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;UTF8&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;GetBytes&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;awsRegion&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
    &lt;SPAN class="token keyword"&gt;byte&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;[&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;]&lt;/SPAN&gt; hashService &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="token function"&gt;ComputeKeyedHash&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;algorithm&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt; hashRegion&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt; Encoding&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;UTF8&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;GetBytes&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;awsService&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
    &lt;SPAN class="token keyword"&gt;return&lt;/SPAN&gt; &lt;SPAN class="token function"&gt;ComputeKeyedHash&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;algorithm&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt; hashService&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt; Encoding&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;UTF8&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;GetBytes&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;TERMINATOR&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="token punctuation"&gt;}&lt;/SPAN&gt;
&lt;SPAN class="token keyword"&gt;public&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;byte&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;[&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;]&lt;/SPAN&gt; &lt;SPAN class="token function"&gt;ComputeKeyedHash&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt; algorithm&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;byte&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;[&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;]&lt;/SPAN&gt; key&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;byte&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;[&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;]&lt;/SPAN&gt; data&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;
&lt;SPAN class="token punctuation"&gt;{&lt;/SPAN&gt;
    &lt;SPAN class="token keyword"&gt;var&lt;/SPAN&gt; kha &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; KeyedHashAlgorithm&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;Create&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;algorithm&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
    kha&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;Key &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; key&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
    &lt;SPAN class="token keyword"&gt;return&lt;/SPAN&gt; kha&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;ComputeHash&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;data&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="token punctuation"&gt;}&lt;/SPAN&gt;
&lt;SPAN class="token keyword"&gt;public&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt; &lt;SPAN class="token function"&gt;CanonicalizeHeaderNames&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;IDictionary&lt;SPAN class="token operator"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt;&lt;SPAN class="token operator"&gt;&amp;gt;&lt;/SPAN&gt; headers&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;
&lt;SPAN class="token punctuation"&gt;{&lt;/SPAN&gt;
    &lt;SPAN class="token keyword"&gt;var&lt;/SPAN&gt; headersToSign &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;new&lt;/SPAN&gt; &lt;SPAN class="token class-name"&gt;List&lt;/SPAN&gt;&lt;SPAN class="token operator"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt;&lt;SPAN class="token operator"&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;headers&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;Keys&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
    headersToSign&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;Sort&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;StringComparer&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;OrdinalIgnoreCase&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;

    &lt;SPAN class="token keyword"&gt;var&lt;/SPAN&gt; sb &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;new&lt;/SPAN&gt; &lt;SPAN class="token class-name"&gt;StringBuilder&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
    &lt;SPAN class="token keyword"&gt;foreach&lt;/SPAN&gt; &lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token keyword"&gt;var&lt;/SPAN&gt; header &lt;SPAN class="token keyword"&gt;in&lt;/SPAN&gt; headersToSign&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;
    &lt;SPAN class="token punctuation"&gt;{&lt;/SPAN&gt;
        &lt;SPAN class="token keyword"&gt;if&lt;/SPAN&gt; &lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;sb&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;Length &lt;SPAN class="token operator"&gt;&amp;gt;&lt;/SPAN&gt; &lt;SPAN class="token number"&gt;0&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;
            sb&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;Append&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token string"&gt;";"&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
        sb&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;Append&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;header&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;ToLower&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
    &lt;SPAN class="token punctuation"&gt;}&lt;/SPAN&gt;
    &lt;SPAN class="token keyword"&gt;return&lt;/SPAN&gt; sb&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;ToString&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="token punctuation"&gt;}&lt;/SPAN&gt;
&lt;SPAN class="token keyword"&gt;public&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt; &lt;SPAN class="token function"&gt;CanonicalizeHeaders&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;IDictionary&lt;SPAN class="token operator"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt;&lt;SPAN class="token operator"&gt;&amp;gt;&lt;/SPAN&gt; headers&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;
&lt;SPAN class="token punctuation"&gt;{&lt;/SPAN&gt;
    &lt;SPAN class="token keyword"&gt;if&lt;/SPAN&gt; &lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;headers &lt;SPAN class="token operator"&gt;==&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;null&lt;/SPAN&gt; &lt;SPAN class="token operator"&gt;||&lt;/SPAN&gt; headers&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;Count &lt;SPAN class="token operator"&gt;==&lt;/SPAN&gt; &lt;SPAN class="token number"&gt;0&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;
        &lt;SPAN class="token keyword"&gt;return&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;Empty&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;

    &lt;SPAN class="token comment" spellcheck="true"&gt;// step1: sort the headers into lower-case format; we create a new&lt;/SPAN&gt;
    &lt;SPAN class="token comment" spellcheck="true"&gt;// map to ensure we can do a subsequent key lookup using a lower-case&lt;/SPAN&gt;
    &lt;SPAN class="token comment" spellcheck="true"&gt;// key regardless of how 'headers' was created.&lt;/SPAN&gt;
    &lt;SPAN class="token keyword"&gt;var&lt;/SPAN&gt; sortedHeaderMap &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;new&lt;/SPAN&gt; &lt;SPAN class="token class-name"&gt;SortedDictionary&lt;/SPAN&gt;&lt;SPAN class="token operator"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt;&lt;SPAN class="token operator"&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
    &lt;SPAN class="token keyword"&gt;foreach&lt;/SPAN&gt; &lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token keyword"&gt;var&lt;/SPAN&gt; header &lt;SPAN class="token keyword"&gt;in&lt;/SPAN&gt; headers&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;Keys&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;
    &lt;SPAN class="token punctuation"&gt;{&lt;/SPAN&gt;
        sortedHeaderMap&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;Add&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;header&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;ToLower&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt; headers&lt;SPAN class="token punctuation"&gt;[&lt;/SPAN&gt;header&lt;SPAN class="token punctuation"&gt;]&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
    &lt;SPAN class="token punctuation"&gt;}&lt;/SPAN&gt;

    &lt;SPAN class="token comment" spellcheck="true"&gt;// step2: form the canonical header:value entries in sorted order. &lt;/SPAN&gt;
    &lt;SPAN class="token comment" spellcheck="true"&gt;// Multiple white spaces in the values should be compressed to a single &lt;/SPAN&gt;
    &lt;SPAN class="token comment" spellcheck="true"&gt;// space.&lt;/SPAN&gt;
    &lt;SPAN class="token keyword"&gt;var&lt;/SPAN&gt; sb &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;new&lt;/SPAN&gt; &lt;SPAN class="token class-name"&gt;StringBuilder&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
    &lt;SPAN class="token keyword"&gt;foreach&lt;/SPAN&gt; &lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token keyword"&gt;var&lt;/SPAN&gt; header &lt;SPAN class="token keyword"&gt;in&lt;/SPAN&gt; sortedHeaderMap&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;Keys&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;
    &lt;SPAN class="token punctuation"&gt;{&lt;/SPAN&gt;
        &lt;SPAN class="token keyword"&gt;var&lt;/SPAN&gt; headerValue &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; CompressWhitespaceRegex&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;Replace&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;sortedHeaderMap&lt;SPAN class="token punctuation"&gt;[&lt;/SPAN&gt;header&lt;SPAN class="token punctuation"&gt;]&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt; &lt;SPAN class="token string"&gt;" "&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
        sb&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;AppendFormat&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token string"&gt;"{0}:{1}\n"&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt; header&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt; headerValue&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;Trim&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
    &lt;SPAN class="token punctuation"&gt;}&lt;/SPAN&gt;

    &lt;SPAN class="token keyword"&gt;return&lt;/SPAN&gt; sb&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;ToString&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="token punctuation"&gt;}&lt;/SPAN&gt;
&lt;SPAN class="token keyword"&gt;public&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt; &lt;SPAN class="token function"&gt;UrlEncode&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt; data&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;bool&lt;/SPAN&gt; isPath &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;false&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;
&lt;SPAN class="token punctuation"&gt;{&lt;/SPAN&gt;
    &lt;SPAN class="token comment" spellcheck="true"&gt;// The Set of accepted and valid Url characters per RFC3986. Characters outside of this set will be encoded.&lt;/SPAN&gt;
    &lt;SPAN class="token keyword"&gt;const&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt; validUrlCharacters &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="token string"&gt;"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~"&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;

    &lt;SPAN class="token keyword"&gt;var&lt;/SPAN&gt; encoded &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;new&lt;/SPAN&gt; &lt;SPAN class="token class-name"&gt;StringBuilder&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;data&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;Length &lt;SPAN class="token operator"&gt;*&lt;/SPAN&gt; &lt;SPAN class="token number"&gt;2&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
    &lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt; unreservedChars &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; String&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;Concat&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;validUrlCharacters&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt; &lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;isPath &lt;SPAN class="token operator"&gt;?&lt;/SPAN&gt; &lt;SPAN class="token string"&gt;"/:"&lt;/SPAN&gt; &lt;SPAN class="token punctuation"&gt;:&lt;/SPAN&gt; &lt;SPAN class="token string"&gt;""&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;

    &lt;SPAN class="token keyword"&gt;foreach&lt;/SPAN&gt; &lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token keyword"&gt;char&lt;/SPAN&gt; symbol &lt;SPAN class="token keyword"&gt;in&lt;/SPAN&gt; System&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;Text&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;Encoding&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;UTF8&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;GetBytes&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;data&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;
    &lt;SPAN class="token punctuation"&gt;{&lt;/SPAN&gt;
        &lt;SPAN class="token keyword"&gt;if&lt;/SPAN&gt; &lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;unreservedChars&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;IndexOf&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;symbol&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt; &lt;SPAN class="token operator"&gt;!=&lt;/SPAN&gt; &lt;SPAN class="token operator"&gt;-&lt;/SPAN&gt;&lt;SPAN class="token number"&gt;1&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;
            encoded&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;Append&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;symbol&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
        &lt;SPAN class="token keyword"&gt;else&lt;/SPAN&gt;
            encoded&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;Append&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token string"&gt;"%"&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;Append&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;String&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;Format&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token string"&gt;"{0:X2}"&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt; &lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token keyword"&gt;int&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;symbol&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
    &lt;SPAN class="token punctuation"&gt;}&lt;/SPAN&gt;

    &lt;SPAN class="token keyword"&gt;return&lt;/SPAN&gt; encoded&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;ToString&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="token punctuation"&gt;}&lt;/SPAN&gt;
&lt;SPAN class="token keyword"&gt;public&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt; &lt;SPAN class="token function"&gt;ToHexString&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token keyword"&gt;byte&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;[&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;]&lt;/SPAN&gt; data&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;bool&lt;/SPAN&gt; lowercase&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;
&lt;SPAN class="token punctuation"&gt;{&lt;/SPAN&gt;
    &lt;SPAN class="token keyword"&gt;var&lt;/SPAN&gt; sb &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;new&lt;/SPAN&gt; &lt;SPAN class="token class-name"&gt;StringBuilder&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
    &lt;SPAN class="token keyword"&gt;for&lt;/SPAN&gt; &lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token keyword"&gt;var&lt;/SPAN&gt; i &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="token number"&gt;0&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt; i &lt;SPAN class="token operator"&gt;&amp;lt;&lt;/SPAN&gt; data&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;Length&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt; i&lt;SPAN class="token operator"&gt;++&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;
    &lt;SPAN class="token punctuation"&gt;{&lt;/SPAN&gt;
        sb&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;Append&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;data&lt;SPAN class="token punctuation"&gt;[&lt;/SPAN&gt;i&lt;SPAN class="token punctuation"&gt;]&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;ToString&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;lowercase &lt;SPAN class="token operator"&gt;?&lt;/SPAN&gt; &lt;SPAN class="token string"&gt;"x2"&lt;/SPAN&gt; &lt;SPAN class="token punctuation"&gt;:&lt;/SPAN&gt; &lt;SPAN class="token string"&gt;"X2"&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
    &lt;SPAN class="token punctuation"&gt;}&lt;/SPAN&gt;
    &lt;SPAN class="token keyword"&gt;return&lt;/SPAN&gt; sb&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;ToString&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="token punctuation"&gt;}&lt;/SPAN&gt;​&lt;/PRE&gt;
&lt;BR /&gt;AuthSignature Code Stage&lt;BR /&gt;&lt;BR /&gt;
&lt;PRE class="language-csharp"&gt;&lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt; strBody &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; RequestBody&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;

&lt;SPAN class="token comment" spellcheck="true"&gt;// precompute hash of the body content            &lt;/SPAN&gt;
&lt;SPAN class="token keyword"&gt;var&lt;/SPAN&gt; contentHash &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; CanonicalRequestHashAlgorithm&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;ComputeHash&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;Encoding&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;UTF8&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;GetBytes&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;strBody&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="token keyword"&gt;var&lt;/SPAN&gt; contentHashString &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="token function"&gt;ToHexString&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;contentHash&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;true&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;

&lt;SPAN class="token keyword"&gt;var&lt;/SPAN&gt; requestDateTime &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; DateTime&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;UtcNow&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="token keyword"&gt;var&lt;/SPAN&gt; dateTimeStamp &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; requestDateTime&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;ToString&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;ISO8601BasicFormat&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt; CultureInfo&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;InvariantCulture&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;
strAuthDate &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; dateTimeStamp&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;

&lt;SPAN class="token keyword"&gt;var&lt;/SPAN&gt; headers &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;new&lt;/SPAN&gt; &lt;SPAN class="token class-name"&gt;Dictionary&lt;/SPAN&gt;&lt;SPAN class="token operator"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;string&lt;/SPAN&gt;&lt;SPAN class="token operator"&gt;&amp;gt;&lt;/SPAN&gt;
            &lt;SPAN class="token punctuation"&gt;{&lt;/SPAN&gt;
                &lt;SPAN class="token punctuation"&gt;{&lt;/SPAN&gt;&lt;SPAN class="token string"&gt;"content-type"&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt; &lt;SPAN class="token string"&gt;"application/x-amz-json-1.1"&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;}&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt;
                &lt;SPAN class="token punctuation"&gt;{&lt;/SPAN&gt;&lt;SPAN class="token string"&gt;"x-amz-target"&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt; AWSTarget&lt;SPAN class="token punctuation"&gt;}&lt;/SPAN&gt;
            &lt;SPAN class="token punctuation"&gt;}&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;

strAuthSignature &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="token function"&gt;ComputeSignature&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;headers&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt;
       			      dateTimeStamp&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt;
                              &lt;SPAN class="token string"&gt;""&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt;   &lt;SPAN class="token comment" spellcheck="true"&gt;// no query parameters&lt;/SPAN&gt;
                              contentHashString&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt;
                              AccessID&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt;
                              SecretKey&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt;
                              AWSEndpoint&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt;
			      AWSRegion&lt;SPAN class="token punctuation"&gt;,&lt;/SPAN&gt;
                              AWSService&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;​&lt;/PRE&gt;&lt;BR /&gt;&lt;BR /&gt;------------------------------&lt;BR /&gt;Dan Lister&lt;BR /&gt;Developer&lt;BR /&gt;Arvato&lt;BR /&gt;Europe/London&lt;BR /&gt;------------------------------&lt;BR /&gt;</description>
      <pubDate>Wed, 05 Feb 2020 10:24:00 GMT</pubDate>
      <guid>https://community.blueprism.com/t5/Product-Forum/API-AWS-S3/m-p/57541#M11526</guid>
      <dc:creator>Dan.Lister</dc:creator>
      <dc:date>2020-02-05T10:24:00Z</dc:date>
    </item>
  </channel>
</rss>

