Files
geo/api/src/Core/Response.php

100 lines
3.8 KiB
PHP
Executable File

<?php
declare(strict_types=1);
class Response {
public static function json(array $data, int $status = 200): void {
// Nettoyer tout buffer existant
while (ob_get_level() > 0) {
ob_end_clean();
}
// Headers CORS pour permettre les requêtes cross-origin (applications mobiles)
$origin = $_SERVER['HTTP_ORIGIN'] ?? '*';
// Configurer les headers CORS
header("Access-Control-Allow-Origin: $origin");
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Origin, Content-Type, X-Auth-Token, Authorization, X-Requested-With, X-App-Identifier, X-Client-Type');
header('Access-Control-Expose-Headers: Content-Length, X-Kuma-Revision');
// Définir les headers de réponse
header('Content-Type: application/json; charset=utf-8');
header('X-Content-Type-Options: nosniff');
// Définir le code de statut
http_response_code($status);
// Ajouter status et message à la réponse si non présents
if (!isset($data['status'])) {
if ($status >= 200 && $status < 300) {
$data['status'] = 'success';
} else {
$data['status'] = 'error';
}
}
if (!isset($data['message']) && isset($data['error'])) {
$data['message'] = $data['error'];
}
// Sanitize data to ensure valid UTF-8 before encoding
$sanitizedData = self::sanitizeForJson($data);
// Encoder et envoyer la réponse
$jsonResponse = json_encode($sanitizedData, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
// Vérifier si l'encodage a échoué
if ($jsonResponse === false) {
error_log('Erreur d\'encodage JSON: ' . json_last_error_msg());
$jsonResponse = json_encode([
'status' => 'error',
'message' => 'Erreur d\'encodage de la réponse',
'debug_info' => json_last_error_msg()
]);
}
// Log de débogage (désactivé car peut causer des problèmes avec de grandes réponses)
// error_log('Envoi de la réponse JSON: ' . $jsonResponse);
// Envoyer la réponse
echo $jsonResponse;
// S'assurer que tout est envoyé
flush();
// Terminer l'exécution pour éviter d'envoyer du contenu supplémentaire
exit;
}
/**
* Sanitize data recursively to ensure valid UTF-8 encoding for JSON
*
* @param mixed $data The data to sanitize
* @return mixed The sanitized data
*/
private static function sanitizeForJson($data) {
if (is_string($data)) {
// Replace invalid UTF-8 characters
if (!mb_check_encoding($data, 'UTF-8')) {
// Try to convert from other encodings
$encodings = ['ISO-8859-1', 'Windows-1252'];
foreach ($encodings as $encoding) {
$converted = mb_convert_encoding($data, 'UTF-8', $encoding);
if (mb_check_encoding($converted, 'UTF-8')) {
return $converted;
}
}
// If conversion fails, strip invalid characters
return mb_convert_encoding($data, 'UTF-8', 'UTF-8');
}
return $data;
} else if (is_array($data)) {
// Recursively sanitize array elements
foreach ($data as $key => $value) {
$data[$key] = self::sanitizeForJson($value);
}
}
return $data;
}
}