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));
     }
 }