Skip to content

Conversation

@thekid
Copy link
Member

@thekid thekid commented Mar 14, 2023

This way, we can use it to implement signed requests as seen here: https://docs.aws.amazon.com/general/latest/gr/create-signed-request.html:

<?php

use io\streams\MemoryOutputStream;
use peer\http\HttpRequest;
use util\Secret;
use webservices\rest\io\Transfer;

/**
 * Signing AWS API requests
 *
 * @see  https://docs.aws.amazon.com/general/latest/gr/create-signed-request.html
 */
class AwsSignedRequests extends Transfer {
  const HASH= 'sha256';
  const ALGO= 'AWS4-HMAC-SHA256';

  private $service, $accessKey, $secretKey, $session, $region, $userAgent;

  public function __construct($service, $accessKey, Secret $secretKey, $session= null, $region= '*') {
    $this->service= $service;
    $this->accessKey= $accessKey;
    $this->secretKey= $secretKey;
    $this->session= $session;
    $this->region= $region;
    $this->userAgent= 'xp-aws/1.0.0 OS/'.php_uname('s').'/'.php_uname('r').' lang/php/'.PHP_VERSION;
  }

  /** Returns signature headers */
  public function signature(HttpRequest $request, string $payload, int $time= null): array {

    // Implementation stripped for brevity reasons!

    return $headers;
  }

  /**
   * Start buffering.
   *
   * @param  peer.http.HttpConnection $conn
   * @param  peer.http.HttpRequest $request
   * @return io.streams.OutputStream
   */
  public function start($conn, $request) {
    return new MemoryOutputStream();
  }

  /**
   * Finish buffering, sign request, then send it.
   *
   * @param  peer.http.HttpConnection $conn
   * @param  peer.http.HttpRequest $request
   * @param  io.streams.OutputStream $output
   * @return peer.http.HttpResponse
   */
  public function finish($conn, $request, $output) {
    if (null === $output) {
      $request->addHeaders($this->signature($request, ''));
      return $conn->send($request);
    }
 
    $bytes= $output->bytes();
    $request->setHeader('Content-Length', strlen($bytes));
    $request->addHeaders($this->signature($request, $bytes));

    $stream= $conn->open($request);
    $stream->write($bytes);
    return $conn->finish($stream);
  }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants