$data, '$encoding' => $encoding, '$algorithm' => $algorithm, '$keyhash' => $keyhash, '$signature' => $signature )); // slap them $redirects = 0; $ret = z_post_url($url,$salmon, $redirects, array('headers' => array( 'Content-type: application/magic-envelope+xml', 'Content-length: ' . strlen($salmon)) )); $return_code = $ret['return_code']; // check for success, e.g. 2xx if($return_code > 299) { logger('compliant salmon failed. Falling back to status.net hack2'); // Entirely likely that their salmon implementation is // non-compliant. Let's try once more, this time only signing // the data, without stripping '=' chars $salmon = replace_macros($salmon_tpl,array( '$data' => $data, '$encoding' => $encoding, '$algorithm' => $algorithm, '$keyhash' => $keyhash, '$signature' => $signature2 )); $redirects = 0; $ret = z_post_url($url,$salmon, $redirects, array('headers' => array( 'Content-type: application/magic-envelope+xml', 'Content-length: ' . strlen($salmon)) )); $return_code = $ret['return_code']; if($return_code > 299) { logger('compliant salmon failed. Falling back to status.net hack3'); // Entirely likely that their salmon implementation is // non-compliant. Let's try once more, this time only signing // the data, without the precomputed blob $salmon = replace_macros($salmon_tpl,array( '$data' => $data, '$encoding' => $encoding, '$algorithm' => $algorithm, '$keyhash' => $keyhash, '$signature' => $signature3 )); $redirects = 0; $ret = z_post_url($url,$salmon, $redirects, array('headers' => array( 'Content-type: application/magic-envelope+xml', 'Content-length: ' . strlen($salmon)) )); $return_code = $ret['return_code']; } } logger('slapper for ' . $url . ' returned ' . $return_code); if(! $return_code) return(-1); if(($return_code == 503) && (stristr($ret['header'],'retry-after'))) return(-1); return ((($return_code >= 200) && ($return_code < 300)) ? 0 : 1); }