diff --git a/agent/src/EnvelopeForwarder.php b/agent/src/EnvelopeForwarder.php index 74ab556..7ce5b51 100644 --- a/agent/src/EnvelopeForwarder.php +++ b/agent/src/EnvelopeForwarder.php @@ -92,17 +92,27 @@ public function forward(Envelope $envelope): PromiseInterface 'sentry_key=' . $dsn->getPublicKey(), ]; - // @TODO: Implement any number of missing options like the user-agent, encoding, proxy etc. + $headers = [ + 'User-Agent' => $client, + 'Content-Type' => Envelope::CONTENT_TYPE, + 'X-Sentry-Auth' => 'Sentry ' . implode(', ', $authHeader), + ]; + + $body = (string) $envelope; + + if (\extension_loaded('zlib')) { + $compressedBody = gzcompress($body, -1, \ZLIB_ENCODING_GZIP); + + if ($compressedBody !== false) { + $headers['Content-Encoding'] = 'gzip'; + $body = $compressedBody; + } + } - // @TODO: We might want to replace this Browser API with a cURL implementation using curl_multi_exec return (new Browser())->withTimeout($this->timeout)->post( $dsn->getEnvelopeApiEndpointUrl(), - [ - 'User-Agent' => $client, - 'Content-Type' => Envelope::CONTENT_TYPE, - 'X-Sentry-Auth' => 'Sentry ' . implode(', ', $authHeader), - ], - (string) $envelope + $headers, + $body )->then(function (ResponseInterface $response) use ($rateLimiter) { $rateLimiter->handleResponse( new Response($response->getStatusCode(), $response->getHeaders(), $response->getStatusCode() > 400 ? $response->getBody()->getContents() : '') diff --git a/agent/tests/AgentForwardingTest.php b/agent/tests/AgentForwardingTest.php index ab65298..5b7423d 100644 --- a/agent/tests/AgentForwardingTest.php +++ b/agent/tests/AgentForwardingTest.php @@ -61,6 +61,27 @@ public function testAgentForwardsMultipleEnvelopesToUpstream(): void $this->assertEquals(2, $serverOutput['request_count']); } + public function testAgentCompressesEnvelopeToUpstream(): void + { + if (!\extension_loaded('zlib')) { + $this->markTestSkipped('The zlib extension is required to test envelope compression.'); + } + + $serverAddress = $this->startTestServer(); + + $dsn = "http://publickey:@{$serverAddress}/200"; + + $this->startTestAgent(); + $this->sendEnvelopeToAgent($this->createEnvelope($dsn, 'Compressed message')); + $this->stopTestAgent(); + + $serverOutput = $this->stopTestServer(); + + $this->assertTrue($serverOutput['compressed']); + $this->assertEquals('gzip', $serverOutput['headers']['Content-Encoding']); + $this->assertStringContainsString('Compressed message', $serverOutput['body']); + } + public function testAgentRespectsRateLimiting(): void { $serverAddress = $this->startTestServer(); diff --git a/bin/sentry-agent b/bin/sentry-agent index 93990e2..08a0bc0 100755 Binary files a/bin/sentry-agent and b/bin/sentry-agent differ diff --git a/bin/sentry-agent.sig b/bin/sentry-agent.sig index 5682139..164e9dd 100644 --- a/bin/sentry-agent.sig +++ b/bin/sentry-agent.sig @@ -1 +1 @@ -F3CE4B37DC4AC5C3890CC9497A95351E29641DA3BAD0699B727A8D77002C6B36913EB82B55ACB1BA683D27CBAF123007D2CE68AA10773CF4012292D38E5F1904 +C779A799D4389C7E52048F1271B64B01DFFBD75C59E111C5DB180004E980D2CD6F56D59FDD14825EE3F6F8F002F5405D0CB97FB46199D730C7FDB77D4BB5A9A4