Hacktoberfest 2026: những issue maintainer đã đánh dấu cho tháng Mười, đang mở và phù hợp người mới. Xem issue Hacktoberfest

HTTP client fails the whole blueprint run if at least one download fails, even when the resource required is for a `continueOnError` step

Đang mở
#107 1 bình luận 0 reaction 1 người được giao Xem trên GitHub

Maintainer thường phản hồi trong vòng 1 ngày

@reimic đang làm issue này rồi.

Từ ngày 8/6/2024.

Đánh giá

Issue này chưa được đánh giá.

Mô tả

blocker bug HTTP Client
Issue:

While writing e2e tests I've noticed the continueOnError functionality does not fully work for steps that download resources.
The client will throw an error that will fail the whole blueprint run if any headers for at least one stream return with a code $code > 399 || $code < 200. This is unexpected as one might think that a CoE step should be able to fail for any reason and do not impact the whole run.

Current behavior is due to this code in streams_send_http_requests:

$headers   = streams_http_response_await_headers( $streams );
		foreach ( array_keys( $headers ) as $k ) {
			$code = $headers[ $k ]['status']['code'];
			if ( $code > 399 || $code < 200 ) {
				throw new Exception( 'Failed to download file ' . $requests[ $k ]->url . ': Server responded with HTTP code ' . $code );
			}
[...]
Example:

For this blueprint:

'{
    "steps":[
        {"step":"installPlugin","pluginZipFile":"https://downloads.wordpress.org/plugin/wordpress-importer.zip"},
	{"step":"installPlugin","pluginZipFile":"https://downloads.wordpress.org/plugin/intentionally-bad-url.zip","continueOnError":true}
    ]
}'

...it can be noticed that the blueprint failed at step 0, while it should not fail at all:

WordPress\Blueprints\Runner\Blueprint\BlueprintRunnerException : Error when executing step installPlugin (number 0 on the list)
[...]

Caused by
Exception: Failed to download file https://downloads.wordpress.org/plugin/intentionally-bad-url.zip: 
Server responded with HTTP code 404
H:\projects\blueprints-library\src\WordPress\AsyncHttp\async_http_streams.php:322
H:\projects\blueprints-library\src\WordPress\AsyncHttp\Client.php:191
Solution:

It seems that doing nothing is better than throwing an exception there.

In my setup the code above is commented out, and multiple InstallPluginSteps are run. An exception for the step with the invalid url is still thrown, but for an issue with activation. (Duh! The resource is not there.) This is then caught in the runner and since that step is continueOnError the exception is suppressed and the blueprint completes. Which is mostly what we want.

But not entirely. Now the issue would be that the InstallPluginStepRunner tries to activate the inexistent plugin and fails. This generates a message that the activation failed, which is only semi-true, because what actually failed is the download.

I imagine the stream context could carry more info on how and why the resource was not procured. This should be checked before activation attempts and a relevant exception should be thrown then. Saying something along the lines of Download failed. Sorry! :)

I have to ponder for a moment how this could be done in detail, however the end result should look more or less like that:

protected function unzipAssetTo( $zipResource, $targetPath ) {
		[...]

		$resource = $this->getResource($zipResource);
		if ( $resource === 'SOMETHING_BAD' ) {
			throw new BlueprintRunnerException("Resource not available because: SOMETHING_BAD");
		}

		$this->getRuntime()->withTemporaryDirectory(
			function ( $tmpPath ) use ( $resource, $targetPath ) {
				[...]
			}
		);
	}
Ngôn ngữ chính
PHP
Star
61
Fork
23
Merge trung bình
20 giờ 9 phút
Pull request đã merge (30 ngày)
7

Chuẩn bị môi trường

Mở trong Codespaces

Khởi chạy dev container của dự án ngay trên trình duyệt, bằng tài khoản GitHub của bạn.

  • Có Dockerfile hoặc tệp Docker Compose
  • Không có mẫu pull request
  • Không có hướng dẫn đóng góp

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của WordPress/php-toolkit

Tất cả issue của WordPress/php-toolkit

Issue tương tự

Thêm issue về PHP

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.