public static function update() { $file_id = (int) $_REQUEST['file_id']; $file = MediaFile::find_by_id($file_id); if (isset($_REQUEST['slug'])) { self::simulate_temporary_episode_slug($_REQUEST['slug']); } $info = $file->determine_file_size(); $file->save(); $result = array(); $result['file_url'] = $file->get_file_url(); $result['file_id'] = $file_id; $result['reachable'] = podlove_is_resolved_and_reachable_http_status($info['http_code']); $result['file_size'] = $file->size; if (!$result['reachable']) { $info['certinfo'] = print_r($info['certinfo'], true); $info['php_open_basedir'] = ini_get('open_basedir'); $info['php_safe_mode'] = ini_get('safe_mode'); $info['php_curl'] = in_array('curl', get_loaded_extensions()); $info['curl_exec'] = function_exists('curl_exec'); $errorLog = "--- # Can't reach {$file->get_file_url()}\n"; $errorLog .= "--- # Please include this output when you report a bug\n"; foreach ($info as $key => $value) { $errorLog .= "{$key}: {$value}\n"; } \Podlove\Log::get()->addError($errorLog); } Ajax::respond_with_json($result); }
/** * Validate media file headers. * * @todo $this->id not available for first validation before media_file has been saved * @param array $response curl response */ private function validate_request($response) { // skip unsaved media files if (!$this->id) { return; } $header = $response['header']; if ($response['error']) { Log::get()->addError('Curl Error: ' . $response['error'], array('media_file_id' => $this->id)); } // skip validation if ETag did not change if ((int) $header["http_code"] === 304) { return; } // look for ETag and safe for later if (podlove_is_resolved_and_reachable_http_status($header["http_code"]) && preg_match('/ETag:\\s*"([^"]+)"/i', $response['response'], $matches)) { $this->etag = $matches[1]; } else { $this->etag = NULL; } do_action('podlove_media_file_content_has_changed', $this->id); // verify HTTP header if (!preg_match("/^[23]\\d\\d\$/", $header["http_code"])) { Log::get()->addError('Unexpected http response when trying to access remote media file.', array('media_file_id' => $this->id, 'http_code' => $header["http_code"])); return; } // check that content length exists and hasn't changed if (!isset($header['download_content_length']) || $header['download_content_length'] <= 0) { Log::get()->addWarning('Unable to read "Content-Length" header. Impossible to determine file size.', array('media_file_id' => $this->id, 'mime_type' => $header['content_type'], 'expected_mime_type' => $mime_type)); } elseif ($header['download_content_length'] != $this->size) { Log::get()->addInfo('Change of media file content length detected.', array('media_file_id' => $this->id, 'old_size' => $this->size, 'new_size' => $header['download_content_length'])); } // check if mime type matches asset mime type $mime_type = $this->episode_asset()->file_type()->mime_type; if ($header['content_type'] != $mime_type) { Log::get()->addWarning('Media file mime type does not match expected asset mime type.', array('media_file_id' => $this->id, 'mime_type' => $header['content_type'], 'expected_mime_type' => $mime_type)); } }