+ // Based on https://github.com/indieweb/mention-client-php
+ // which is licensed Apache 2.0
+ function getWebmention($result) {
+ if (isset($result->headers['Link'])) {
+ // 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];
+ }
+ }
+
+ // FIXME: Do proper DOM traversal
+ 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 (Exception $e) {
+ common_log(LOG_WARNING, "Webmention request failed for '{$url}' ({$endpoint}): {$e->getMessage()}");
+ }
+ }
+