if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
function ping_broadcast_notice($notice) {
+ if ($notice->is_local != Notice::LOCAL_PUBLIC && $notice->is_local != Notice::LOCAL_NONPUBLIC) {
+ return true;
+ }
- if (!$notice->is_local) {
- return true;
- }
+ // Array of servers, URL => type
+ $notify = common_config('ping', 'notify');
+ try {
+ $profile = $notice->getProfile();
+ } catch (Exception $e) {
+ // @todo: distinguish the 'broken notice/profile' case from more general
+ // transitory errors.
+ common_log(LOG_ERR, "Exception getting notice profile: " . $e->getMessage());
+ return true;
+ }
+ $tags = ping_notice_tags($notice);
- # Array of servers, URL => type
- $notify = common_config('ping', 'notify');
- $profile = $notice->getProfile();
- $tags = ping_notice_tags($notice);
+ foreach ($notify as $notify_url => $type) {
+ switch ($type) {
+ case 'xmlrpc':
+ case 'extended':
+ $req = xmlrpc_encode_request('weblogUpdates.ping',
+ array($profile->nickname, # site name
+ common_local_url('showstream',
+ array('nickname' => $profile->nickname)),
+ common_local_url('shownotice',
+ array('notice' => $notice->id)),
+ common_local_url('userrss',
+ array('nickname' => $profile->nickname)),
+ $tags));
- foreach ($notify as $notify_url => $type) {
- switch ($type) {
- case 'xmlrpc':
- case 'extended':
- $req = xmlrpc_encode_request('weblogUpdates.ping',
- array($profile->nickname, # site name
- common_local_url('showstream',
- array('nickname' => $profile->nickname)),
- common_local_url('shownotice',
- array('notice' => $notice->id)),
- common_local_url('userrss',
- array('nickname' => $profile->nickname)),
- $tags));
-
- $context = stream_context_create(array('http' => array('method' => "POST",
- 'header' =>
- "Content-Type: text/xml\r\n".
- "User-Agent: StatusNet/".STATUSNET_VERSION."\r\n",
- 'content' => $req)));
- $file = file_get_contents($notify_url, false, $context);
+ $request = HTTPClient::start();
+ $request->setConfig('connect_timeout', common_config('ping', 'timeout'));
+ $request->setConfig('timeout', common_config('ping', 'timeout'));
+ try {
+ $httpResponse = $request->post($notify_url, array('Content-Type: text/xml'), $req);
+ } catch (Exception $e) {
+ common_log(LOG_ERR,
+ "Exception pinging $notify_url: " . $e->getMessage());
+ continue;
+ }
- if ($file === false || mb_strlen($file) == 0) {
+ if (!$httpResponse || mb_strlen($httpResponse->getBody()) == 0) {
common_log(LOG_WARNING,
"XML-RPC empty results for ping ($notify_url, $notice->id) ");
continue;
}
- $response = xmlrpc_decode($file);
+ $response = xmlrpc_decode($httpResponse->getBody());
if (is_array($response) && xmlrpc_is_fault($response)) {
common_log(LOG_WARNING,
"Ping success for $notify_url $notice->id");
}
break;
-
- case 'get':
- case 'post':
+ case 'get':
+ case 'post':
$args = array('name' => $profile->nickname,
'url' => common_local_url('showstream',
array('nickname' => $profile->nickname)),
if ($type === 'get') {
$result = $fetcher->get($notify_url . '?' . http_build_query($args),
- array('User-Agent: StatusNet/'.STATUSNET_VERSION));
+ array('User-Agent: ' . HTTPClient::userAgent()));
} else {
$result = $fetcher->post($notify_url,
http_build_query($args),
- array('User-Agent: StatusNet/'.STATUSNET_VERSION));
+ array('User-Agent: ' . HTTPClient::userAgent()));
}
if ($result->status != '200') {
common_log(LOG_WARNING,
"'$result->body'");
}
break;
-
- default:
- common_log(LOG_WARNING, 'Unknown notify type for ' . $notify_url . ': ' . $type);
+ default:
+ common_log(LOG_WARNING, 'Unknown notify type for ' . $notify_url . ': ' . $type);
}
- }
+ }
return true;
}
function ping_notice_tags($notice) {
- $tag = new Notice_tag();
- $tag->notice_id = $notice->id;
- $tags = array();
- if ($tag->find()) {
- while ($tag->fetch()) {
- $tags[] = $tag->tag;
- }
- $tag->free();
- unset($tag);
- return implode('|', $tags);
- }
- return NULL;
-}
\ No newline at end of file
+ $tag = new Notice_tag();
+ $tag->notice_id = $notice->id;
+ $tags = array();
+ if ($tag->find()) {
+ while ($tag->fetch()) {
+ $tags[] = $tag->tag;
+ }
+ $tag->free();
+ unset($tag);
+ return implode('|', $tags);
+ }
+ return NULL;
+}