From 6ef153ab85561f72b667f9286fb5d240a4c1b4d6 Mon Sep 17 00:00:00 2001 From: Ion Bazan Date: Wed, 29 Apr 2020 12:32:28 +0200 Subject: [PATCH] add HttPlug support --- README.md | 31 +++++++++++++++++++++- composer.json | 10 ++++--- src/HttPlug/RequestSignerPlugin.php | 26 ++++++++++++++++++ tests/HttPlug/RequestSignerPluginTest.php | 32 +++++++++++++++++++++++ 4 files changed, 94 insertions(+), 5 deletions(-) create mode 100644 src/HttPlug/RequestSignerPlugin.php create mode 100644 tests/HttPlug/RequestSignerPluginTest.php diff --git a/README.md b/README.md index 5046980..6bd527f 100644 --- a/README.md +++ b/README.md @@ -4,11 +4,12 @@ [![GitHub Workflow Status](https://img.shields.io/github/workflow/status/IonBazan/aliyun-http-signer/Tests)](https://github.com/IonBazan/aliyun-http-signer/actions) [![PHP version](https://img.shields.io/packagist/php-v/ion-bazan/aliyun-http-signer.svg)](https://packagist.org/packages/ion-bazan/aliyun-http-signer) [![Codecov](https://img.shields.io/codecov/c/gh/IonBazan/aliyun-http-signer)](https://codecov.io/gh/IonBazan/aliyun-http-signer) +[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/IonBazan/aliyun-http-signer/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/IonBazan/aliyun-http-signer/?branch=master) [![Downloads](https://img.shields.io/packagist/dt/ion-bazan/aliyun-http-signer.svg)](https://packagist.org/packages/ion-bazan/aliyun-http-signer) [![License](https://img.shields.io/packagist/l/ion-bazan/aliyun-http-signer.svg)](https://packagist.org/packages/ion-bazan/aliyun-http-signer) This library implements [Alibaba Cloud API Gateway request signature](https://www.alibabacloud.com/help/doc-detail/29475.htm) calculation for [PSR-7](https://www.php-fig.org/psr/psr-7/) compatible requests. -It integrates with [Guzzle](https://github.com/guzzle/guzzle) by providing a simple [Middleware](http://docs.guzzlephp.org/en/stable/handlers-and-middleware.html#middleware) but can be used with any PSR-7-compatible client. +It integrates with [Guzzle](https://github.com/guzzle/guzzle) and [HttPlug](https://github.com/php-http/httplug) but can be used with any PSR-7-compatible client. # Installation Use [Composer](https://getcomposer.org/) to install the package using: @@ -70,6 +71,34 @@ $client = new Client(['handler' => $stack]); $response = $client->get('https://example.com/api/v1/test'); ``` +## Sign an API request using HttPlug plugin + +```php +sendRequest($request); +``` + # Bugs & issues If you found a bug or security vulnerability, please [open an issue](https://github.com/IonBazan/aliyun-http-signer/issues/new) diff --git a/composer.json b/composer.json index 0bea77b..f5d1076 100644 --- a/composer.json +++ b/composer.json @@ -1,8 +1,8 @@ { "name": "ion-bazan/aliyun-http-signer", "type": "library", - "description": "PSR-7-compatible Alibaba Cloud API Gateway request signing implementation. Integrates with Guzzle ⛽️.", - "keywords": ["Aliyun", "Alibaba", "Alibaba Cloud", "API Gateway", "Guzzle", "PSR-7", "HMAC", "Signature"], + "description": "PSR-7-compatible Alibaba Cloud API Gateway request signing implementation. Integrates with Guzzle ⛽️ and HttPlug \uD83D\uDC18.", + "keywords": ["Aliyun", "Alibaba", "Alibaba Cloud", "API Gateway", "Guzzle", "PSR-7", "HMAC", "Signature", "httplug", "http"], "homepage": "https://github.com/IonBazan/aliyun-http-signer", "license": "MIT", "authors": [ @@ -23,11 +23,13 @@ "friendsofphp/php-cs-fixer": "^2.16", "guzzlehttp/guzzle": "^6.0|^7.0", "laminas/laminas-diactoros": "^2.2", + "php-http/client-common": "^2.0", "phpunit/phpunit": "^8.0|^9.0" }, "suggest": { - "guzzlehttp/guzzle": "^6.0|^7.0", - "laminas/laminas-diactoros": "^2.2" + "guzzlehttp/guzzle": "^6.0|^7.0, to use Guzzle Middleware", + "laminas/laminas-diactoros": "^2.2, to build HTTP requests", + "php-http/client-common": "^2.0, to use HttPlug plugin" }, "autoload": { "psr-4": { diff --git a/src/HttPlug/RequestSignerPlugin.php b/src/HttPlug/RequestSignerPlugin.php new file mode 100644 index 0000000..78382d3 --- /dev/null +++ b/src/HttPlug/RequestSignerPlugin.php @@ -0,0 +1,26 @@ +requestSigner = $requestSigner; + } + + public function handleRequest(RequestInterface $request, callable $next, callable $first): Promise + { + $request = $this->requestSigner->signRequest($request); + + return $next($request); + } +} diff --git a/tests/HttPlug/RequestSignerPluginTest.php b/tests/HttPlug/RequestSignerPluginTest.php new file mode 100644 index 0000000..c5dfc63 --- /dev/null +++ b/tests/HttPlug/RequestSignerPluginTest.php @@ -0,0 +1,32 @@ +createMock(RequestSigner::class); + $plugin = new RequestSignerPlugin($signer); + $verify = function (RequestInterface $request): Promise { + return new HttpFulfilledPromise( + $this->createMock(ResponseInterface::class) + ); + }; + + $request = $this->createMock(RequestInterface::class); + $signer->expects($this->once()) + ->method('signRequest') + ->with($request); + + $plugin->handleRequest($request, $verify, $verify); + } +}