Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor transfer API and open it to outside #32

Open
wants to merge 8 commits into
base: master
Choose a base branch
from

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.

1 participant