Skip to content

Commit 5acc02c

Browse files
authored
Fix consume PSR body streams when determining size (#756)
1 parent 88e5576 commit 5acc02c

File tree

2 files changed

+56
-3
lines changed

2 files changed

+56
-3
lines changed

src/Sentry/Laravel/EventHandler.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -291,8 +291,8 @@ protected function httpClientResponseReceivedHandler(HttpClientEvents\ResponseRe
291291
'status_code' => $event->response->status(),
292292
'http.query' => $fullUri->getQuery(),
293293
'http.fragment' => $fullUri->getFragment(),
294-
'request_body_size' => strlen($event->request->body()),
295-
'response_body_size' => strlen($event->response->body()),
294+
'request_body_size' => $event->request->toPsrRequest()->getBody()->getSize(),
295+
'response_body_size' => $event->response->toPsrResponse()->getBody()->getSize(),
296296
]
297297
));
298298
}
@@ -315,7 +315,7 @@ protected function httpClientConnectionFailedHandler(HttpClientEvents\Connection
315315
'method' => $event->request->method(),
316316
'http.query' => $fullUri->getQuery(),
317317
'http.fragment' => $fullUri->getFragment(),
318-
'request_body_size' => strlen($event->request->body()),
318+
'request_body_size' => $event->request->toPsrRequest()->getBody()->getSize(),
319319
]
320320
));
321321
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
<?php
2+
3+
namespace Sentry\Laravel\Tests\Features;
4+
5+
use GuzzleHttp\Psr7\Request as PsrRequest;
6+
use GuzzleHttp\Psr7\Response as PsrResponse;
7+
use Illuminate\Http\Client\Events\ResponseReceived;
8+
use Illuminate\Http\Client\Request;
9+
use Illuminate\Http\Client\Response;
10+
use Sentry\Laravel\Tests\TestCase;
11+
12+
class HttpClientIntegrationTest extends TestCase
13+
{
14+
protected function setUp(): void
15+
{
16+
if (!class_exists(ResponseReceived::class)) {
17+
$this->markTestSkipped('The Laravel HTTP client events are only available in Laravel 8.0+');
18+
}
19+
20+
parent::setUp();
21+
}
22+
23+
public function testHttpClientBreadcrumbIsRecordedForResponseReceivedEvent(): void
24+
{
25+
$this->dispatchLaravelEvent(new ResponseReceived(
26+
new Request(new PsrRequest('GET', 'https://example.com', [], 'request')),
27+
new Response(new PsrResponse(200, [], 'response'))
28+
));
29+
30+
$this->assertCount(1, $this->getCurrentBreadcrumbs());
31+
32+
$metadata = $this->getLastBreadcrumb()->getMetadata();
33+
34+
$this->assertEquals('GET', $metadata['method']);
35+
$this->assertEquals('https://example.com', $metadata['url']);
36+
$this->assertEquals(200, $metadata['status_code']);
37+
$this->assertEquals(7, $metadata['request_body_size']);
38+
$this->assertEquals(8, $metadata['response_body_size']);
39+
}
40+
41+
public function testHttpClientBreadcrumbDoesntConsumeBodyStream(): void
42+
{
43+
$this->dispatchLaravelEvent(new ResponseReceived(
44+
$request = new Request(new PsrRequest('GET', 'https://example.com', [], 'request')),
45+
$response = new Response(new PsrResponse(200, [], 'response'))
46+
));
47+
48+
$this->assertCount(1, $this->getCurrentBreadcrumbs());
49+
50+
$this->assertEquals('request', $request->toPsrRequest()->getBody()->getContents());
51+
$this->assertEquals('response', $response->toPsrResponse()->getBody()->getContents());
52+
}
53+
}

0 commit comments

Comments
 (0)