diff --git a/src/AssetUploader.php b/src/AssetUploader.php index a63639f..77c94e4 100644 --- a/src/AssetUploader.php +++ b/src/AssetUploader.php @@ -39,14 +39,6 @@ class AssetUploader $filename = basename($filePath); $mimeType = mime_content_type($filePath); - // Try using actual Postman "Create Assets" request if TestRunner available - if ($testRunner) { - $postmanResult = $this->tryPostmanUpload($testRunner, $filePath, $folderId, $filename, $mimeType); - if ($postmanResult !== null) { - return $postmanResult; - } - } - // Get base URL from ApiClient using reflection $baseUrlReflection = new ReflectionProperty($this->apiClient, 'baseUrl'); $baseUrlReflection->setAccessible(true); @@ -74,34 +66,40 @@ class AssetUploader ] ]; - // Build asset_representation - if ($sourceMasterAsset) { - // Use master asset's full metadata structure - $assetRep = $this->buildAssetRepresentationFromMasterAsset($filename, $sourceMasterAsset); - - $postFields = [ - 'asset_representation' => json_encode($assetRep), - 'manifest' => json_encode($uploadManifest), - 'parent_folder_id' => $folderId, - 'files' => new \CURLFile($filePath, $mimeType, $filename) - ]; - } else { - // No master asset - minimal representation (will likely fail) - $minimalRep = [ - 'asset_resource' => [ - 'asset' => [ - 'name' => $filename, - 'security_policy_list' => [['id' => 1594]] + // Build asset_representation with error handling + try { + if ($sourceMasterAsset) { + // Use master asset's metadata + $assetRep = $this->buildAssetRepresentationFromMasterAsset($filename, $sourceMasterAsset); + $assetRepJson = @json_encode($assetRep, JSON_THROW_ON_ERROR); + } else { + // No master asset - minimal representation + $minimalRep = [ + 'asset_resource' => [ + 'asset' => [ + 'name' => $filename, + 'security_policy_list' => [['id' => 1594]] + ] ] - ] - ]; + ]; + $assetRepJson = @json_encode($minimalRep, JSON_THROW_ON_ERROR); + } + + $manifestJson = @json_encode($uploadManifest, JSON_THROW_ON_ERROR); $postFields = [ - 'asset_representation' => json_encode($minimalRep), - 'manifest' => json_encode($uploadManifest), + 'asset_representation' => $assetRepJson, + 'manifest' => $manifestJson, 'parent_folder_id' => $folderId, 'files' => new \CURLFile($filePath, $mimeType, $filename) ]; + } catch (Exception $e) { + return [ + 'success' => false, + 'filename' => $filename, + 'error' => 'JSON encoding error: ' . $e->getMessage(), + 'http_code' => 0 + ]; } // Get authorization header @@ -113,8 +111,20 @@ class AssetUploader $authHeader = $headers['Authorization']; } + // Log auth status + error_log("Upload: Auth header present: " . (!empty($authHeader) ? 'YES' : 'NO')); + if (!empty($authHeader)) { + error_log("Upload: Auth header starts with: " . substr($authHeader, 0, 20) . "..."); + } + // Use curl directly for multipart upload with extended timeout $ch = curl_init(); + + // Log before curl setup + error_log("Upload: Setting up cURL for " . $filename); + error_log("Upload: URL = " . $url); + error_log("Upload: Folder ID = " . $folderId); + curl_setopt_array($ch, [ CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true, @@ -125,64 +135,77 @@ class AssetUploader 'Authorization: ' . $authHeader ], CURLOPT_SSL_VERIFYPEER => false, - CURLOPT_TIMEOUT => 300, // 5 minutes + CURLOPT_TIMEOUT => 60, // Reduce to 1 minute to fail faster CURLOPT_CONNECTTIMEOUT => 30 ]); - // Execute with error suppression to prevent crashes - set_time_limit(300); // Give PHP 5 minutes - $response = @curl_exec($ch); - $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); - $curlError = curl_error($ch); - curl_close($ch); + // Execute with error suppression and timeout handling + try { + set_time_limit(120); // 2 minutes max for PHP + error_log("Upload: About to execute cURL"); + $response = @curl_exec($ch); + error_log("Upload: cURL executed, got response"); + $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + $curlError = curl_error($ch); + curl_close($ch); - if ($curlError) { - return [ - 'success' => false, - 'filename' => $filename, - 'error' => 'CURL error: ' . $curlError, - 'http_code' => 0 - ]; - } - - if ($response === false) { - return [ - 'success' => false, - 'filename' => $filename, - 'error' => 'Upload request failed - no response received', - 'http_code' => 0 - ]; - } - - if ($httpCode == 201) { - $responseData = json_decode($response, true); - - return [ - 'success' => true, - 'asset_id' => $responseData['asset_resource_list']['asset_resource'][0]['asset']['asset_id'] ?? null, - 'filename' => $filename, - 'http_code' => $httpCode - ]; - } - - // Extract detailed error message from API response - $errorMsg = 'Upload failed'; - if (!empty($response)) { - $responseData = json_decode($response, true); - if ($responseData && isset($responseData['exception_body'])) { - $errorMsg = $responseData['exception_body']['message'] ?? $responseData['exception_body']['debug_message'] ?? 'API Error'; - } elseif ($responseData && isset($responseData['error'])) { - $errorMsg = $responseData['error']; + if ($curlError) { + return [ + 'success' => false, + 'filename' => $filename, + 'error' => 'CURL error: ' . $curlError, + 'http_code' => 0 + ]; } - } - return [ - 'success' => false, - 'filename' => $filename, - 'error' => $errorMsg, - 'http_code' => $httpCode, - 'response_body' => $response - ]; + if ($response === false) { + return [ + 'success' => false, + 'filename' => $filename, + 'error' => 'Upload request failed - no response received', + 'http_code' => 0 + ]; + } + + if ($httpCode == 201) { + $responseData = @json_decode($response, true); + + return [ + 'success' => true, + 'asset_id' => $responseData['asset_resource_list']['asset_resource'][0]['asset']['asset_id'] ?? null, + 'filename' => $filename, + 'http_code' => $httpCode + ]; + } + + // Extract detailed error message from API response + $errorMsg = 'Upload failed'; + if (!empty($response)) { + // Limit response size to prevent crashes + $limitedResponse = substr($response, 0, 5000); + $responseData = @json_decode($limitedResponse, true); + if ($responseData && isset($responseData['exception_body'])) { + $errorMsg = $responseData['exception_body']['message'] ?? $responseData['exception_body']['debug_message'] ?? 'API Error'; + } elseif ($responseData && isset($responseData['error'])) { + $errorMsg = $responseData['error']; + } + } + + return [ + 'success' => false, + 'filename' => $filename, + 'error' => $errorMsg, + 'http_code' => $httpCode, + 'response_body' => substr($response ?? '', 0, 1000) // Limit to 1KB + ]; + } catch (Exception $e) { + return [ + 'success' => false, + 'filename' => $filename, + 'error' => 'PHP Exception during upload: ' . $e->getMessage(), + 'http_code' => 0 + ]; + } } /**