/** * @brief Create an AWS V4 Signature canonical request. * * @param[in] operation The HTTP method being used for the request. * @param[in] request The network request to generate a canonical request for. * @param[in] payload Optional data being submitted in the request (eg for `PUT` and `POST` operations). * @param[out] signedHeaders A semi-colon separated list of the names of all headers * included in the result. * * @return An AWS V4 Signature canonical request. * * @see http://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html */ QByteArray AwsSignatureV4Private::canonicalRequest(const QNetworkAccessManager::Operation operation, const QNetworkRequest &request, const QByteArray &payload, QByteArray * const signedHeaders) const { return httpMethod(operation).toUtf8() + '\n' + canonicalPath(request.url()).toUtf8() + '\n' + canonicalQuery(QUrlQuery(request.url())) + '\n' + canonicalHeaders(request, signedHeaders) + '\n' + *signedHeaders + '\n' + QCryptographicHash::hash(payload, hashAlgorithm).toHex(); }
/** * @brief Create an AWS V3 Signature canonical request. * * Note, this function implments both `AWS3` and `AWS3-HTTPS` variants of the * AWS Signature version 3 - which are quite different. * * @param[in] operation The HTTP method being used for the request. * @param[in] request The network request to generate a canonical request for. * @param[in] payload Optional data being submitted in the request (eg for `PUT` and `POST` operations). * @param[out] signedHeaders A semi-colon separated list of the names of all headers * included in the result. * * @return An AWS V3 Signature canonical request. * * @see http://docs.aws.amazon.com/amazonswf/latest/developerguide/HMACAuth-swf.html (AWS3) * @see http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/RESTAuthentication.html (AWS3-HTTPS) */ QByteArray AwsSignatureV3Private::canonicalRequest(const QNetworkAccessManager::Operation operation, const QNetworkRequest &request, const QByteArray &payload, QByteArray * const signedHeaders) const { // AWS3-HTTPS if (isHttps(request)) { Q_ASSERT((request.hasRawHeader("x-amz-date")) || (request.hasRawHeader("Date"))); QByteArray canonicalRequest = request.rawHeader(request.hasRawHeader("x-amz-date") ? "x-amz-date" : "Date"); if (request.hasRawHeader("x-amz-nonce")) { canonicalRequest += request.rawHeader("x-amz-nonce"); } return canonicalRequest; } // AWS3 return httpMethod(operation).toUtf8() + '\n' + canonicalPath(request.url()).toUtf8() + '\n' + canonicalQuery(QUrlQuery(request.url())) + '\n' + canonicalHeaders(request, signedHeaders) + '\n' + payload; }