diff --git a/appsec/tests/integration/src/test/groovy/com/datadog/appsec/php/integration/RoadRunnerTests.groovy b/appsec/tests/integration/src/test/groovy/com/datadog/appsec/php/integration/RoadRunnerTests.groovy index 40cd5c2c7a..c78be8fb5c 100644 --- a/appsec/tests/integration/src/test/groovy/com/datadog/appsec/php/integration/RoadRunnerTests.groovy +++ b/appsec/tests/integration/src/test/groovy/com/datadog/appsec/php/integration/RoadRunnerTests.groovy @@ -39,8 +39,7 @@ class RoadRunnerTests implements WorkerStrategyTests { baseTag: 'php', phpVersion: phpVersion, phpVariant: variant, - www: 'roadrunner', - www_src: '_handlers', + www: '../../../tests/Frameworks/Roadrunner/Version_2', ).withEnv 'DD_REMOTE_CONFIG_ENABLED', 'false' @BeforeAll diff --git a/appsec/tests/integration/src/test/www/roadrunner/composer.json b/appsec/tests/integration/src/test/www/roadrunner/composer.json deleted file mode 100644 index 13835fa996..0000000000 --- a/appsec/tests/integration/src/test/www/roadrunner/composer.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "require": { - "spiral/roadrunner": "2.12.3", - "nyholm/psr7": "^1.0" - }, - "autoload": { - "psr-4": { - "App\\": "src/", - "Adapters\\": "adapters/" - } - } -} diff --git a/appsec/tests/integration/src/test/www/roadrunner/worker.php b/appsec/tests/integration/src/test/www/roadrunner/worker.php deleted file mode 100644 index 2633cf48a0..0000000000 --- a/appsec/tests/integration/src/test/www/roadrunner/worker.php +++ /dev/null @@ -1,59 +0,0 @@ -addRoute('/', new \App\HomePageHandler()); -// default path TelemetryHelpers uses to flush non-request-bound telemetry -$router->addRoute('/hello.php', new \App\HomePageHandler()); -$router->addRoute('/json', new \App\JsonHandler()); -$router->addRoute('/xml', new \App\XmlHandler()); -$router->addRoute('/post-respond-track-user', new \App\PostRespondTrackUserHandler()); -$router->addRoute('/post-respond-rasp', new \App\PostRespondRaspHandler()); - -while ($req = $httpWorker->waitRequest()) { - /** @var \Spiral\RoadRunner\Http\Request $req */ - - // propagation for distributing tracing is not supported for Roadrunner, - // so propagate manually x-datadog-trace-id ourselves - if (isset($req->headers['X-Datadog-Trace-Id'])) { - $span = active_span(); - set_distributed_tracing_context($req->headers['X-Datadog-Trace-Id'][0], "0"); - } - try { - $handler = $router->getHandler(parse_url($req->uri, PHP_URL_PATH)); - if (!$handler) { - throw new \RuntimeException('No handler found for ' . parse_url($req->uri, PHP_URL_PATH)); - } - - /** @var \Nyholm\Psr7\Response $resp */ - $psrReq = new \Adapters\Psr17RequestAdapter($req); - $resp = $handler->handle($psrReq); - - $httpWorker->respond($resp->getStatusCode(), $resp->getBody()->getContents(), $resp->getHeaders()); - } catch (\Throwable $e) { - $httpWorker->respond( - 500, - "handling threw: " . $e->getMessage(), - ['Content-type' => ['text/plain; charset=UTF-8']] - ); - } -// \dd_trace_close_all_spans_and_flush(); - // Post-respond hook: fires after request_shutdown has been sent inside respond(). - if (isset($GLOBALS['_rr_post_respond'])) { - ($GLOBALS['_rr_post_respond'])(); - unset($GLOBALS['_rr_post_respond']); - } -} diff --git a/appsec/tests/integration/src/test/www/roadrunner/.gitignore b/tests/Frameworks/Roadrunner/Version_2/.gitignore similarity index 100% rename from appsec/tests/integration/src/test/www/roadrunner/.gitignore rename to tests/Frameworks/Roadrunner/Version_2/.gitignore diff --git a/appsec/tests/integration/src/test/www/roadrunner/.rr.yaml b/tests/Frameworks/Roadrunner/Version_2/.rr.yaml similarity index 100% rename from appsec/tests/integration/src/test/www/roadrunner/.rr.yaml rename to tests/Frameworks/Roadrunner/Version_2/.rr.yaml diff --git a/appsec/tests/integration/src/test/www/roadrunner/adapters/Psr17RequestAdapter.php b/tests/Frameworks/Roadrunner/Version_2/adapters/Psr17RequestAdapter.php similarity index 100% rename from appsec/tests/integration/src/test/www/roadrunner/adapters/Psr17RequestAdapter.php rename to tests/Frameworks/Roadrunner/Version_2/adapters/Psr17RequestAdapter.php diff --git a/tests/Frameworks/Roadrunner/Version_2/composer.json b/tests/Frameworks/Roadrunner/Version_2/composer.json index e0d24f6ed3..13835fa996 100644 --- a/tests/Frameworks/Roadrunner/Version_2/composer.json +++ b/tests/Frameworks/Roadrunner/Version_2/composer.json @@ -1,6 +1,12 @@ { - "require": { - "spiral/roadrunner-http": "^2.1", - "nyholm/psr7": "^1.5" + "require": { + "spiral/roadrunner": "2.12.3", + "nyholm/psr7": "^1.0" + }, + "autoload": { + "psr-4": { + "App\\": "src/", + "Adapters\\": "adapters/" } + } } diff --git a/appsec/tests/integration/src/test/www/roadrunner/run.sh b/tests/Frameworks/Roadrunner/Version_2/run.sh similarity index 99% rename from appsec/tests/integration/src/test/www/roadrunner/run.sh rename to tests/Frameworks/Roadrunner/Version_2/run.sh index d0ffb2ebef..86b5b34308 100755 --- a/appsec/tests/integration/src/test/www/roadrunner/run.sh +++ b/tests/Frameworks/Roadrunner/Version_2/run.sh @@ -29,4 +29,3 @@ echo datadog.trace.cli_enabled=true >> /etc/php/php.ini ./rr serve >> /tmp/logs/rr.log 2>&1 & tail -n +1 -F "${LOGS_PHP[@]}" - diff --git a/tests/Frameworks/Roadrunner/Version_2/src/HomePageHandler.php b/tests/Frameworks/Roadrunner/Version_2/src/HomePageHandler.php new file mode 100644 index 0000000000..4119f61414 --- /dev/null +++ b/tests/Frameworks/Roadrunner/Version_2/src/HomePageHandler.php @@ -0,0 +1,35 @@ +getQueryParams(); + if (isset($qp['user']) && extension_loaded('ddappsec')) { + \datadog\appsec\track_user_login_success_event( + $qp['user'], + [ + 'email' => 'jean.example@example.com', + 'session_id' => '987654321', + 'role' => 'admin' + ] + ); + } + + $status = 200; + if (isset($qp['status'])) { + $status = (int) $qp['status']; + } + return new Response( + $status, + ['Content-Type' => 'text/plain'], + "Hello world!" + ); + } +} diff --git a/tests/Frameworks/Roadrunner/Version_2/src/JsonHandler.php b/tests/Frameworks/Roadrunner/Version_2/src/JsonHandler.php new file mode 100644 index 0000000000..c9b8fb6bb8 --- /dev/null +++ b/tests/Frameworks/Roadrunner/Version_2/src/JsonHandler.php @@ -0,0 +1,25 @@ +getQueryParams(); + if (isset($qp['block'])) { + $poison = 'block_this'; + } else { + $poison = 'poison'; + } + return new Response( + 200, + ['Content-Type' => 'application/json'], + json_encode(['message' => ['Hello world!', 42, true, $poison]]) + ); + } +} diff --git a/tests/Frameworks/Roadrunner/Version_2/src/PhpInfoHandler.php b/tests/Frameworks/Roadrunner/Version_2/src/PhpInfoHandler.php new file mode 100644 index 0000000000..41f2b8bbef --- /dev/null +++ b/tests/Frameworks/Roadrunner/Version_2/src/PhpInfoHandler.php @@ -0,0 +1,23 @@ + 'text/html'], + $phpinfo + ); + } +} diff --git a/tests/Frameworks/Roadrunner/Version_2/src/PostRespondRaspHandler.php b/tests/Frameworks/Roadrunner/Version_2/src/PostRespondRaspHandler.php new file mode 100644 index 0000000000..03225d20f7 --- /dev/null +++ b/tests/Frameworks/Roadrunner/Version_2/src/PostRespondRaspHandler.php @@ -0,0 +1,29 @@ + 'text/plain'], 'OK'); + } +} diff --git a/tests/Frameworks/Roadrunner/Version_2/src/PostRespondTrackUserHandler.php b/tests/Frameworks/Roadrunner/Version_2/src/PostRespondTrackUserHandler.php new file mode 100644 index 0000000000..cfa5553591 --- /dev/null +++ b/tests/Frameworks/Roadrunner/Version_2/src/PostRespondTrackUserHandler.php @@ -0,0 +1,23 @@ + 'text/plain'], 'OK'); + } +} diff --git a/tests/Frameworks/Roadrunner/Version_2/src/Router.php b/tests/Frameworks/Roadrunner/Version_2/src/Router.php new file mode 100644 index 0000000000..0286afb173 --- /dev/null +++ b/tests/Frameworks/Roadrunner/Version_2/src/Router.php @@ -0,0 +1,16 @@ +routes[$path] = $handler; + } + + public function getHandler($path) { + return $this->routes[$path] ?? null; + } +} diff --git a/tests/Frameworks/Roadrunner/Version_2/src/XmlHandler.php b/tests/Frameworks/Roadrunner/Version_2/src/XmlHandler.php new file mode 100644 index 0000000000..2091d4cfcb --- /dev/null +++ b/tests/Frameworks/Roadrunner/Version_2/src/XmlHandler.php @@ -0,0 +1,27 @@ + + + Jean + poison + +XML; + + return new Response( + 200, + ['Content-Type' => 'application/xml'], + $c + ); + } +} diff --git a/tests/Frameworks/Roadrunner/Version_2/worker.php b/tests/Frameworks/Roadrunner/Version_2/worker.php index fea0e6a6f5..2166060703 100644 --- a/tests/Frameworks/Roadrunner/Version_2/worker.php +++ b/tests/Frameworks/Roadrunner/Version_2/worker.php @@ -2,32 +2,50 @@ require __DIR__ . '/vendor/autoload.php'; -use Nyholm\Psr7\Response; -use Nyholm\Psr7\Factory\Psr17Factory; - -use Spiral\RoadRunner\Worker; -use Spiral\RoadRunner\Http\PSR7Worker; - - -$worker = Worker::create(); -$factory = new Psr17Factory(); -$psr7 = new PSR7Worker($worker, $factory, $factory, $factory); - -while (true) { +use Spiral\RoadRunner; +use Spiral\RoadRunner\Http\HttpWorker; + +$worker = RoadRunner\Worker::create(); +$httpWorker = new HttpWorker($worker); + +$router = new \App\Router(); +$router->addRoute('/', new \App\HomePageHandler()); +// default path TelemetryHelpers uses to flush non-request-bound telemetry +$router->addRoute('/hello.php', new \App\HomePageHandler()); +$router->addRoute('/json', new \App\JsonHandler()); +$router->addRoute('/xml', new \App\XmlHandler()); +$router->addRoute('/post-respond-track-user', new \App\PostRespondTrackUserHandler()); +$router->addRoute('/post-respond-rasp', new \App\PostRespondRaspHandler()); + +while ($req = $httpWorker->waitRequest()) { try { - $request = $psr7->waitRequest(); - } catch (\Throwable $e) { - $psr7->respond(new Response(400)); - continue; - } + $path = parse_url($req->uri, PHP_URL_PATH); - try { - if ($request->getUri()->getPath() == "/error") { - throw new \Exception("Error page"); + // Tracer integration tests use /error to assert the error-span path. + if ($path === '/error') { + throw new \Exception('Error page'); } - $psr7->respond(new Response(200, [], 'Hello RoadRunner!')); + $handler = $router->getHandler($path); + if ($handler) { + /** @var \Nyholm\Psr7\Response $resp */ + $psrReq = new \Adapters\Psr17RequestAdapter($req); + $resp = $handler->handle($psrReq); + $httpWorker->respond($resp->getStatusCode(), $resp->getBody()->getContents(), $resp->getHeaders()); + } else { + // Fallback for tracer tests that hit arbitrary paths (/simple, /simple_view, ...). + $httpWorker->respond(200, 'Hello RoadRunner!', ['Content-type' => ['text/plain; charset=UTF-8']]); + } } catch (\Throwable $e) { - $psr7->respond(new Response(500, [], 'Something Went Wrong!')); + $httpWorker->respond( + 500, + "handling threw: " . $e->getMessage(), + ['Content-type' => ['text/plain; charset=UTF-8']] + ); + } + // Post-respond hook: fires after request_shutdown has been sent inside respond(). + if (isset($GLOBALS['_rr_post_respond'])) { + ($GLOBALS['_rr_post_respond'])(); + unset($GLOBALS['_rr_post_respond']); } }