Add webmention support
This commit is contained in:
parent
e4892d21b1
commit
3b1792c8b5
@ -103,21 +103,73 @@ class LinkbackPlugin extends Plugin
|
||||
return $orig;
|
||||
}
|
||||
|
||||
$pb = $this->getPingback($result);
|
||||
if (!empty($pb)) {
|
||||
$this->pingback($result->final_url, $pb);
|
||||
// XXX: Should handle relative-URI resolution in these detections
|
||||
|
||||
$wm = $this->getWebmention($result);
|
||||
if(!empty($wm)) {
|
||||
$this->webmention($result->final_url, $wm);
|
||||
} else {
|
||||
$tb = $this->getTrackback($result);
|
||||
if (!empty($tb)) {
|
||||
$this->trackback($result->final_url, $tb);
|
||||
$pb = $this->getPingback($result);
|
||||
if (!empty($pb)) {
|
||||
$this->pingback($result->final_url, $pb);
|
||||
} else {
|
||||
$tb = $this->getTrackback($result);
|
||||
if (!empty($tb)) {
|
||||
$this->trackback($result->final_url, $tb);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $orig;
|
||||
}
|
||||
|
||||
// Based on https://github.com/indieweb/mention-client-php
|
||||
// which is licensed Apache 2.0
|
||||
function getWebmention($result) {
|
||||
// XXX: the fetcher only gives back one of each header, so this may fail on multiple Link headers
|
||||
if(preg_match('~<((?:https?://)?[^>]+)>; rel="webmention"~', $result->headers['Link'], $match)) {
|
||||
return $match[1];
|
||||
} elseif(preg_match('~<((?:https?://)?[^>]+)>; rel="http://webmention.org/?"~', $result->headers['Link'], $match)) {
|
||||
return $match[1];
|
||||
}
|
||||
|
||||
if(preg_match('/<(?:link|a)[ ]+href="([^"]+)"[ ]+rel="[^" ]* ?webmention ?[^" ]*"[ ]*\/?>/i', $result->body, $match)
|
||||
|| preg_match('/<(?:link|a)[ ]+rel="[^" ]* ?webmention ?[^" ]*"[ ]+href="([^"]+)"[ ]*\/?>/i', $result->body, $match)) {
|
||||
return $match[1];
|
||||
} elseif(preg_match('/<(?:link|a)[ ]+href="([^"]+)"[ ]+rel="http:\/\/webmention\.org\/?"[ ]*\/?>/i', $result->body, $match)
|
||||
|| preg_match('/<(?:link|a)[ ]+rel="http:\/\/webmention\.org\/?"[ ]+href="([^"]+)"[ ]*\/?>/i', $result->body, $match)) {
|
||||
return $match[1];
|
||||
}
|
||||
}
|
||||
|
||||
function webmention($url, $endpoint) {
|
||||
$source = $this->notice->getUrl();
|
||||
|
||||
$payload = array(
|
||||
'source' => $source,
|
||||
'target' => $url
|
||||
);
|
||||
|
||||
$request = HTTPClient::start();
|
||||
try {
|
||||
$response = $request->post($endpoint,
|
||||
array(
|
||||
'Content-type: application/x-www-form-urlencoded',
|
||||
'Accept: application/json'
|
||||
),
|
||||
$payload
|
||||
);
|
||||
|
||||
if(!in_array($response->getStatus(), array(200,202))) {
|
||||
common_log(LOG_WARNING,
|
||||
"Webmention request failed for '$url' ($endpoint)");
|
||||
}
|
||||
} catch (HTTP_Request2_Exception $e) {
|
||||
common_log(LOG_WARNING,
|
||||
"Webmention request failed for '$url' ($endpoint)");
|
||||
}
|
||||
}
|
||||
|
||||
function getPingback($result) {
|
||||
if (array_key_exists('X-Pingback', $result->headers)) {
|
||||
return $result->headers['X-Pingback'];
|
||||
|
Loading…
Reference in New Issue
Block a user