<?php
/**
 * Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License").
 * You may not use this file except in compliance with the License.
 * A copy of the License is located at
 *
 * http://aws.amazon.com/apache2.0
 *
 * or in the "license" file accompanying this file. This file is distributed
 * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
 * express or implied. See the License for the specific language governing
 * permissions and limitations under the License.
 */

namespace DuplicatorPro\Aws\S3;

defined("ABSPATH") or die("");

use DuplicatorPro\Aws\Common\Signature\SignatureV4;
use DuplicatorPro\Aws\Common\Credentials\CredentialsInterface;
use DuplicatorPro\Guzzle\Http\Message\EntityEnclosingRequestInterface;
use DuplicatorPro\Guzzle\Http\Message\RequestInterface;

/**
 * Amazon S3 signature version 4 overrides.
 */
class S3SignatureV4 extends SignatureV4 implements S3SignatureInterface
{
    /**
     * Always add a x-amz-content-sha-256 for data integrity.
     */
    public function signRequest(RequestInterface $request, CredentialsInterface $credentials)
    {
        if (!$request->hasHeader('x-amz-content-sha256')) {
            $request->setHeader(
                'x-amz-content-sha256',
                $this->getPayload($request)
            );
        }

        parent::signRequest($request, $credentials);
    }

    /**
     * Override used to allow pre-signed URLs to be created for an
     * in-determinate request payload.
     */
    protected function getPresignedPayload(RequestInterface $request)
    {
        return 'UNSIGNED-PAYLOAD';
    }

    /**
     * Amazon S3 does not double-encode the path component in the canonical req
     */
    protected function createCanonicalizedPath(RequestInterface $request)
    {
        return '/' . ltrim($request->getPath(), '/');
    }
}
