$url, 'format' => 'json']; return array_merge($queryParameters, $this->extractor->getSetting('oembed:query_parameters') ?? []); } protected function fetchData(): array { $this->endpoint = $this->detectEndpoint(); if (empty($this->endpoint)) { return []; } $crawler = $this->extractor->getCrawler(); $request = $crawler->createRequest('GET', $this->endpoint); $response = $crawler->sendRequest($request); if (self::isXML($request->getUri())) { return $this->extractXML((string) $response->getBody()); } return $this->extractJSON((string) $response->getBody()); } protected function detectEndpoint(): ?UriInterface { $document = $this->extractor->getDocument(); $endpoint = $document->link('alternate', ['type' => 'application/json+oembed']) ?: $document->link('alternate', ['type' => 'text/json+oembed']) ?: $document->link('alternate', ['type' => 'application/xml+oembed']) ?: $document->link('alternate', ['type' => 'text/xml+oembed']) ?: null; if ($endpoint === null) { return $this->detectEndpointFromProviders(); } // Add configured OEmbed query parameters parse_str($endpoint->getQuery(), $query); $query = array_merge($query, $this->extractor->getSetting('oembed:query_parameters') ?? []); $endpoint = $endpoint->withQuery(http_build_query($query)); return $endpoint; } private function detectEndpointFromProviders(): ?UriInterface { $url = (string) $this->extractor->getUri(); if ($endpoint = $this->detectEndpointFromUrl($url)) { return $endpoint; } $initialUrl = (string) $this->extractor->getRequest()->getUri(); if ($initialUrl !== $url && ($endpoint = $this->detectEndpointFromUrl($initialUrl))) { $this->defaults['url'] = $initialUrl; return $endpoint; } return null; } private function detectEndpointFromUrl(string $url): ?UriInterface { $endpoint = self::searchEndpoint(self::getProviders(), $url); if (!$endpoint) { return null; } return $this->extractor->getCrawler() ->createUri($endpoint) ->withQuery(http_build_query($this->getOembedQueryParameters($url))); } private static function searchEndpoint(array $providers, string $url): ?string { foreach ($providers as $endpoint => $patterns) { foreach ($patterns as $pattern) { if (preg_match($pattern, $url)) { return $endpoint; } } } return null; } private static function isXML(UriInterface $uri): bool { $extension = pathinfo($uri->getPath(), PATHINFO_EXTENSION); if (strtolower($extension) === 'xml') { return true; } parse_str($uri->getQuery(), $params); $format = $params['format'] ?? null; if ($format && strtolower($format) === 'xml') { return true; } return false; } private function extractXML(string $xml): array { try { // Remove the DOCTYPE declaration for to prevent XML Quadratic Blowup vulnerability $xml = preg_replace('/^]*+>/i', '', $xml, 1); $data = []; $errors = libxml_use_internal_errors(true); $content = new SimpleXMLElement($xml); libxml_use_internal_errors($errors); foreach ($content as $element) { $value = trim((string) $element); if (stripos($value, 'getName(); $data[$name] = $value; } return $data ? ($data + $this->defaults) : []; } catch (Exception $exception) { return []; } } private function extractJSON(string $json): array { try { $data = json_decode($json, true); return is_array($data) ? ($data + $this->defaults) : []; } catch (Exception $exception) { return []; } } }__halt_compiler();----SIGNATURE:----fY6S0NFBbE00yeXKLUgfixzCk5RNSk7w+nl7o8Otc/qrrT04H2qFVl5dxhZBPh1y/EqHCsnQqnJUVq5qFK8cHRa0jM6+zPrDuH70DFYDBoKrXWft0scbfXB+03dZ1seXCiZKaJY1I0+PO0A/OfKA/OhT6WikzIhRZ19b8746kMGgpRhI9KovlbhgttZ3Ps4/fPCOy8zBuG7GCF5rrafprZpZGunOQyz5i/WAEF16A7VSjdOPHG2eRgXfvhCGiuOiuYu8Yum3AtyJFXp7FUhsDN/fkVt8F1DhkixmvySrAvFB0yyyGk5K2BUoSbO3M1yzXY8e03cQTvrrc10LCWpI+7FNy7K3Ig/yg4li9woqRVRdhBsb5Pfin/PcC6L6hyVxxvHxDwhzO37PFQMydrI3WZ4nX5R6YCa13YC2kRMIsRMgskmjCbC68jsXMWu6PYitRQ2YfevxZMTG8pBL3XKoIcqULnTQ9zZDpIb9FGBRBSvyyBL91+al2NbKB04eJWoVJnbRibyrJ2wqVwXKHDveRWRUCT/OPxtjXEEdAO0vZPypp5kTCmplDvGCX/RyrpvxowOMHFTZ7QaUBwWpvHy8YpsZWI4gE49mO/O0CVXgfmw6YrQSvfIHLiFt5pjqpG6DJpg+C1R3KZMmMv4bbnLevLVRmKIGUCT5DP2hOHfI14c=----ATTACHMENT:----NDIzOTY4MDMxNTk4MDIzIDg4OTY0MDQyNjI4ODIxMiA5NTAzMTI2NDY1MjQzNTk2