The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
<!DOCTYPE html
     PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<!--
This file was generated by Devel::Cover Version 0.93
Devel::Cover is copyright 2001-2012, Paul Johnson (paul@pjcj.net)
Devel::Cover is free. It is licensed under the same terms as Perl itself.
The latest version of Devel::Cover should be available from my homepage:
http://www.pjcj.net
-->
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
    <meta http-equiv="Content-Language" content="en-us"></meta>
    <link rel="stylesheet" type="text/css" href="cover.css"></link>
    <link rel="stylesheet" type="text/css" href="cover.css"></link>
    <title>File Coverage: blib/lib/Net/Amazon/SignatureVersion4.pm</title>
</head>
<body>
<h1>File Coverage</h1>
<table>
<tr><td class="h" align="right">File:</td><td align="left">blib/lib/Net/Amazon/SignatureVersion4.pm</td></tr>
<tr><td class="h" align="right">Coverage:</td><td align="left" class="c2">96.0%</td></tr>
</table>
<div><br/></div>
<table>
<tr><th>line</th><th>stmt</th><th>bran</th><th>cond</th><th>sub</th><th>pod</th><th>time</th><th>code</th></tr>
<tr><td class="h">1</td><td><div class="c3">4</div><div class="c3">4</div><div class="c3">4</div></td><td></td><td></td><td><div class="c3"><a href="blib-lib-Net-Amazon-SignatureVersion4-pm--subroutine.html#L1">4</a></div></td><td></td><td><div>245661</div><div>4</div><div>96</div></td><td class="s">use strict;</td></tr>
<tr><td class="h">2</td><td><div class="c3">4</div><div class="c3">4</div><div class="c3">4</div></td><td></td><td></td><td><div class="c3"><a href="blib-lib-Net-Amazon-SignatureVersion4-pm--subroutine.html#L2">4</a></div></td><td></td><td><div>10</div><div>6</div><div>208</div></td><td class="s">use warnings;</td></tr>
<tr><td class="h">3</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">package Net::Amazon::SignatureVersion4;</td></tr>
<tr><td class="h">4</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">{</td></tr>
<tr><td class="h">5</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;$Net::Amazon::SignatureVersion4::VERSION = &#39;0.004&#39;;</td></tr>
<tr><td class="h">6</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
<tr><td class="h">7</td><td><div class="c3">4</div><div class="c3">4</div><div class="c3">4</div></td><td></td><td></td><td><div class="c3"><a href="blib-lib-Net-Amazon-SignatureVersion4-pm--subroutine.html#L7">4</a></div></td><td></td><td><div>1971</div><div>6617090</div><div>110</div></td><td class="s">use MooseX::App qw(Config);</td></tr>
<tr><td class="h">8</td><td><div class="c3">4</div><div class="c3">4</div><div class="c3">4</div></td><td></td><td></td><td><div class="c3"><a href="blib-lib-Net-Amazon-SignatureVersion4-pm--subroutine.html#L8">4</a></div></td><td></td><td><div>6182229</div><div>9334</div><div>319</div></td><td class="s">use Digest::SHA qw(sha256_hex hmac_sha256_hex hmac_sha256 hmac_sha256_base64);</td></tr>
<tr><td class="h">9</td><td><div class="c3">4</div><div class="c3">4</div><div class="c3">4</div></td><td></td><td></td><td><div class="c3"><a href="blib-lib-Net-Amazon-SignatureVersion4-pm--subroutine.html#L9">4</a></div></td><td></td><td><div>1206</div><div>10085</div><div>95</div></td><td class="s">use POSIX qw(strftime);</td></tr>
<tr><td class="h">10</td><td><div class="c3">4</div><div class="c3">4</div><div class="c3">4</div></td><td></td><td></td><td><div class="c3"><a href="blib-lib-Net-Amazon-SignatureVersion4-pm--subroutine.html#L10">4</a></div></td><td></td><td><div>4598</div><div>33957</div><div>137</div></td><td class="s">use URI::Encode;</td></tr>
<tr><td class="h">11</td><td><div class="c3">4</div><div class="c3">4</div><div class="c3">4</div></td><td></td><td></td><td><div class="c3"><a href="blib-lib-Net-Amazon-SignatureVersion4-pm--subroutine.html#L11">4</a></div></td><td></td><td><div>868</div><div>9144</div><div>189</div></td><td class="s">use HTTP::Date;</td></tr>
<tr><td class="h">12</td><td><div class="c3">4</div><div class="c3">4</div><div class="c3">4</div></td><td></td><td></td><td><div class="c3"><a href="blib-lib-Net-Amazon-SignatureVersion4-pm--subroutine.html#L12">4</a></div></td><td></td><td><div>74</div><div>9</div><div>1643</div></td><td class="s">use 5.010;</td></tr>
<tr><td class="h">13</td><td colspan="7"></td></tr><tr><td class="h">14</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"># ABSTRACT: Signs requests using Amazon&#39;s Signature Version 4.</td></tr>
<tr><td class="h">15</td><td colspan="7"></td></tr><tr><td class="h">16</td><td colspan="7"></td></tr><tr><td class="h">17</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">option &#39;Access_Key_Id&#39; =&gt; (</td></tr>
<tr><td class="h">18</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;is        =&gt; &#39;rw&#39;,</td></tr>
<tr><td class="h">19</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;isa       =&gt; &#39;Str&#39;,</td></tr>
<tr><td class="h">20</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;reader    =&gt; &#39;get_Access_Key_ID&#39;,</td></tr>
<tr><td class="h">21</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;predicate =&gt; &#39;has_Access_Key_ID&#39;,</td></tr>
<tr><td class="h">22</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;writer    =&gt; &#39;set_Access_Key_ID&#39;,</td></tr>
<tr><td class="h">23</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;);</td></tr>
<tr><td class="h">24</td><td colspan="7"></td></tr><tr><td class="h">25</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">option &#39;Secret_Access_Key&#39; =&gt; (</td></tr>
<tr><td class="h">26</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;is        =&gt; &#39;rw&#39;,</td></tr>
<tr><td class="h">27</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;isa       =&gt; &#39;Str&#39;,</td></tr>
<tr><td class="h">28</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;reader    =&gt; &#39;get_Secret_Access_Key&#39;,</td></tr>
<tr><td class="h">29</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;predicate =&gt; &#39;has_Secret_Access_Key&#39;,</td></tr>
<tr><td class="h">30</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;writer    =&gt; &#39;set_Secret_Access_Key&#39;,</td></tr>
<tr><td class="h">31</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;);</td></tr>
<tr><td class="h">32</td><td colspan="7"></td></tr><tr><td class="h">33</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">option &#39;region&#39; =&gt; (</td></tr>
<tr><td class="h">34</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;is      =&gt; &#39;rw&#39;,</td></tr>
<tr><td class="h">35</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;isa     =&gt; &#39;Str&#39;,</td></tr>
<tr><td class="h">36</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;writer  =&gt; &#39;set_region&#39;,</td></tr>
<tr><td class="h">37</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;reader  =&gt; &#39;get_region&#39;,</td></tr>
<tr><td class="h">38</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;default =&gt; &#39;us-east-1&#39;,</td></tr>
<tr><td class="h">39</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;);</td></tr>
<tr><td class="h">40</td><td colspan="7"></td></tr><tr><td class="h">41</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">option &#39;request&#39; =&gt; (</td></tr>
<tr><td class="h">42</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;is      =&gt; &#39;rw&#39;,</td></tr>
<tr><td class="h">43</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;isa     =&gt; &#39;Object&#39;,</td></tr>
<tr><td class="h">44</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;writer  =&gt; &#39;set_request&#39;,</td></tr>
<tr><td class="h">45</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;reader  =&gt; &#39;get_request&#39;,</td></tr>
<tr><td class="h">46</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;);</td></tr>
<tr><td class="h">47</td><td colspan="7"></td></tr><tr><td class="h">48</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">option &#39;service&#39; =&gt; (</td></tr>
<tr><td class="h">49</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;is      =&gt; &#39;rw&#39;,</td></tr>
<tr><td class="h">50</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;isa     =&gt; &#39;Str&#39;,</td></tr>
<tr><td class="h">51</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;writer  =&gt; &#39;set_service&#39;,</td></tr>
<tr><td class="h">52</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;reader  =&gt; &#39;get_service&#39;,</td></tr>
<tr><td class="h">53</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;);</td></tr>
<tr><td class="h">54</td><td colspan="7"></td></tr><tr><td class="h">55</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">option &#39;time&#39; =&gt; (</td></tr>
<tr><td class="h">56</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;is      =&gt; &#39;rw&#39;,</td></tr>
<tr><td class="h">57</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;isa     =&gt; &#39;Str&#39;,</td></tr>
<tr><td class="h">58</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;writer  =&gt; &#39;set_time&#39;,</td></tr>
<tr><td class="h">59</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;reader  =&gt; &#39;get_time&#39;,</td></tr>
<tr><td class="h">60</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;);</td></tr>
<tr><td class="h">61</td><td colspan="7"></td></tr><tr><td class="h">62</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">option &#39;date_stamp&#39; =&gt; (</td></tr>
<tr><td class="h">63</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;is      =&gt; &#39;rw&#39;,</td></tr>
<tr><td class="h">64</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;isa     =&gt; &#39;Str&#39;,</td></tr>
<tr><td class="h">65</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;writer  =&gt; &#39;set_date_stamp&#39;,</td></tr>
<tr><td class="h">66</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;reader  =&gt; &#39;get_date_stamp&#39;,</td></tr>
<tr><td class="h">67</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;);</td></tr>
<tr><td class="h">68</td><td colspan="7"></td></tr><tr><td class="h">69</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">option &#39;signed_headers&#39; =&gt; (</td></tr>
<tr><td class="h">70</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;is      =&gt; &#39;rw&#39;,</td></tr>
<tr><td class="h">71</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;isa     =&gt; &#39;Str&#39;,</td></tr>
<tr><td class="h">72</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;writer  =&gt; &#39;set_signed_headers&#39;,</td></tr>
<tr><td class="h">73</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;reader  =&gt; &#39;get_signed_headers&#39;,</td></tr>
<tr><td class="h">74</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;);</td></tr>
<tr><td class="h">75</td><td colspan="7"></td></tr><tr><td class="h">76</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">sub get_authorized_request{</td></tr>
<tr><td class="h">77</td><td colspan="7"></td></tr><tr><td class="h">78</td><td><div class="c3">30</div></td><td></td><td></td><td><div class="c3"><a href="blib-lib-Net-Amazon-SignatureVersion4-pm--subroutine.html#L78">30</a></div></td><td></td><td><div>23864</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;my $self=shift;</td></tr>
<tr><td class="h">79</td><td><div class="c3">30</div></td><td></td><td></td><td></td><td></td><td><div>1963</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;my $request=$self-&gt;get_request();</td></tr>
<tr><td class="h">80</td><td><div class="c3">30</div></td><td></td><td></td><td></td><td></td><td><div>68</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;$request-&gt;header( Authorization =&gt; $self-&gt;get_authorization() );</td></tr>
<tr><td class="h">81</td><td><div class="c3">30</div></td><td></td><td></td><td></td><td></td><td><div>3136</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;return $request</td></tr>
<tr><td class="h">82</td><td colspan="7"></td></tr><tr><td class="h">83</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
<tr><td class="h">84</td><td colspan="7"></td></tr><tr><td class="h">85</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">sub get_authorization{</td></tr>
<tr><td class="h">86</td><td><div class="c3">60</div></td><td></td><td></td><td><div class="c3"><a href="blib-lib-Net-Amazon-SignatureVersion4-pm--subroutine.html#L86">60</a></div></td><td></td><td><div>23148</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;my $self=shift;</td></tr>
<tr><td class="h">87</td><td><div class="c3">60</div></td><td></td><td></td><td></td><td></td><td><div>129</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;my %dk=$self-&gt;get_derived_signing_key();</td></tr>
<tr><td class="h">88</td><td><div class="c3">60</div></td><td></td><td></td><td></td><td></td><td><div>121</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;my $sts=$self-&gt;get_string_to_sign();</td></tr>
<tr><td class="h">89</td><td><div class="c3">60</div></td><td></td><td></td><td></td><td></td><td><div>152</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;$sts=~tr/\r//d;</td></tr>
<tr><td class="h">90</td><td><div class="c3">60</div></td><td></td><td></td><td></td><td></td><td><div>963</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;my $signature=hmac_sha256_hex($sts,$dk{&#39;kSigning&#39;});</td></tr>
<tr><td class="h">91</td><td><div class="c3">60</div></td><td></td><td></td><td></td><td></td><td><div>3324</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;return &quot;AWS4-HMAC-SHA256 Credential=&quot;.$self-&gt;get_Access_Key_ID().&quot;/&quot;.$self-&gt;get_date_stamp().&quot;/&quot;.$self-&gt;get_region().&quot;/&quot;.$self-&gt;get_service().&quot;/aws4_request, SignedHeaders=&quot;.$self-&gt;get_signed_headers().&quot;, Signature=$signature&quot;;</td></tr>
<tr><td class="h">92</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
<tr><td class="h">93</td><td colspan="7"></td></tr><tr><td class="h">94</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">sub get_derived_signing_key{</td></tr>
<tr><td class="h">95</td><td><div class="c3">61</div></td><td></td><td></td><td><div class="c3"><a href="blib-lib-Net-Amazon-SignatureVersion4-pm--subroutine.html#L95">61</a></div></td><td></td><td><div>89</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;my $self=shift;</td></tr>
<tr><td class="h">96</td><td><div class="c3">61</div></td><td></td><td></td><td></td><td></td><td><div>117</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;$self-&gt;get_canonical_request(); # This is a hack to get the date set before using it to derive the signing key.</td></tr>
<tr><td class="h">97</td><td><div class="c3">61</div></td><td></td><td></td><td></td><td></td><td><div>88</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;my %rv=();</td></tr>
<tr><td class="h">98</td><td><div class="c3">61</div></td><td></td><td></td><td></td><td></td><td><div>3114</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;$rv{&#39;kSecret&#39;}=&quot;AWS4&quot;.$self-&gt;get_Secret_Access_Key();</td></tr>
<tr><td class="h">99</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;#say(&quot;kSecret: &quot;.unpack(&#39;H*&#39;,$rv{&#39;kSecret&#39;}));</td></tr>
<tr><td class="h">100</td><td><div class="c3">61</div></td><td></td><td></td><td></td><td></td><td><div>2928</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;$rv{&#39;kDate&#39;}=hmac_sha256($self-&gt;get_date_stamp(),$rv{&#39;kSecret&#39;});</td></tr>
<tr><td class="h">101</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;#say(&quot;kDate: &quot;.unpack(&#39;H*&#39;,$rv{&#39;kDate&#39;}));</td></tr>
<tr><td class="h">102</td><td><div class="c3">61</div></td><td></td><td></td><td></td><td></td><td><div>2898</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;$rv{&#39;kRegion&#39;}=hmac_sha256($self-&gt;get_region(),$rv{&#39;kDate&#39;});</td></tr>
<tr><td class="h">103</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;#say(&quot;kRegion: &quot;.unpack(&#39;H*&#39;,$rv{&#39;kRegion&#39;}));</td></tr>
<tr><td class="h">104</td><td><div class="c3">61</div></td><td></td><td></td><td></td><td></td><td><div>2913</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;$rv{&#39;kService&#39;}=hmac_sha256($self-&gt;get_service(),$rv{&#39;kRegion&#39;});</td></tr>
<tr><td class="h">105</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;#say(&quot;kService: &quot;.unpack(&#39;H*&#39;,$rv{&#39;kService&#39;}));</td></tr>
<tr><td class="h">106</td><td><div class="c3">61</div></td><td></td><td></td><td></td><td></td><td><div>489</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;$rv{&#39;kSigning&#39;}=hmac_sha256(&quot;aws4_request&quot;,$rv{&#39;kService&#39;});</td></tr>
<tr><td class="h">107</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;#say(&quot;kSigning: &quot;.unpack(&#39;H*&#39;,$rv{&#39;kSigning&#39;}));</td></tr>
<tr><td class="h">108</td><td><div class="c3">61</div></td><td></td><td></td><td></td><td></td><td><div>348</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;return %rv;</td></tr>
<tr><td class="h">109</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
<tr><td class="h">110</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">sub get_string_to_sign{</td></tr>
<tr><td class="h">111</td><td><div class="c3">90</div></td><td></td><td></td><td><div class="c3"><a href="blib-lib-Net-Amazon-SignatureVersion4-pm--subroutine.html#L111">90</a></div></td><td></td><td><div>22632</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;my $self=shift;</td></tr>
<tr><td class="h">112</td><td colspan="7"></td></tr><tr><td class="h">113</td><td><div class="c3">90</div></td><td></td><td></td><td></td><td></td><td><div>125</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;my $creq=$self-&gt;get_canonical_request();</td></tr>
<tr><td class="h">114</td><td><div class="c3">90</div></td><td></td><td></td><td></td><td></td><td><div>156</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;$creq=~tr/\r//d;</td></tr>
<tr><td class="h">115</td><td><div class="c3">90</div></td><td></td><td></td><td></td><td></td><td><div>4362</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;my $StringToSign=&quot;AWS4-HMAC-SHA256\r\n&quot;.</td></tr>
<tr><td class="h">116</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$self-&gt;get_time().&quot;\r\n&quot;.</td></tr>
<tr><td class="h">117</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$self-&gt;get_date_stamp().&quot;/&quot;.</td></tr>
<tr><td class="h">118</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$self-&gt;get_region().&quot;/&quot;.</td></tr>
<tr><td class="h">119</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$self-&gt;get_service().&quot;/aws4_request\r\n&quot;.</td></tr>
<tr><td class="h">120</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sha256_hex($creq);</td></tr>
<tr><td class="h">121</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
<tr><td class="h">122</td><td colspan="7"></td></tr><tr><td class="h">123</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">sub get_canonical_request{</td></tr>
<tr><td class="h">124</td><td><div class="c3">181</div></td><td></td><td></td><td><div class="c3"><a href="blib-lib-Net-Amazon-SignatureVersion4-pm--subroutine.html#L124">181</a></div></td><td></td><td><div>1135</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;my $self=shift;</td></tr>
<tr><td class="h">125</td><td><div class="c3">4</div><div class="c3">4</div><div class="c3">4</div></td><td></td><td></td><td><div class="c3"><a href="blib-lib-Net-Amazon-SignatureVersion4-pm--subroutine.html#L125">4</a></div></td><td></td><td><div>1690</div><div>19036</div><div>3411</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;use Data::Dumper;</td></tr>
<tr><td class="h">126</td><td colspan="7"></td></tr><tr><td class="h">127</td><td><div class="c3">181</div></td><td></td><td></td><td></td><td></td><td><div>163</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;my $method;</td></tr>
<tr><td class="h">128</td><td><div class="c3">181</div></td><td></td><td></td><td></td><td></td><td><div>213</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;my $full_uri=&quot;&quot;;</td></tr>
<tr><td class="h">129</td><td><div class="c3">181</div></td><td></td><td></td><td></td><td></td><td><div>139</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;my $version;</td></tr>
<tr><td class="h">130</td><td><div class="c3">181</div></td><td></td><td></td><td></td><td></td><td><div>204</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;my $canonical_query_string=&quot;&quot;;</td></tr>
<tr><td class="h">131</td><td><div class="c3">181</div></td><td></td><td></td><td></td><td></td><td><div>241</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;my %headers=();</td></tr>
<tr><td class="h">132</td><td colspan="7"></td></tr><tr><td class="h">133</td><td><div class="c3">181</div></td><td></td><td></td><td></td><td></td><td><div>9800</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;foreach my $name ( $self-&gt;get_request()-&gt;header_field_names() ){</td></tr>
<tr><td class="h">134</td><td><div class="c3">406</div></td><td></td><td></td><td></td><td></td><td><div>33492</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my @value=$self-&gt;get_request()-&gt;header($name);</td></tr>
<tr><td class="h">135</td><td><div class="c3">406</div></td><td><div class="c0" title="-/F"><a href="blib-lib-Net-Amazon-SignatureVersion4-pm--branch.html#L135">50</a></div></td><td></td><td></td><td></td><td><div>30594</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next unless (defined $name &amp; defined $value[0]);</td></tr>
<tr><td class="h">136</td><td><div class="c3">406</div></td><td><div class="c3" title="T/F"><a href="blib-lib-Net-Amazon-SignatureVersion4-pm--branch.html#L136">100</a></div></td><td></td><td></td><td></td><td><div>685</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (lc($name) eq &#39;date&#39;){</td></tr>
<tr><td class="h">137</td><td><div class="c3">181</div></td><td></td><td></td><td></td><td></td><td><div>4355</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my $time=str2time($value[0]);</td></tr>
<tr><td class="h">138</td><td><div class="c3">181</div></td><td></td><td></td><td></td><td></td><td><div>32433</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$self-&gt;set_date_stamp(strftime(&quot;%Y%m%d&quot;, gmtime($time)));</td></tr>
<tr><td class="h">139</td><td><div class="c3">181</div></td><td></td><td></td><td></td><td></td><td><div>13121</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$self-&gt;set_time(strftime(&quot;%Y%m%dT%H%M%SZ&quot;,gmtime($time)));</td></tr>
<tr><td class="h">140</td><td colspan="7"></td></tr><tr><td class="h">141</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</td></tr>
<tr><td class="h">142</td><td><div class="c3">406</div></td><td></td><td></td><td></td><td></td><td><div>568</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach my $value (@value){</td></tr>
<tr><td class="h">143</td><td><div class="c3">436</div></td><td></td><td></td><td></td><td></td><td><div>1203</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local $/ = &quot; &quot;;</td></tr>
<tr><td class="h">144</td><td><div class="c3">436</div></td><td></td><td></td><td></td><td></td><td><div>398</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chomp($value);</td></tr>
<tr><td class="h">145</td><td><div class="c3">436</div></td><td><div class="c3" title="T/F"><a href="blib-lib-Net-Amazon-SignatureVersion4-pm--branch.html#L145">100</a></div></td><td></td><td></td><td></td><td><div>586</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (defined $headers{lc($name)}){</td></tr>
<tr><td class="h">146</td><td><div class="c3">30</div><div class="c3">30</div></td><td></td><td></td><td></td><td></td><td><div>25</div><div>91</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push @{$headers{lc($name)}}, $value;</td></tr>
<tr><td class="h">147</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else{</td></tr>
<tr><td class="h">148</td><td><div class="c3">406</div></td><td></td><td></td><td></td><td></td><td><div>1712</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$headers{lc($name)}=[$value ];</td></tr>
<tr><td class="h">149</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</td></tr>
<tr><td class="h">150</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</td></tr>
<tr><td class="h">151</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;}</td></tr>
<tr><td class="h">152</td><td><div class="c3">181</div></td><td></td><td></td><td></td><td></td><td><div>9045</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;$full_uri=$self-&gt;get_request()-&gt;uri();</td></tr>
<tr><td class="h">153</td><td><div class="c3">181</div></td><td></td><td></td><td></td><td></td><td><div>9997</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;$full_uri =~ s@^(http|https)://.*?/@/@;</td></tr>
<tr><td class="h">154</td><td><div class="c3">181</div></td><td><div class="c0" title="-/-"><a href="blib-lib-Net-Amazon-SignatureVersion4-pm--branch.html#L154">0</a></div></td><td></td><td></td><td></td><td><div>9456</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;if ($full_uri=~m/(.*?)\?(.*)/){</td></tr>
<tr><td class="h">155</td><td><div class="c3">60</div></td><td></td><td></td><td></td><td></td><td><div>2078</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$full_uri=$1;</td></tr>
<tr><td class="h">156</td><td><div class="c3">60</div></td><td></td><td></td><td></td><td></td><td><div>94</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$canonical_query_string=$2;</td></tr>
<tr><td class="h">157</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;}</td></tr>
<tr><td class="h">158</td><td><div class="c3">181</div></td><td></td><td></td><td></td><td></td><td><div>3893</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;my @canonical_query_list;</td></tr>
<tr><td class="h">159</td><td><div class="c3">181</div></td><td><div class="c0" title="T/-"><a href="blib-lib-Net-Amazon-SignatureVersion4-pm--branch.html#L159">50</a></div></td><td></td><td></td><td></td><td><div>281</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;if ( defined $canonical_query_string){</td></tr>
<tr><td class="h">160</td><td><div class="c3">181</div></td><td><div class="c0" title="-/F"><a href="blib-lib-Net-Amazon-SignatureVersion4-pm--branch.html#L160">50</a></div></td><td></td><td></td><td></td><td><div>435</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ($canonical_query_string=~m/(.*?)\s.*/){</td></tr>
<tr><td class="h">161</td><td><div class="c0">0</div></td><td></td><td></td><td></td><td></td><td><div>0</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$canonical_query_string=$1</td></tr>
<tr><td class="h">162</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</td></tr>
<tr><td class="h">163</td><td><div class="c3">181</div></td><td></td><td></td><td></td><td></td><td><div>390</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@canonical_query_list=split(/\&amp;/,$canonical_query_string);</td></tr>
<tr><td class="h">164</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;}</td></tr>
<tr><td class="h">165</td><td><div class="c3">181</div></td><td></td><td></td><td></td><td></td><td><div>149</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;$canonical_query_string=&quot;&quot;;</td></tr>
<tr><td class="h">166</td><td><div class="c3">181</div></td><td></td><td></td><td></td><td></td><td><div>352</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;foreach my $param (sort @canonical_query_list){</td></tr>
<tr><td class="h">167</td><td><div class="c3">84</div></td><td></td><td></td><td></td><td></td><td><div>225</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(my $name, my $value)=split(/=/, $param);</td></tr>
<tr><td class="h">168</td><td><div class="c3">84</div></td><td><div class="c0" title="-/F"><a href="blib-lib-Net-Amazon-SignatureVersion4-pm--branch.html#L168">50</a></div></td><td></td><td></td><td></td><td><div>124</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$name=&quot;&quot; unless (defined $name);</td></tr>
<tr><td class="h">169</td><td><div class="c3">84</div></td><td><div class="c3" title="T/F"><a href="blib-lib-Net-Amazon-SignatureVersion4-pm--branch.html#L169">100</a></div></td><td></td><td></td><td></td><td><div>106</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$value=&quot;&quot; unless (defined $value);</td></tr>
<tr><td class="h">170</td><td><div class="c3">84</div></td><td></td><td></td><td></td><td></td><td><div>117</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$canonical_query_string=$canonical_query_string._encode($name).&quot;=&quot;._encode($value).&quot;&amp;&quot;;</td></tr>
<tr><td class="h">171</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;}</td></tr>
<tr><td class="h">172</td><td><div class="c3">181</div></td><td><div class="c3" title="T/F"><a href="blib-lib-Net-Amazon-SignatureVersion4-pm--branch.html#L172">100</a></div></td><td></td><td></td><td></td><td><div>366</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;$canonical_query_string=substr($canonical_query_string, 0, -1) unless ($canonical_query_string eq &quot;&quot;);</td></tr>
<tr><td class="h">173</td><td><div class="c3">181</div></td><td></td><td></td><td></td><td></td><td><div>2643</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;$full_uri=~tr/\///s;</td></tr>
<tr><td class="h">174</td><td><div class="c3">181</div></td><td></td><td></td><td></td><td></td><td><div>4101</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;my $ends_in_slash=0;</td></tr>
<tr><td class="h">175</td><td><div class="c3">181</div></td><td><div class="c3" title="T/F"><a href="blib-lib-Net-Amazon-SignatureVersion4-pm--branch.html#L175">100</a></div></td><td></td><td></td><td></td><td><div>273</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;if ($full_uri=~m/\w\/$/){</td></tr>
<tr><td class="h">176</td><td><div class="c3">6</div></td><td></td><td></td><td></td><td></td><td><div>6</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$ends_in_slash=1;</td></tr>
<tr><td class="h">177</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;}</td></tr>
<tr><td class="h">178</td><td><div class="c3">181</div></td><td></td><td></td><td></td><td></td><td><div>416</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;my @uri_source=split /\//, $full_uri;</td></tr>
<tr><td class="h">179</td><td><div class="c3">181</div></td><td></td><td></td><td></td><td></td><td><div>146</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;my @uri_stack;</td></tr>
<tr><td class="h">180</td><td><div class="c3">181</div></td><td></td><td></td><td></td><td></td><td><div>205</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;foreach my $path_component (@uri_source){</td></tr>
<tr><td class="h">181</td><td><div class="c3">135</div></td><td><div class="c3" title="T/F"><a href="blib-lib-Net-Amazon-SignatureVersion4-pm--branch.html#L181">100</a></div><div class="c3" title="T/F"><a href="blib-lib-Net-Amazon-SignatureVersion4-pm--branch.html#L181">100</a></div></td><td></td><td></td><td></td><td><div>234</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ($path_component =~ m/^\.$/){</td></tr>
<tr><td class="h">182</td><td><div class="c3">12</div></td><td></td><td></td><td></td><td></td><td><div>128</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep 0;</td></tr>
<tr><td class="h">183</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}elsif ($path_component =~ m/^..$/){</td></tr>
<tr><td class="h">184</td><td><div class="c3">18</div></td><td></td><td></td><td></td><td></td><td><div>21</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pop @uri_stack;</td></tr>
<tr><td class="h">185</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else{</td></tr>
<tr><td class="h">186</td><td><div class="c3">105</div></td><td></td><td></td><td></td><td></td><td><div>151</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push @uri_stack, $path_component;</td></tr>
<tr><td class="h">187</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</td></tr>
<tr><td class="h">188</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;}</td></tr>
<tr><td class="h">189</td><td><div class="c3">181</div></td><td></td><td></td><td></td><td></td><td><div>203</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;$full_uri=&quot;/&quot;;</td></tr>
<tr><td class="h">190</td><td><div class="c3">181</div></td><td></td><td></td><td></td><td></td><td><div>162</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;foreach my $path_component (@uri_stack){</td></tr>
<tr><td class="h">191</td><td><div class="c3">87</div></td><td></td><td></td><td></td><td></td><td><div>106</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$full_uri=$full_uri.&quot;$path_component/&quot;;</td></tr>
<tr><td class="h">192</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;}</td></tr>
<tr><td class="h">193</td><td><div class="c3">181</div></td><td></td><td></td><td></td><td></td><td><div>170</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;$full_uri=~tr/\///s;</td></tr>
<tr><td class="h">194</td><td><div class="c3">181</div></td><td><div class="c3" title="T/F"><a href="blib-lib-Net-Amazon-SignatureVersion4-pm--branch.html#L194">100</a></div></td><td></td><td></td><td></td><td><div>255</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;chop $full_uri unless ( $full_uri eq &quot;/&quot; );</td></tr>
<tr><td class="h">195</td><td><div class="c3">181</div></td><td><div class="c3" title="T/F"><a href="blib-lib-Net-Amazon-SignatureVersion4-pm--branch.html#L195">100</a></div></td><td></td><td></td><td></td><td><div>212</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;if ($ends_in_slash){</td></tr>
<tr><td class="h">196</td><td><div class="c3">6</div></td><td></td><td></td><td></td><td></td><td><div>5</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$full_uri=$full_uri.&quot;/&quot;;</td></tr>
<tr><td class="h">197</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;}</td></tr>
<tr><td class="h">198</td><td><div class="c3">181</div></td><td></td><td></td><td></td><td></td><td><div>141</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;my $CanonicalHeaders=&quot;&quot;;</td></tr>
<tr><td class="h">199</td><td><div class="c3">181</div></td><td></td><td></td><td></td><td></td><td><div>157</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;my $SignedHeaders=&quot;&quot;;</td></tr>
<tr><td class="h">200</td><td><div class="c3">181</div></td><td></td><td></td><td></td><td></td><td><div>485</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;foreach my $header ( sort keys %headers ){</td></tr>
<tr><td class="h">201</td><td><div class="c3">406</div></td><td></td><td></td><td></td><td></td><td><div>395</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$CanonicalHeaders=$CanonicalHeaders.lc($header).&#39;:&#39;;</td></tr>
<tr><td class="h">202</td><td><div class="c3">406</div><div class="c3">406</div></td><td></td><td></td><td></td><td></td><td><div>259</div><div>479</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach my $element(sort @{$headers{$header}}){</td></tr>
<tr><td class="h">203</td><td><div class="c3">436</div></td><td></td><td></td><td></td><td></td><td><div>554</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$CanonicalHeaders=$CanonicalHeaders.($element).&quot;,&quot;;</td></tr>
<tr><td class="h">204</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</td></tr>
<tr><td class="h">205</td><td><div class="c3">406</div></td><td></td><td></td><td></td><td></td><td><div>436</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$CanonicalHeaders=substr($CanonicalHeaders, 0, -1);</td></tr>
<tr><td class="h">206</td><td><div class="c3">406</div></td><td></td><td></td><td></td><td></td><td><div>229</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$CanonicalHeaders=$CanonicalHeaders.&quot;\r\n&quot;;</td></tr>
<tr><td class="h">207</td><td><div class="c3">406</div></td><td></td><td></td><td></td><td></td><td><div>421</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$SignedHeaders=$SignedHeaders.lc($header).&quot;;&quot;;</td></tr>
<tr><td class="h">208</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;}</td></tr>
<tr><td class="h">209</td><td colspan="7"></td></tr><tr><td class="h">210</td><td><div class="c3">181</div></td><td></td><td></td><td></td><td></td><td><div>225</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;$SignedHeaders=substr($SignedHeaders, 0, -1);</td></tr>
<tr><td class="h">211</td><td><div class="c3">181</div></td><td></td><td></td><td></td><td></td><td><div>9606</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;$self-&gt;set_signed_headers($SignedHeaders);</td></tr>
<tr><td class="h">212</td><td><div class="c3">181</div></td><td></td><td></td><td></td><td></td><td><div>8530</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;my $CanonicalRequest =</td></tr>
<tr><td class="h">213</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$self-&gt;get_request()-&gt;method() . &quot;\r\n&quot; .</td></tr>
<tr><td class="h">214</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$full_uri . &quot;\r\n&quot; .</td></tr>
<tr><td class="h">215</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$canonical_query_string . &quot;\r\n&quot; .</td></tr>
<tr><td class="h">216</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$CanonicalHeaders . &quot;\r\n&quot; .</td></tr>
<tr><td class="h">217</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$SignedHeaders . &quot;\r\n&quot; .</td></tr>
<tr><td class="h">218</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sha256_hex($self-&gt;get_request()-&gt;content());</td></tr>
<tr><td class="h">219</td><td><div class="c3">181</div></td><td></td><td></td><td></td><td></td><td><div>9387</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;return $CanonicalRequest;</td></tr>
<tr><td class="h">220</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
<tr><td class="h">221</td><td colspan="7"></td></tr><tr><td class="h">222</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">sub _encode{</td></tr>
<tr><td class="h">223</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;#This method is used to add some additional encodings that are not enforced by the URI::Encode module.  AWS expects these.</td></tr>
<tr><td class="h">224</td><td><div class="c3">168</div></td><td></td><td></td><td><div class="c3"><a href="blib-lib-Net-Amazon-SignatureVersion4-pm--subroutine.html#L224">168</a></div></td><td></td><td><div>4414</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;my $encoder = URI::Encode-&gt;new();</td></tr>
<tr><td class="h">225</td><td><div class="c3">168</div></td><td></td><td></td><td></td><td></td><td><div>116774</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;my $rv=shift;</td></tr>
<tr><td class="h">226</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">#    %20=%2F%2C%3F%3E%3C%60%22%3B%3A%5C%7C%5D%5B%7B%7D&amp;%40%23%24%25%5E=</td></tr>
<tr><td class="h">227</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">#    +  =/  ,  ?  %3E%3C%60%22;  :  %5C%7C]  [  %7B%7D&amp;@  #  $  %25%5E=</td></tr>
<tr><td class="h">228</td><td><div class="c3">168</div></td><td></td><td></td><td></td><td></td><td><div>3980</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;$rv=$encoder-&gt;encode($rv);</td></tr>
<tr><td class="h">229</td><td><div class="c3">168</div></td><td></td><td></td><td></td><td></td><td><div>16913</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;$rv=~s/\+/\%20/g;</td></tr>
<tr><td class="h">230</td><td><div class="c3">168</div></td><td></td><td></td><td></td><td></td><td><div>136</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;$rv=~s/\//\%2F/g;</td></tr>
<tr><td class="h">231</td><td><div class="c3">168</div></td><td></td><td></td><td></td><td></td><td><div>128</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;$rv=~s/\,/\%2C/g;</td></tr>
<tr><td class="h">232</td><td><div class="c3">168</div></td><td></td><td></td><td></td><td></td><td><div>114</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;$rv=~s/\?/\%3F/g;</td></tr>
<tr><td class="h">233</td><td><div class="c3">168</div></td><td></td><td></td><td></td><td></td><td><div>104</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;$rv=~s/\;/\%3B/g;</td></tr>
<tr><td class="h">234</td><td><div class="c3">168</div></td><td></td><td></td><td></td><td></td><td><div>102</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;$rv=~s/\:/\%3A/g;</td></tr>
<tr><td class="h">235</td><td><div class="c3">168</div></td><td></td><td></td><td></td><td></td><td><div>110</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;$rv=~s/\]/\%5D/g;</td></tr>
<tr><td class="h">236</td><td><div class="c3">168</div></td><td></td><td></td><td></td><td></td><td><div>107</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;$rv=~s/\[/\%5B/g;</td></tr>
<tr><td class="h">237</td><td><div class="c3">168</div></td><td></td><td></td><td></td><td></td><td><div>117</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;$rv=~s/\@/\%40/g;</td></tr>
<tr><td class="h">238</td><td><div class="c3">168</div></td><td></td><td></td><td></td><td></td><td><div>98</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;$rv=~s/\#/\%23/g;</td></tr>
<tr><td class="h">239</td><td><div class="c3">168</div></td><td></td><td></td><td></td><td></td><td><div>115</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;$rv=~s/\$/\%24/g;</td></tr>
<tr><td class="h">240</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">#    $rv=~s///g;</td></tr>
<tr><td class="h">241</td><td><div class="c3">168</div></td><td></td><td></td><td></td><td></td><td><div>19455</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;return $rv;</td></tr>
<tr><td class="h">242</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
<tr><td class="h">243</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">1;</td></tr>
<tr><td class="h">244</td><td colspan="7"></td></tr></table>
</body>
</html>