From 623dde7a9d36ad3f19d75c8a8ea3ada8bf5dca37 Mon Sep 17 00:00:00 2001 From: Maelan LE BORGNE Date: Fri, 11 Oct 2024 12:06:24 +0200 Subject: [PATCH 1/3] feat: add trace handling --- src/Builder/DefaultBuilderTrait.php | 30 +++++++++++++++++++++-- src/Builder/GotenbergFileResult.php | 5 ++++ tests/Builder/DefaultBuilderTraitTest.php | 7 ++++++ 3 files changed, 40 insertions(+), 2 deletions(-) diff --git a/src/Builder/DefaultBuilderTrait.php b/src/Builder/DefaultBuilderTrait.php index d125a2b4..d75efb4b 100644 --- a/src/Builder/DefaultBuilderTrait.php +++ b/src/Builder/DefaultBuilderTrait.php @@ -37,6 +37,11 @@ trait DefaultBuilderTrait /** @var ProcessorInterface|null */ private ProcessorInterface|null $processor; + /** + * @var \Closure(): string + */ + private \Closure $traceGenerator; + public function setLogger(LoggerInterface|null $logger): void { $this->logger = $logger; @@ -210,17 +215,38 @@ private function convertToMultipartItems(string $key, array|string|\Stringable|i public function generate(): GotenbergFileResult { - $this->logger?->debug('Processing file using {sensiolabs_gotenberg.builder} builder.', [ + $trace = ($this->traceGenerator ?? self::defaultTraceGenerator(...))(); + $headers = ['Gotenberg-Trace' => $trace]; + + $this->logger?->debug('Processing file with trace "{sensiolabs_gotenberg.trace}" using {sensiolabs_gotenberg.builder} builder.', [ + 'sensiolabs_gotenberg.trace' => $trace, 'sensiolabs_gotenberg.builder' => $this::class, ]); $processor = $this->processor ?? new NullProcessor(); return new GotenbergFileResult( - $this->client->call($this->getEndpoint(), $this->getMultipartFormData()), + $this->client->call($this->getEndpoint(), $this->getMultipartFormData(), $headers), $processor($this->fileName), $this->headerDisposition, $this->fileName, ); } + + /** + * Sets the callable that will generate the trace ID for each operation. + * + * @param \Closure(): string $traceGenerator + */ + public function traceGenerator(\Closure $traceGenerator): static + { + $this->traceGenerator = $traceGenerator; + + return $this; + } + + protected static function defaultTraceGenerator(): string + { + return bin2hex(random_bytes(16)).microtime(true); + } } diff --git a/src/Builder/GotenbergFileResult.php b/src/Builder/GotenbergFileResult.php index d80094de..0e553889 100644 --- a/src/Builder/GotenbergFileResult.php +++ b/src/Builder/GotenbergFileResult.php @@ -45,6 +45,11 @@ public function getContentLength(): int|null return $this->response->getContentLength(); } + public function getTrace(): string + { + return $this->response->getHeaders()->get('Gotenberg-Trace', ''); + } + public function process(): mixed { if (!$this->response->getStream()->valid()) { diff --git a/tests/Builder/DefaultBuilderTraitTest.php b/tests/Builder/DefaultBuilderTraitTest.php index 62851ceb..76c5a13b 100644 --- a/tests/Builder/DefaultBuilderTraitTest.php +++ b/tests/Builder/DefaultBuilderTraitTest.php @@ -107,6 +107,13 @@ public function testCanAssertFileExtensions(): void $this->addToAssertionCount(1); } + public function testTraceGeneration(): void + { + $builder = $this->getBuilder(); + $builder->traceGenerator(fn () => 'foo'); + $this->assertSame('foo', $builder->generate()); + } + private function getBuilder(): object { return new class { From 782225fefeed3aecf5cbcf3727662d3e396442a9 Mon Sep 17 00:00:00 2001 From: Maelan LE BORGNE Date: Fri, 11 Oct 2024 14:07:51 +0200 Subject: [PATCH 2/3] fix: prevent multiple references of defaultTraceGenerator --- src/Builder/DefaultBuilderTrait.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Builder/DefaultBuilderTrait.php b/src/Builder/DefaultBuilderTrait.php index d75efb4b..26903d8c 100644 --- a/src/Builder/DefaultBuilderTrait.php +++ b/src/Builder/DefaultBuilderTrait.php @@ -215,7 +215,8 @@ private function convertToMultipartItems(string $key, array|string|\Stringable|i public function generate(): GotenbergFileResult { - $trace = ($this->traceGenerator ?? self::defaultTraceGenerator(...))(); + $this->traceGenerator ??= $this::defaultTraceGenerator(...); + $trace = ($this->traceGenerator)(); $headers = ['Gotenberg-Trace' => $trace]; $this->logger?->debug('Processing file with trace "{sensiolabs_gotenberg.trace}" using {sensiolabs_gotenberg.builder} builder.', [ From 9fdfc71207450df8fa986a4025ea53091e5c4f1a Mon Sep 17 00:00:00 2001 From: Maelan LE BORGNE Date: Fri, 11 Oct 2024 14:11:43 +0200 Subject: [PATCH 3/3] fix: removed test --- tests/Builder/DefaultBuilderTraitTest.php | 7 ------- 1 file changed, 7 deletions(-) diff --git a/tests/Builder/DefaultBuilderTraitTest.php b/tests/Builder/DefaultBuilderTraitTest.php index 76c5a13b..62851ceb 100644 --- a/tests/Builder/DefaultBuilderTraitTest.php +++ b/tests/Builder/DefaultBuilderTraitTest.php @@ -107,13 +107,6 @@ public function testCanAssertFileExtensions(): void $this->addToAssertionCount(1); } - public function testTraceGeneration(): void - { - $builder = $this->getBuilder(); - $builder->traceGenerator(fn () => 'foo'); - $this->assertSame('foo', $builder->generate()); - } - private function getBuilder(): object { return new class {