/** * Open a URL and autodetect contained ping/trackback locations * * @access public * @param string The URL to autodetect/try * @param string The URL to our blog * @param string The author of our entry * @param string The title of our entry * @param string The body of our entry * @return null */ function serendipity_reference_autodiscover($loc, $url, $author, $title, $text) { global $serendipity; $timeout = 30; $u = parse_url($loc); if ($u['scheme'] != 'http' && $u['scheme'] != 'https') { return; } elseif ($u['scheme'] == 'https' && !extension_loaded('openssl')) { return; // Trackbacks to HTTPS URLs can only be performed with openssl activated } if (empty($u['port'])) { $u['port'] = 80; $port = ''; } else { $port = ':' . $u['port']; } if (!empty($u['query'])) { $u['path'] .= '?' . $u['query']; } $parsed_loc = $u['scheme'] . '://' . $u['host'] . $port . $u['path']; if (preg_match('@\\.(jpe?g|aiff?|gif|png|pdf|doc|rtf|wave?|mp2|mp4|mpe?g3|mpe?g4|divx|xvid|bz2|mpe?g|avi|mp3|xl?|ppt|pps|xslt?|xsd|zip|tar|t?gz|swf|rm|ram?|exe|mov|qt|midi?|qcp|emf|wmf|snd|pmg|w?bmp|gcd|mms|ogg|ogm|rv|wmv|wma|jad|3g?|jar)$@i', $u['path'])) { // echo '<div>• ' . TRACKBACK_NO_DATA . '</div>'; return; } echo '<div>• ' . sprintf(TRACKBACK_CHECKING, $loc) . '</div>'; flush(); require_once S9Y_PEAR_PATH . 'HTTP/Request.php'; $options = array('allowRedirects' => true, 'maxRedirects' => 5, 'method' => 'GET'); serendipity_plugin_api::hook_event('backend_http_request', $options, 'trackback_detect'); serendipity_request_start(); $req = new HTTP_Request($parsed_loc, $options); $res = $req->sendRequest(); if (PEAR::isError($res)) { echo '<div>• ' . sprintf(TRACKBACK_COULD_NOT_CONNECT, $u['host'], $u['port']) . '</div>'; serendipity_request_end(); return; } $fContent = $req->getResponseBody(); serendipity_request_end(); if (strlen($fContent) != 0) { $trackback_result = serendipity_trackback_autodiscover($fContent, $parsed_loc, $url, $author, $title, $text, $loc); if ($trackback_result == false) { serendipity_pingback_autodiscover($parsed_loc, $fContent, $url); } } else { echo '<div>• ' . TRACKBACK_NO_DATA . '</div>'; } echo '<hr noshade="noshade" />'; }
/** * Open a URL and autodetect contained ping/trackback locations * * @access public * @param string The URL to autodetect/try * @param string The URL to our blog * @param string The author of our entry * @param string The title of our entry * @param string The body of our entry * @return null */ function serendipity_reference_autodiscover($loc, $url, $author, $title, $text) { global $serendipity; $timeout = 30; $u = parse_url($loc); if ($u['scheme'] != 'http' && $u['scheme'] != 'https') { return; } elseif ($u['scheme'] == 'https' && !extension_loaded('openssl')) { return; // Trackbacks to HTTPS URLs can only be performed with openssl activated } if (empty($u['port'])) { $u['port'] = 80; $port = ''; } else { $port = ':' . $u['port']; } if (!empty($u['query'])) { $u['path'] .= '?' . $u['query']; } $parsed_loc = $u['scheme'] . '://' . $u['host'] . $port . $u['path']; if (preg_match('@\\.(jpe?g|aiff?|gif|png|pdf|doc|rtf|wave?|mp2|mp4|mpe?g3|mpe?g4|divx|xvid|bz2|mpe?g|avi|mp3|xl?|ppt|pps|xslt?|xsd|zip|tar|t?gz|swf|rm|ram?|exe|mov|qt|midi?|qcp|emf|wmf|snd|pmg|w?bmp|gcd|mms|ogg|ogm|rv|wmv|wma|jad|3g?|jar)$@i', $u['path'])) { // echo '<div>• ' . TRACKBACK_NO_DATA . '</div>'; return; } echo '<div>• ' . sprintf(TRACKBACK_CHECKING, $loc) . '</div>'; flush(); require_once S9Y_PEAR_PATH . 'HTTP/Request2.php'; $options = array('follow_redirects' => true, 'max_redirects' => 5); serendipity_plugin_api::hook_event('backend_http_request', $options, 'trackback_detect'); serendipity_request_start(); if (version_compare(PHP_VERSION, '5.6.0', '<')) { // On earlier PHP versions, the certificate validation fails. We deactivate it on them to restore the functionality we had with HTTP/Request1 $options['ssl_verify_peer'] = false; } $req = new HTTP_Request2($parsed_loc, HTTP_Request2::METHOD_GET, $options); try { $res = $req->send(); } catch (HTTP_Request2_Exception $e) { echo '<div>• ' . sprintf(TRACKBACK_COULD_NOT_CONNECT, $u['host'], $u['port']) . '</div>'; serendipity_request_end(); return; } $fContent = $res->getBody(); serendipity_request_end(); if (strlen($fContent) != 0) { $trackback_result = serendipity_trackback_autodiscover($fContent, $parsed_loc, $url, $author, $title, $text, $loc); if ($trackback_result == false) { serendipity_pingback_autodiscover($parsed_loc, $fContent, $url); } } else { echo '<div>• ' . TRACKBACK_NO_DATA . '</div>'; } echo '<hr noshade="noshade" />'; }