Http::response( $cp1251, 200, ['Content-Type' => 'application/json; charset=windows-1251'], ), ]); $client = new HttpClient(); $response = $client->get('https://example.com/test'); self::assertSame('Трамп', $client->bodyUtf8($response)); } public function test_force_charset_overrides_header_detection(): void { // "Алена" encoded as Windows-1251 bytes, but the server declares UTF-8. $cp1251 = "\xc0\xeb\xe5\xed\xe0"; Http::fake([ 'example.com/*' => Http::response( $cp1251, 200, ['Content-Type' => 'application/json; charset=utf-8'], ), ]); $client = new HttpClient(); $response = $client->get('https://example.com/test'); // Forcing cp1251 recovers correct Cyrillic regardless of the header. self::assertSame('Алена', $client->bodyUtf8($response, 'Windows-1251')); } public function test_leaves_utf8_body_untouched(): void { Http::fake([ 'example.com/*' => Http::response('Привет', 200, ['Content-Type' => 'application/json; charset=utf-8']), ]); $client = new HttpClient(); $response = $client->get('https://example.com/test'); self::assertSame('Привет', $client->bodyUtf8($response)); } public function test_returns_body_verbatim_when_no_charset(): void { Http::fake([ 'example.com/*' => Http::response('plain ascii', 200, ['Content-Type' => 'text/html']), ]); $client = new HttpClient(); $response = $client->get('https://example.com/test'); self::assertSame('plain ascii', $client->bodyUtf8($response)); } public function test_detects_challenge_redirect(): void { // VK answers 429 on the challenge URL itself; in Http::fake the // effective URI mirrors the request URL, so we hit it directly. Http::fake([ 'vk.com/challenge.html*' => Http::response('challenge', 429), ]); $client = new HttpClient(); $this->expectException(\RuntimeException::class); $this->expectExceptionMessage('JS challenge'); $client->get('https://vk.com/challenge.html?hash429=abc'); } }