From 634e93236f0d2b3341cfa660dea70881e6894944 Mon Sep 17 00:00:00 2001 From: Matt Batchelder Date: Sat, 21 Feb 2026 19:02:26 -0500 Subject: [PATCH] Enhance Gitea support and ensure UTF-8 encoding in API requests --- dist/oribi-tech-sync.zip | Bin 43996 -> 44396 bytes includes/api-client.php | 30 ++++++++++++++++++++++++++---- includes/push-client.php | 11 +++++++++-- 3 files changed, 35 insertions(+), 6 deletions(-) diff --git a/dist/oribi-tech-sync.zip b/dist/oribi-tech-sync.zip index 75a06102f562f19ede0878b189393776ea0fa81f..d11c66ab894fd07b36d22883065cbd7a2241899b 100644 GIT binary patch delta 16468 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 diff --git a/includes/api-client.php b/includes/api-client.php index e604946..ff3c009 100644 --- a/includes/api-client.php +++ b/includes/api-client.php @@ -341,14 +341,15 @@ function oribi_sync_fetch_file( string $api_base, string $branch, string $file_p break; case 'gitea': - $url = $api_base . '/raw/' . $encoded_path . '?ref=' . rawurlencode( $branch ); - $accept = 'text/plain'; + // Use /contents/ endpoint which returns base64-encoded content (more reliable) + $url = $api_base . '/contents/' . $encoded_path . '?ref=' . rawurlencode( $branch ); + $accept = 'application/json'; break; case 'github': default: $url = $api_base . '/contents/' . $encoded_path . '?ref=' . rawurlencode( $branch ); - $accept = 'application/vnd.github.raw+json'; + $accept = 'application/vnd.github.raw'; break; } @@ -377,7 +378,28 @@ function oribi_sync_fetch_file( string $api_base, string $branch, string $file_p ); } - return wp_remote_retrieve_body( $response ); + $body = wp_remote_retrieve_body( $response ); + + // For Gitea, the /contents/ endpoint returns base64-encoded content in JSON + if ( $provider === 'gitea' ) { + $decoded = json_decode( $body, true ); + if ( isset( $decoded['content'] ) && is_string( $decoded['content'] ) ) { + $body = base64_decode( $decoded['content'], true ); + if ( $body === false ) { + return new WP_Error( 'oribi_sync_decode_error', 'Failed to decode base64 content from Gitea' ); + } + } + } + + // Validate and fix encoding if necessary (handles non-UTF-8 sources) + if ( ! empty( $body ) ) { + if ( ! mb_check_encoding( $body, 'UTF-8' ) ) { + // Try to convert from common encodings to UTF-8 + $body = mb_convert_encoding( $body, 'UTF-8', 'UTF-8, ISO-8859-1, Windows-1252' ); + } + } + + return $body; } // ─── Tree filtering ─────────────────────────────────────────────────────────── diff --git a/includes/push-client.php b/includes/push-client.php index 6207692..fc644a1 100644 --- a/includes/push-client.php +++ b/includes/push-client.php @@ -87,17 +87,24 @@ function oribi_sync_api_request( string $method, string $url, array $body, strin $headers = array_merge( oribi_sync_auth_headers( $provider, $pat ), [ - 'Content-Type' => 'application/json', + 'Content-Type' => 'application/json; charset=utf-8', 'Accept' => 'application/json', 'User-Agent' => 'Oribi-Sync-WP/' . ORIBI_SYNC_VERSION, ] ); + // Ensure UTF-8 encoding of all body content + array_walk_recursive( $body, function ( &$item ) { + if ( is_string( $item ) && ! mb_check_encoding( $item, 'UTF-8' ) ) { + $item = mb_convert_encoding( $item, 'UTF-8' ); + } + }); + $args = [ 'method' => $method, 'timeout' => 30, 'headers' => $headers, - 'body' => wp_json_encode( $body ), + 'body' => wp_json_encode( $body, JSON_UNESCAPED_UNICODE ), ]; $response = wp_remote_request( $url, $args );