From a89b04966e1f0aa8426b819c57903838c8121157 Mon Sep 17 00:00:00 2001 From: Peter Goodhall Date: Fri, 22 Aug 2025 17:27:35 +0100 Subject: [PATCH] Improve error handling for hams.at API fetch Adds robust error handling and user feedback for failures when fetching satellite data from the hams.at API. The controller now sets error states and messages for connection issues and invalid responses, and the view displays appropriate alerts to users. --- application/controllers/Components.php | 54 ++++++++++++++----- application/views/components/hamsat/table.php | 18 ++++--- 2 files changed, 54 insertions(+), 18 deletions(-) diff --git a/application/controllers/Components.php b/application/controllers/Components.php index 63d80718..ad74a3f8 100644 --- a/application/controllers/Components.php +++ b/application/controllers/Components.php @@ -22,18 +22,49 @@ class Components extends CI_Controller { $data['user_hamsat_key']=''; } $url = 'https://hams.at/api/alerts/upcoming'; - if ($data['user_hamsat_key'] ?? '' != '') { - $options = array( - 'http' => array( - 'method' => 'GET', - 'header' => "Authorization: Bearer ".$data['user_hamsat_key']."\r\n" - ) - ); - $context = stream_context_create($options); - $json = file_get_contents($url, false, $context); - } else { - $json = file_get_contents($url); + + // Initialize error state + $data['error'] = false; + $data['error_message'] = ''; + + try { + if ($data['user_hamsat_key'] ?? '' != '') { + $options = array( + 'http' => array( + 'method' => 'GET', + 'header' => "Authorization: Bearer ".$data['user_hamsat_key']."\r\n", + 'timeout' => 10 // Add timeout to prevent long hangs + ) + ); + $context = stream_context_create($options); + $json = @file_get_contents($url, false, $context); + } else { + $json = @file_get_contents($url, false, stream_context_create(array( + 'http' => array('timeout' => 10) + ))); + } + + // Check if the request failed + if ($json === false) { + $data['error'] = true; + $data['error_message'] = 'Unable to connect to hams.at service. Please check your internet connection or try again later.'; + $data['rovedata'] = null; + } else { + $decoded_data = json_decode($json, true); + if ($decoded_data === null && json_last_error() !== JSON_ERROR_NONE) { + $data['error'] = true; + $data['error_message'] = 'Invalid response received from hams.at service. Please try again later.'; + $data['rovedata'] = null; + } else { + $data['rovedata'] = $decoded_data; + } + } + } catch (Exception $e) { + $data['error'] = true; + $data['error_message'] = 'An error occurred while fetching satellite data. Please try again later.'; + $data['rovedata'] = null; } + $hkey_opt=$this->user_options_model->get_options('hamsat',array('option_name'=>'hamsat_key','option_key'=>'workable'))->result(); if (count($hkey_opt)>0) { $data['user_hamsat_workable_only'] = $hkey_opt[0]->option_value; @@ -42,7 +73,6 @@ class Components extends CI_Controller { } $this->load->model('stations'); - $data['rovedata'] = json_decode($json, true); $data['gridsquare'] = strtoupper($this->stations->find_gridsquare()); // load view diff --git a/application/views/components/hamsat/table.php b/application/views/components/hamsat/table.php index 00774829..d46b4b47 100644 --- a/application/views/components/hamsat/table.php +++ b/application/views/components/hamsat/table.php @@ -12,12 +12,19 @@
Private feed key empty. Please set the feed key in your profile.
+ + + + + +
+ +
- -
- -
- @@ -152,6 +159,5 @@
- \ No newline at end of file