true, 'message' => 'rate limited']), 429); } $url = 'https://guestbook.sillylaird.ca/api.php?limit=' . $limit; $ctx = stream_context_create([ 'http' => [ 'timeout' => 8, 'user_agent' => 'SillyLaird-GuestbookProxy/1.0', 'ignore_errors' => true, ], 'ssl' => [ 'verify_peer' => true, 'verify_peer_name' => true, ], ]); $raw = @file_get_contents($url, false, $ctx); if ($raw === false) { if (is_file($cacheFile)) { $emit((string)file_get_contents($cacheFile)); } $emit(json_encode(['error' => true, 'message' => 'upstream unavailable']), 502); } $data = json_decode($raw, true); if (!is_array($data) || !isset($data['entries']) || !is_array($data['entries'])) { if (is_file($cacheFile)) { $emit((string)file_get_contents($cacheFile)); } $emit(json_encode(['error' => true, 'message' => 'invalid upstream response']), 502); } $out = json_encode([ 'entries' => array_slice($data['entries'], 0, $limit), 'total' => (int)($data['total'] ?? count($data['entries'])), 'fetched' => time(), ], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); $tmp = $cacheFile . '.tmp'; if (@file_put_contents($tmp, $out, LOCK_EX) !== false) { @rename($tmp, $cacheFile); } $emit($out);