Unverified Commit 5dd68f00 authored by Russell Cohen's avatar Russell Cohen Committed by GitHub
Browse files

Fix URL encoding signing bug & add ApiGatewayManagement example (#884)

* Fix URL encoding signing bug & add ApiGatewayManagement example

* Cleanup docs

* clarify unwrap

* Fix warnings
parent 692bf94b
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
POST
/test/%40connections/JBDvjfGEIAMCERw%253D

host:tj9n5r0m12.execute-api.us-east-1.amazonaws.com
x-amz-date:20210511T154045Z

host;x-amz-date
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
+3 −0
Original line number Diff line number Diff line
POST /test/@connections/JBDvjfGEIAMCERw%3D HTTP/1.1
Host:tj9n5r0m12.execute-api.us-east-1.amazonaws.com
X-amz-date:20150830T123600Z
+4 −0
Original line number Diff line number Diff line
POST /test/@connections/JBDvjfGEIAMCERw%3D HTTP/1.1
X-amz-date:20150830T123600Z
Authorization:AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=6f871eb157f326fa5f7439eb88ca200048635950ce7d6037deda56f0c95d4364
Host:tj9n5r0m12.execute-api.us-east-1.amazonaws.com
+14 −1
Original line number Diff line number Diff line
@@ -7,6 +7,7 @@ use super::query_writer::QueryWriter;
use super::{Error, PayloadChecksumKind, SignableBody, SignatureLocation, SigningParams};
use crate::date_time::{format_date, format_date_time};
use crate::http_request::sign::SignableRequest;
use crate::http_request::url_escape::percent_encode_path;
use crate::http_request::PercentEncodingMode;
use crate::sign::sha256_hex_string;
use http::header::{HeaderName, CONTENT_LENGTH, CONTENT_TYPE, HOST, USER_AGENT};
@@ -128,7 +129,7 @@ impl<'a> CanonicalRequest<'a> {
        let path = req.uri().path();
        let path = match params.settings.percent_encoding_mode {
            // The string is already URI encoded, we don't need to encode everything again, just `%`
            PercentEncodingMode::Double => Cow::Owned(path.replace('%', "%25")),
            PercentEncodingMode::Double => Cow::Owned(percent_encode_path(path)),
            PercentEncodingMode::Single => Cow::Borrowed(path),
        };
        let payload_hash = Self::payload_hash(req.body());
@@ -612,6 +613,18 @@ mod tests {
        assert_eq!(expected, actual);
    }

    #[test]
    fn test_double_url_encode_path() {
        let req = test_request("double-encode-path");
        let req = SignableRequest::from(&req);
        let signing_params = signing_params(SigningSettings::default());
        let creq = CanonicalRequest::from(&req, &signing_params).unwrap();

        let expected = test_canonical_request("double-encode-path");
        let actual = format!("{}", creq);
        assert_eq!(actual, expected);
    }

    #[test]
    fn test_double_url_encode() {
        let req = test_request("double-url-encode");
+3 −3
Original line number Diff line number Diff line
@@ -3,7 +3,7 @@
 * SPDX-License-Identifier: Apache-2.0.
 */

use crate::http_request::url_escape::percent_encode;
use crate::http_request::url_escape::percent_encode_query;
use http::Uri;

/// Utility for updating the query string in a [`Uri`].
@@ -49,10 +49,10 @@ impl QueryWriter {
            self.new_path_and_query.push(prefix);
        }
        self.prefix = Some('&');
        self.new_path_and_query.push_str(&percent_encode(k));
        self.new_path_and_query.push_str(&percent_encode_query(k));
        self.new_path_and_query.push('=');

        self.new_path_and_query.push_str(&percent_encode(v));
        self.new_path_and_query.push_str(&percent_encode_query(v));
    }

    /// Returns just the built query string.
Loading