Accept XML responses in connector runtime

This commit is contained in:
Terranom674
2026-08-17 21:38:15 +02:00
parent 9ae3c79a0b
commit 8216a8c508

View File

@@ -21,7 +21,7 @@ function http_request($url, array $fields, array $headers = array(), $cookie_fil
CURLOPT_CONNECTTIMEOUT => 10, CURLOPT_CONNECTTIMEOUT => 10,
CURLOPT_TIMEOUT => 900, CURLOPT_TIMEOUT => 900,
CURLOPT_FOLLOWLOCATION => false, CURLOPT_FOLLOWLOCATION => false,
CURLOPT_USERAGENT => 'Bratonien-NC-Connector/0.9.3.17', CURLOPT_USERAGENT => 'Bratonien-NC-Connector/0.9.3.18',
); );
if ($headers) if ($headers)
{ {
@@ -51,12 +51,67 @@ function http_request($url, array $fields, array $headers = array(), $cookie_fil
return (string)$body; return (string)$body;
} }
function xml_value_sync(SimpleXMLElement $node)
{
$children = $node->children();
if (count($children) === 0)
{
return (string)$node;
}
$result = array();
foreach ($children as $name => $child)
{
$value = xml_value_sync($child);
if (array_key_exists($name, $result))
{
if (!is_array($result[$name]) || !array_is_list($result[$name]))
{
$result[$name] = array($result[$name]);
}
$result[$name][] = $value;
}
else
{
$result[$name] = $value;
}
}
return $result;
}
function decode_ws($body) function decode_ws($body)
{ {
$decoded = json_decode((string)$body, true); $decoded = json_decode((string)$body, true);
if (!is_array($decoded)) if (!is_array($decoded))
{ {
fail_sync('Piwigo lieferte keine gueltige JSON-Antwort.'); if (!function_exists('simplexml_load_string'))
{
fail_sync('Piwigo lieferte XML, aber SimpleXML ist nicht verfuegbar.');
}
$previous = libxml_use_internal_errors(true);
$xml = simplexml_load_string((string)$body);
libxml_clear_errors();
libxml_use_internal_errors($previous);
if ($xml === false || $xml->getName() !== 'rsp')
{
fail_sync('Piwigo lieferte weder gueltiges JSON noch eine gueltige XML-Webservice-Antwort.');
}
$decoded = array('stat'=>(string)$xml['stat']);
foreach ($xml->children() as $name => $child)
{
$value = xml_value_sync($child);
if (array_key_exists($name, $decoded))
{
if (!is_array($decoded[$name]) || !array_is_list($decoded[$name]))
{
$decoded[$name] = array($decoded[$name]);
}
$decoded[$name][] = $value;
}
else
{
$decoded[$name] = $value;
}
}
} }
if (($decoded['stat'] ?? '') !== 'ok') if (($decoded['stat'] ?? '') !== 'ok')
{ {
@@ -176,7 +231,7 @@ try
{ {
$headers = array( $headers = array(
'X-PIWIGO-API: '.$api['key_id'].':'.$api['key_secret'], 'X-PIWIGO-API: '.$api['key_id'].':'.$api['key_secret'],
'Accept: application/json', 'Accept: application/json, text/xml;q=0.9',
'Content-Type: application/x-www-form-urlencoded', 'Content-Type: application/x-www-form-urlencoded',
); );
decode_ws(http_request( decode_ws(http_request(
@@ -220,7 +275,7 @@ try
try try
{ {
$login = decode_ws(http_request( decode_ws(http_request(
$base_url.'/ws.php?format=json', $base_url.'/ws.php?format=json',
array('method'=>'pwg.session.login', 'username'=>$fallback_user, 'password'=>$fallback_password), array('method'=>'pwg.session.login', 'username'=>$fallback_user, 'password'=>$fallback_password),
array(), array(),