forked from GNUsocial/gnu-social
Add webmention support
This commit is contained in:
parent
e4892d21b1
commit
3b1792c8b5
@ -103,21 +103,73 @@ class LinkbackPlugin extends Plugin
|
|||||||
return $orig;
|
return $orig;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// XXX: Should handle relative-URI resolution in these detections
|
||||||
|
|
||||||
|
$wm = $this->getWebmention($result);
|
||||||
|
if(!empty($wm)) {
|
||||||
|
$this->webmention($result->final_url, $wm);
|
||||||
|
} else {
|
||||||
$pb = $this->getPingback($result);
|
$pb = $this->getPingback($result);
|
||||||
if (!empty($pb)) {
|
if (!empty($pb)) {
|
||||||
$this->pingback($result->final_url, $pb);
|
$this->pingback($result->final_url, $pb);
|
||||||
// XXX: Should handle relative-URI resolution in these detections
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
$tb = $this->getTrackback($result);
|
$tb = $this->getTrackback($result);
|
||||||
if (!empty($tb)) {
|
if (!empty($tb)) {
|
||||||
$this->trackback($result->final_url, $tb);
|
$this->trackback($result->final_url, $tb);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return $orig;
|
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) {
|
function getPingback($result) {
|
||||||
if (array_key_exists('X-Pingback', $result->headers)) {
|
if (array_key_exists('X-Pingback', $result->headers)) {
|
||||||
return $result->headers['X-Pingback'];
|
return $result->headers['X-Pingback'];
|
||||||
|
Loading…
Reference in New Issue
Block a user