Merge pull request #4728 from annando/dfrn-send

The Diaspora transport layer is now the default for DFRN
This commit is contained in:
Hypolite Petovan 2018-04-02 18:08:42 -04:00 committed by GitHub
commit 933042f26d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -1146,13 +1146,20 @@ class DFRN
* @param string $atom Content that will be transmitted * @param string $atom Content that will be transmitted
* @param bool $dissolve (to be documented) * @param bool $dissolve (to be documented)
* *
* @return int Deliver status. -1 means an error. * @return int Deliver status. Negative values mean an error.
* @todo Add array type-hint for $owner, $contact * @todo Add array type-hint for $owner, $contact
*/ */
public static function deliver($owner, $contact, $atom, $dissolve = false) public static function deliver($owner, $contact, $atom, $dissolve = false)
{ {
$a = get_app(); $a = get_app();
// At first try the Diaspora transport layer
$ret = self::transmit($owner, $contact, $atom);
if ($ret >= 200) {
logger('Delivery via Diaspora transport layer was successful with status ' . $ret);
return $ret;
}
$idtosend = $orig_id = (($contact['dfrn-id']) ? $contact['dfrn-id'] : $contact['issued-id']); $idtosend = $orig_id = (($contact['dfrn-id']) ? $contact['dfrn-id'] : $contact['issued-id']);
if ($contact['duplex'] && $contact['dfrn-id']) { if ($contact['duplex'] && $contact['dfrn-id']) {
@ -1370,15 +1377,15 @@ class DFRN
} }
/** /**
* @brief Delivers items to the contacts via the Diaspora transport layer * @brief Transmits atom content to the contacts via the Diaspora transport layer
* *
* @param array $owner Owner record * @param array $owner Owner record
* @param array $contact Contact record of the receiver * @param array $contact Contact record of the receiver
* @param array $items Items that will be transmitted * @param string $atom Content that will be transmitted
* *
* @return int HTTP Deliver status * @return int Deliver status. Negative values mean an error.
*/ */
public static function buildAndTransmit($owner, $contact, $items) public static function transmit($owner, $contact, $atom)
{ {
$a = get_app(); $a = get_app();
@ -1386,24 +1393,50 @@ class DFRN
// $public_batch = !$items[0]['private']; // $public_batch = !$items[0]['private'];
$public_batch = false; $public_batch = false;
$msg = DFRN::entries($items, $owner);
$fcontact = Diaspora::personByHandle($contact['addr']); $fcontact = Diaspora::personByHandle($contact['addr']);
if (empty($fcontact)) { if (empty($fcontact)) {
logger("unable to find contact details"); logger("unable to find contact details");
return; return;
} }
$envelope = Diaspora::buildMessage($msg, $owner, $contact, $owner['uprvkey'], $fcontact['pubkey'], $public_batch); $envelope = Diaspora::buildMessage($atom, $owner, $contact, $owner['uprvkey'], $fcontact['pubkey'], $public_batch);
$dest_url = ($public_batch ? $fcontact["batch"] : $contact["notify"]); $dest_url = ($public_batch ? $fcontact["batch"] : $contact["notify"]);
$content_type = ($public_batch ? "application/magic-envelope+xml" : "application/json"); $content_type = ($public_batch ? "application/magic-envelope+xml" : "application/json");
$ret = Network::post($dest_url, $envelope, ["Content-Type: ".$content_type]); $xml = Network::post($dest_url, $envelope, ["Content-Type: ".$content_type]);
/// @ToDo: Add better treatment of return codes $curl_stat = $a->get_curl_code();
return $a->get_curl_code(); if (!$curl_stat || empty($xml)) {
return -9; // timed out
}
if (($curl_stat == 503) && (stristr($a->get_curl_headers(), 'retry-after'))) {
return -10;
}
if (strpos($xml, '<?xml') === false) {
logger('no valid XML returned');
logger('returned XML: ' . $xml, LOGGER_DATA);
return 3;
}
$res = XML::parseString($xml);
if (!isset($res->status)) {
return -11;
}
if (!empty($res->message)) {
logger('Transmit returned status '.$res->status.' - '.$res->message, LOGGER_DEBUG);
}
if ($res->status == 200) {
Contact::unmarkForArchival($contact);
}
return intval($res->status);
} }
/** /**