summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/build.yml154
-rw-r--r--.github/workflows/ci-build.yml122
-rw-r--r--.gitignore2
-rwxr-xr-xMakefile1
-rw-r--r--bors.toml24
-rw-r--r--composer.json8
-rw-r--r--phpstan.neon.dist1
-rw-r--r--src/Diactoros/ServerRequestFactory.php4
-rw-r--r--src/Diactoros/StreamFactory.php2
-rw-r--r--src/Diactoros/UploadedFileFactory.php2
-rw-r--r--src/HttpClient.php9
11 files changed, 183 insertions, 146 deletions
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
new file mode 100644
index 00000000..92b55666
--- /dev/null
+++ b/.github/workflows/build.yml
@@ -0,0 +1,154 @@
+name: build
+
+on:
+ push:
+ pull_request:
+
+jobs:
+ php:
+ name: Build (PHP ${{ matrix.php }}, ${{ matrix.setup }} setup)
+ runs-on: ubuntu-20.04
+ timeout-minutes: 6
+ strategy:
+ fail-fast: false
+ matrix:
+ php: ['7.3', '7.4', '8.0']
+ setup: [basic, lowest]
+ steps:
+ - name: Set up PHP ${{ matrix.php }}
+ uses: shivammathur/setup-php@v2 # action page: <https://github.com/shivammathur/setup-php>
+ with:
+ php-version: ${{ matrix.php }}
+
+ - name: Check out code
+ uses: actions/checkout@v2
+
+ - name: Syntax check only (lint)
+ run: find ./src/ ./tests/ -name "*.php" -print0 | xargs -0 -n1 -P8 php -l
+
+ - name: Get Composer Cache Directory
+ id: composer-cache
+ run: echo "::set-output name=dir::$(composer config cache-files-dir)"
+
+ - name: Init Composer Cache # Docs: <https://git.io/JfAKn#php---composer>
+ uses: actions/cache@v2
+ with:
+ path: ${{ steps.composer-cache.outputs.dir }}
+ key: ${{ runner.os }}-composer-${{ matrix.setup }}-${{ hashFiles('**/composer.json') }}
+ restore-keys: ${{ runner.os }}-composer-
+
+ - name: Install lowest Composer dependencies
+ if: matrix.setup == 'lowest'
+ run: composer update --prefer-dist --no-progress --prefer-lowest --ansi
+
+ - name: Install basic Composer dependencies
+ if: matrix.setup == 'basic'
+ run: composer update --prefer-dist --no-progress --ansi
+
+ - name: Analyze PHP sources
+ run: composer analyze
+
+ # TODO write phpunit tests
+ #- name: Analyze PHP sources
+ # run: composer test
+
+ golang:
+ name: Build (Go ${{ matrix.go }}, PHP ${{ matrix.php }})
+ runs-on: ubuntu-20.04
+ timeout-minutes: 10
+ strategy:
+ fail-fast: false
+ matrix:
+ php: ['7.3', '7.4', '8.0']
+ go: ['1.14', '1.15']
+ steps:
+ - name: Set up Go ${{ matrix.go }}
+ uses: actions/setup-go@v2 # action page: <https://github.com/actions/setup-go>
+ with:
+ go-version: ${{ matrix.go }}
+
+ - name: Set up PHP ${{ matrix.php }}
+ uses: shivammathur/setup-php@v2 # action page: <https://github.com/shivammathur/setup-php>
+ with:
+ php-version: ${{ matrix.php }}
+
+ - name: Check out code
+ uses: actions/checkout@v2
+
+ - name: Get Composer Cache Directory
+ id: composer-cache
+ run: echo "::set-output name=dir::$(composer config cache-files-dir)"
+
+ - name: Init Composer Cache # Docs: <https://git.io/JfAKn#php---composer>
+ uses: actions/cache@v2
+ with:
+ path: ${{ steps.composer-cache.outputs.dir }}
+ key: ${{ runner.os }}-composer-${{ matrix.php }}-${{ hashFiles('**/composer.json') }}
+ restore-keys: ${{ runner.os }}-composer-
+
+ - name: Install Composer dependencies
+ run: composer update --prefer-dist --no-progress --ansi
+
+ - name: Init Go modules Cache # Docs: <https://git.io/JfAKn#go---modules>
+ uses: actions/cache@v2
+ with:
+ path: ~/go/pkg/mod
+ key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
+ restore-keys: ${{ runner.os }}-go-
+
+ - name: Install Go dependencies
+ run: go mod download
+
+ - name: Run golang tests
+ run: |
+ mkdir ./coverage-ci
+ go test -race -v -covermode=atomic -coverprofile=./coverage-ci/lib.txt
+ go test ./util -race -v -covermode=atomic -coverprofile=./coverage-ci/util.txt
+ go test ./service -race -v -covermode=atomic -coverprofile=./coverage-ci/service.txt
+ go test ./service/env -race -v -covermode=atomic -coverprofile=./coverage-ci/env.txt
+ go test ./service/rpc -race -v -covermode=atomic -coverprofile=./coverage-ci/rpc.txt
+ go test ./service/http -race -v -covermode=atomic -coverprofile=./coverage-ci/http.txt
+ go test ./service/static -race -v -covermode=atomic -coverprofile=./coverage-ci/static.txt
+ go test ./service/limit -race -v -covermode=atomic -coverprofile=./coverage-ci/limit.txt
+ go test ./service/headers -race -v -covermode=atomic -coverprofile=./coverage-ci/headers.txt
+ go test ./service/metrics -race -v -covermode=atomic -coverprofile=./coverage-ci/metrics.txt
+ go test ./service/health -race -v -covermode=atomic -coverprofile=./coverage-ci/health.txt
+ go test ./service/gzip -race -v -covermode=atomic -coverprofile=./coverage-ci/gzip.txt
+ go test ./service/reload -race -v -covermode=atomic -coverprofile=./coverage-ci/reload.txt
+ cat ./coverage-ci/*.txt > ./coverage-ci/summary.txt
+
+ - uses: codecov/codecov-action@v1 # Docs: <https://github.com/codecov/codecov-action>
+ with:
+ token: ${{ secrets.CODECOV_TOKEN }}
+ file: ./coverage-ci/summary.txt
+ fail_ci_if_error: false
+
+ golangci-check:
+ name: Golang-CI (lint)
+ runs-on: ubuntu-20.04
+ steps:
+ - name: Check out code
+ uses: actions/checkout@v1
+
+ - name: golangci-lint
+ uses: reviewdog/action-golangci-lint@v1 # action page: <https://github.com/reviewdog/action-golangci-lint>
+ with:
+ github_token: ${{ secrets.github_token }}
+
+ image:
+ name: Build docker image
+ runs-on: ubuntu-20.04
+ timeout-minutes: 10
+ steps:
+ - name: Check out code
+ uses: actions/checkout@v2
+
+ - name: Build image
+ run: docker build -t roadrunner:local -f Dockerfile .
+
+ - name: Scan image
+ uses: anchore/scan-action@v2 # action page: <https://github.com/anchore/scan-action>
+ with:
+ image: roadrunner:local
+ fail-build: true
+ severity-cutoff: low # negligible, low, medium, high or critical
diff --git a/.github/workflows/ci-build.yml b/.github/workflows/ci-build.yml
deleted file mode 100644
index ded84778..00000000
--- a/.github/workflows/ci-build.yml
+++ /dev/null
@@ -1,122 +0,0 @@
-name: CI
-
-on: [ push, pull_request ]
-
-jobs:
- build:
- name: Build (PHP ${{ matrix.php }}, Go ${{ matrix.go }}, OS ${{ matrix.os }})
- runs-on: ${{ matrix.os }}
- strategy:
- fail-fast: false
- matrix:
- php: [ 7.3, 7.4, 8.0 ]
- go: [ 1.14, 1.15 ]
- os: [ ubuntu-20.04 ]
- env:
- GO111MODULE: on
- steps:
- - name: Set up Go ${{ matrix.go }}
- uses: actions/setup-go@v1
- with:
- go-version: ${{ matrix.go }}
-
- - name: Set up PHP ${{ matrix.php }}
- uses: shivammathur/setup-php@v1
- with:
- php-version: ${{ matrix.php }}
- extensions: dom
- coverage: xdebug
-
- - name: Check out code
- uses: actions/checkout@v2
- with:
- fetch-depth: 1
-
- - name: Show versions
- run: php -v ; composer -V ; go version
-
- - name: Debug if needed
- env:
- DEBUG: ${{ secrets.DEBUG }}
- run: if [[ "$DEBUG" == "true" ]]; then env && go env; fi
-
- - name: Syntax check only (lint)
- run: find ./src/ -name "*.php" -print0 | xargs -0 -n1 -P8 php -l
-
- - name: Get Composer Cache Directory # Docs: <https://github.com/actions/cache/blob/master/examples.md#php---composer>
- id: composer-cache
- run: echo "::set-output name=dir::$(composer config cache-files-dir)"
-
- - name: Cache dependencies # Docs: <https://github.com/actions/cache/blob/master/examples.md#php---composer>
- uses: actions/cache@v1
- with:
- path: ${{ steps.composer-cache.outputs.dir }}
- key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }}
- restore-keys: ${{ runner.os }}-composer-
-
- - name: Install Composer dependencies
- run: composer install --prefer-dist --no-interaction --no-suggest # --prefer-source
-
- - name: Analyze PHP sources
- run: composer analyze
-
- - name: Install Go dependencies
- run: go mod download
-
- - name: Run golang tests
- run: |
- composer update
- go test -race -v -coverprofile=lib.txt -covermode=atomic
- go test ./util -race -v -coverprofile=util.txt -covermode=atomic
- go test ./service -race -v -coverprofile=service.txt -covermode=atomic
- go test ./service/env -race -v -coverprofile=env.txt -covermode=atomic
- go test ./service/rpc -race -v -coverprofile=rpc.txt -covermode=atomic
- go test ./service/http -race -v -coverprofile=http.txt -covermode=atomic
- go test ./service/static -race -v -coverprofile=static.txt -covermode=atomic
- go test ./service/limit -race -v -coverprofile=limit.txt -covermode=atomic
- go test ./service/headers -race -v -coverprofile=headers.txt -covermode=atomic
- go test ./service/metrics -race -v -coverprofile=metrics.txt -covermode=atomic
- go test ./service/health -race -v -coverprofile=health.txt -covermode=atomic
-
- - name: Run code coverage
- env:
- CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
- run: |
- if [[ "$CODECOV_TOKEN" != "" ]]; then
- curl https://codecov.io/bash -o codecov-bash
- chmod +x codecov-bash
- ./codecov-bash -f lib.txt
- ./codecov-bash -f util.txt
- ./codecov-bash -f service.txt
- ./codecov-bash -f env.txt
- ./codecov-bash -f rpc.txt
- ./codecov-bash -f http.txt
- ./codecov-bash -f static.txt
- ./codecov-bash -f limit.txt
- ./codecov-bash -f headers.txt
- ./codecov-bash -f metrics.txt
- ./codecov-bash -f health.txt
- fi
-
- golangci-check:
- name: runner / golangci-lint
- runs-on: ubuntu-20.04
- steps:
- - name: Check out code into the Go module directory
- uses: actions/checkout@v1
- - name: golangci-lint
- uses: reviewdog/action-golangci-lint@v1
- with:
- github_token: ${{ secrets.github_token }}
-
- image:
- name: Build docker image
- runs-on: ubuntu-20.04
- steps:
- - name: Check out code
- uses: actions/checkout@v2
- with:
- fetch-depth: 1
-
- - name: Build image
- run: docker build -t rr:local -f Dockerfile .
diff --git a/.gitignore b/.gitignore
index 852b8881..8a2f7d68 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,4 +5,4 @@ vendor_php
builds/
tests/vendor/
.rr-sample.yaml
-psr-worker.php \ No newline at end of file
+psr-worker.php
diff --git a/Makefile b/Makefile
index bb1e1975..9ad158ba 100755
--- a/Makefile
+++ b/Makefile
@@ -24,6 +24,7 @@ uninstall: ## Uninstall locally installed RR
rm -f /usr/local/bin/rr
test: ## Run application tests
+ test -d ./vendor_php || composer update --prefer-dist --ansi
go test -v -race -cover
go test -v -race -cover ./util
go test -v -race -cover ./service
diff --git a/bors.toml b/bors.toml
index 2c1160b9..e56a268a 100644
--- a/bors.toml
+++ b/bors.toml
@@ -1,14 +1,18 @@
status = [
-'Build (PHP 7.3, Go 1.15, OS ubuntu-20.04)',
-'Build (PHP 7.3, Go 1.14, OS ubuntu-20.04)',
-'Build (PHP 7.4, Go 1.15, OS ubuntu-20.04)',
-'Build (PHP 7.4, Go 1.14, OS ubuntu-20.04)',
-'Build (PHP 8, Go 1.15, OS ubuntu-20.04)',
-'Build (PHP 8, Go 1.14, OS ubuntu-20.04)',
-'runner / golangci-lint',
-'Build docker image',]
-
+'Build (PHP 7.3, basic setup)',
+'Build (PHP 7.3, lowest setup)',
+'Build (PHP 8.0, basic setup)',
+'Build (PHP 8.0, lowest setup)',
+'Build (Go 1.14, PHP 7.3)',
+'Build (Go 1.15, PHP 7.3)',
+'Build (Go 1.14, PHP 7.4)',
+'Build (Go 1.15, PHP 7.4)',
+'Build (Go 1.14, PHP 8.0)',
+'Build (Go 1.15, PHP 8.0)',
+'Golang-CI (lint)',
+'Build docker image',
+]
required_approvals = 1
delete_merged_branches = true
-timeout-sec = 1800 \ No newline at end of file
+timeout-sec = 1800
diff --git a/composer.json b/composer.json
index 383ac2d1..3d6b3d22 100644
--- a/composer.json
+++ b/composer.json
@@ -18,17 +18,17 @@
"ext-json": "*",
"ext-curl": "*",
"spiral/goridge": "^2.4.2",
- "psr/http-factory": "^1.0",
- "psr/http-message": "^1.0",
+ "psr/http-factory": "^1.0.1",
+ "psr/http-message": "^1.0.1",
"symfony/console": "^2.5.0 || ^3.0.0 || ^4.0.0 || ^5.0.0",
- "laminas/laminas-diactoros": "^1.3 || ^2.0",
+ "laminas/laminas-diactoros": "^1.3.6 || ^2.0",
"composer/package-versions-deprecated": "^1.8"
},
"config": {
"vendor-dir": "vendor_php"
},
"require-dev": {
- "phpstan/phpstan": "~0.12"
+ "phpstan/phpstan": "~0.12.34"
},
"scripts": {
"analyze": "phpstan analyze -c ./phpstan.neon.dist --no-progress --ansi"
diff --git a/phpstan.neon.dist b/phpstan.neon.dist
index c9ffb648..a6ef3b8a 100644
--- a/phpstan.neon.dist
+++ b/phpstan.neon.dist
@@ -1,5 +1,4 @@
parameters:
level: 'max'
- checkMissingIterableValueType: false
paths:
- src
diff --git a/src/Diactoros/ServerRequestFactory.php b/src/Diactoros/ServerRequestFactory.php
index 3fcf8e29..6a42f207 100644
--- a/src/Diactoros/ServerRequestFactory.php
+++ b/src/Diactoros/ServerRequestFactory.php
@@ -11,12 +11,14 @@ namespace Spiral\RoadRunner\Diactoros;
use Psr\Http\Message\ServerRequestFactoryInterface;
use Psr\Http\Message\ServerRequestInterface;
-use Zend\Diactoros\ServerRequest;
+use Laminas\Diactoros\ServerRequest;
final class ServerRequestFactory implements ServerRequestFactoryInterface
{
/**
* @inheritdoc
+ *
+ * @param array<mixed> $serverParams Array of SAPI parameters with which to seed the generated request instance.
*/
public function createServerRequest(string $method, $uri, array $serverParams = []): ServerRequestInterface
{
diff --git a/src/Diactoros/StreamFactory.php b/src/Diactoros/StreamFactory.php
index cc0a5306..68a77e92 100644
--- a/src/Diactoros/StreamFactory.php
+++ b/src/Diactoros/StreamFactory.php
@@ -12,7 +12,7 @@ namespace Spiral\RoadRunner\Diactoros;
use RuntimeException;
use Psr\Http\Message\StreamFactoryInterface;
use Psr\Http\Message\StreamInterface;
-use Zend\Diactoros\Stream;
+use Laminas\Diactoros\Stream;
final class StreamFactory implements StreamFactoryInterface
{
diff --git a/src/Diactoros/UploadedFileFactory.php b/src/Diactoros/UploadedFileFactory.php
index 45773287..daa475c1 100644
--- a/src/Diactoros/UploadedFileFactory.php
+++ b/src/Diactoros/UploadedFileFactory.php
@@ -12,7 +12,7 @@ namespace Spiral\RoadRunner\Diactoros;
use Psr\Http\Message\StreamInterface;
use Psr\Http\Message\UploadedFileFactoryInterface;
use Psr\Http\Message\UploadedFileInterface;
-use Zend\Diactoros\UploadedFile;
+use Laminas\Diactoros\UploadedFile;
final class UploadedFileFactory implements UploadedFileFactoryInterface
{
diff --git a/src/HttpClient.php b/src/HttpClient.php
index 4ca152c8..9b9048ca 100644
--- a/src/HttpClient.php
+++ b/src/HttpClient.php
@@ -62,14 +62,13 @@ final class HttpClient
*/
public function respond(int $status, string $body, array $headers = []): void
{
- if (empty($headers)) {
- // this is required to represent empty header set as map and not as array
- $headers = new \stdClass();
- }
+ $sendHeaders = empty($headers)
+ ? new \stdClass() // this is required to represent empty header set as map and not as array
+ : $headers;
$this->getWorker()->send(
$body,
- (string) json_encode(['status' => $status, 'headers' => $headers])
+ (string) json_encode(['status' => $status, 'headers' => $sendHeaders])
);
}
}