@property<EOL><INDENT>def canonical_request(self):<DEDENT>
signed_headers = self.signed_headers<EOL>header_lines = "<STR_LIT>".join(<EOL>["<STR_LIT>" % item for item in iteritems(signed_headers)])<EOL>header_keys = "<STR_LIT:;>".join([key for key in iterkeys(self.signed_headers)])<EOL>return (self.request_method + "<STR_LIT:\n>" +<EOL>self.canonical_uri_path + "<STR_LIT:\n>" +<EOL>self.canonical_query_string + "<STR_LIT:\n>" +<EOL>header_lines + "<STR_LIT:\n>" +<EOL>header_keys + "<STR_LIT:\n>" +<EOL>sha256(self.body).hexdigest())<EOL>
The AWS SigV4 canonical request given parameters from an HTTP request.
This process is outlined here:
http://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html

The canonical request is:
    request_method + '\n' +
    canonical_uri_path + '\n' +
    canonical_query_string + '\n' +
    signed_headers + '\n' +
    sha256(body).hexdigest()