Index: includes/common.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/common.inc,v retrieving revision 1.1197 diff -u -p -r1.1197 common.inc --- includes/common.inc 30 Jul 2010 02:47:27 -0000 1.1197 +++ includes/common.inc 30 Jul 2010 10:03:04 -0000 @@ -2805,7 +2805,7 @@ function drupal_get_css($css = NULL) { foreach ($css as $key => $item) { if ($item['type'] == 'file') { // If defined, force a unique basename for this file. - $basename = isset($item['basename']) ? $item['basename'] : basename($item['data']); + $basename = isset($item['basename']) ? $item['basename'] : drupal_basename($item['data']); if (isset($previous_item[$basename])) { // Remove the previous item that shared the same base name. unset($css[$previous_item[$basename]]); Index: includes/file.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/file.inc,v retrieving revision 1.219 diff -u -p -r1.219 file.inc --- includes/file.inc 26 Jul 2010 03:04:29 -0000 1.219 +++ includes/file.inc 30 Jul 2010 10:03:05 -0000 @@ -582,7 +582,7 @@ function file_copy(stdClass $source, $de $file = clone $source; $file->fid = NULL; $file->uri = $uri; - $file->filename = basename($uri); + $file->filename = drupal_basename($uri); // If we are replacing an existing file re-use its database record. if ($replace == FILE_EXISTS_REPLACE) { $existing_files = file_load_multiple(array(), array('uri' => $uri)); @@ -595,7 +595,7 @@ function file_copy(stdClass $source, $de // If we are renaming around an existing file (rather than a directory), // use its basename for the filename. elseif ($replace == FILE_EXISTS_RENAME && is_file($destination)) { - $file->filename = basename($destination); + $file->filename = drupal_basename($destination); } $file = file_save($file); @@ -651,7 +651,7 @@ function file_unmanaged_copy($source, $d // Build a destination URI if necessary. if (!isset($destination)) { - $destination = file_build_uri(basename($source)); + $destination = file_build_uri(drupal_basename($source)); } // Assert that the destination contains a valid stream. @@ -663,7 +663,7 @@ function file_unmanaged_copy($source, $d // Prepare the destination directory. if (file_prepare_directory($destination)) { // The destination is already a directory, so append the source basename. - $destination = file_stream_wrapper_uri_normalize($destination . '/' . basename($source)); + $destination = file_stream_wrapper_uri_normalize($destination . '/' . drupal_basename($source)); } else { // Perhaps $destination is a dir/file? @@ -734,7 +734,7 @@ function file_destination($destination, break; case FILE_EXISTS_RENAME: - $basename = basename($destination); + $basename = drupal_basename($destination); $directory = drupal_dirname($destination); $destination = file_create_filename($basename, $directory); break; @@ -799,7 +799,7 @@ function file_move(stdClass $source, $de // If we are renaming around an existing file (rather than a directory), // use its basename for the filename. elseif ($replace == FILE_EXISTS_RENAME && is_file($destination)) { - $file->filename = basename($destination); + $file->filename = drupal_basename($destination); } $file = file_save($file); @@ -1191,7 +1191,7 @@ function file_save_upload($source, $vali $file = new stdClass(); $file->uid = $user->uid; $file->status = 0; - $file->filename = trim(basename($_FILES['files']['name'][$source]), '.'); + $file->filename = trim(drupal_basename($_FILES['files']['name'][$source]), '.'); $file->uri = $_FILES['files']['tmp_name'][$source]; $file->filemime = file_get_mimetype($file->filename); $file->filesize = $_FILES['files']['size'][$source]; @@ -1544,7 +1544,7 @@ function file_save_data($data, $destinat $file = new stdClass(); $file->fid = NULL; $file->uri = $uri; - $file->filename = basename($uri); + $file->filename = drupal_basename($uri); $file->filemime = file_get_mimetype($file->uri); $file->uid = $user->uid; $file->status = FILE_STATUS_PERMANENT; @@ -1560,7 +1560,7 @@ function file_save_data($data, $destinat // If we are renaming around an existing file (rather than a directory), // use its basename for the filename. elseif ($replace == FILE_EXISTS_RENAME && is_file($destination)) { - $file->filename = basename($destination); + $file->filename = drupal_basename($destination); } return file_save($file); @@ -1946,6 +1946,32 @@ function drupal_dirname($uri) { } /** + * Gets the filename from a given path. + * + * PHP's basename() does not properly support streams or filenames beginning + * with a non-US-ASCII character. + * @see http://bugs.php.net/bug.php?id=37738 + * + * @see basename() + * @ingroup php_wrappers + */ +function drupal_basename($uri, $suffix = NULL) { + $separators = '/'; + if (DIRECTORY_SEPARATOR != '/') { + $separators .= DIRECTORY_SEPARATOR; + } + if (file_uri_scheme($uri)) { + $uri = file_uri_target($uri); + } + $uri = rtrim($uri, $separators); + $uri = preg_match('@[^' . preg_quote($separators, '@') . ']+$@', $uri, $matches) ? $matches[0] : ''; + if ($suffix) { + $uri = preg_replace('@' . preg_quote($suffix) . '$@', '', $uri); + } + return $uri; +} + +/** * Creates a directory using Drupal's default mode. * * PHP's mkdir() does not respect Drupal's default permissions mode. If a mode @@ -2012,7 +2038,7 @@ function drupal_tempnam($directory, $pre $wrapper = file_stream_wrapper_get_instance_by_scheme($scheme); if ($filename = tempnam($wrapper->getDirectoryPath(), $prefix)) { - return $scheme . '://' . basename($filename); + return $scheme . '://' . drupal_basename($filename); } else { return FALSE; Index: includes/locale.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/locale.inc,v retrieving revision 1.258 diff -u -p -r1.258 locale.inc --- includes/locale.inc 30 Jul 2010 02:47:27 -0000 1.258 +++ includes/locale.inc 30 Jul 2010 10:03:05 -0000 @@ -1954,7 +1954,7 @@ function _locale_batch_import($filepath, // The filename is either {langcode}.po or {prefix}.{langcode}.po, so // we can extract the language code to use for the import from the end. if (preg_match('!(/|\.)([^\./]+)\.po$!', $filepath, $langcode)) { - $file = (object) array('filename' => basename($filepath), 'uri' => $filepath); + $file = (object) array('filename' => drupal_basename($filepath), 'uri' => $filepath); _locale_import_read_po('db-store', $file, LOCALE_IMPORT_KEEP, $langcode[2]); $context['results'][] = $filepath; } Index: includes/stream_wrappers.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/stream_wrappers.inc,v retrieving revision 1.18 diff -u -p -r1.18 stream_wrappers.inc --- includes/stream_wrappers.inc 10 Jul 2010 01:51:02 -0000 1.18 +++ includes/stream_wrappers.inc 30 Jul 2010 10:03:06 -0000 @@ -311,7 +311,7 @@ abstract class DrupalLocalStreamWrapper } $extension = ''; - $file_parts = explode('.', basename($uri)); + $file_parts = explode('.', drupal_basename($uri)); // Remove the first part: a full filename should not match an extension. array_shift($file_parts); @@ -359,7 +359,7 @@ abstract class DrupalLocalStreamWrapper $realpath = realpath($path); if (!$realpath) { // This file does not yet exist. - $realpath = realpath(dirname($path)) . '/' . basename($path); + $realpath = realpath(dirname($path)) . '/' . drupal_basename($path); } $directory = realpath($this->getDirectoryPath()); if (!$realpath || !$directory || strpos($realpath, $directory) !== 0) { Index: includes/updater.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/updater.inc,v retrieving revision 1.6 diff -u -p -r1.6 updater.inc --- includes/updater.inc 21 Jul 2010 00:28:14 -0000 1.6 +++ includes/updater.inc 30 Jul 2010 10:03:06 -0000 @@ -142,7 +142,7 @@ class Updater { return FALSE; } foreach ($info_files as $info_file) { - if (drupal_substr($info_file->filename, 0, -5) == basename($directory)) { + if (drupal_substr($info_file->filename, 0, -5) == drupal_basename($directory)) { // Info file Has the same name as the directory, return it. return $info_file->uri; } @@ -164,7 +164,7 @@ class Updater { * The name of the project. */ public static function getProjectName($directory) { - return basename($directory); + return drupal_basename($directory); } /** Index: includes/filetransfer/filetransfer.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/filetransfer/filetransfer.inc,v retrieving revision 1.9 diff -u -p -r1.9 filetransfer.inc --- includes/filetransfer/filetransfer.inc 11 Apr 2010 18:33:43 -0000 1.9 +++ includes/filetransfer/filetransfer.inc 30 Jul 2010 10:03:06 -0000 @@ -205,7 +205,7 @@ abstract class FileTransfer { */ protected function copyDirectoryJailed($source, $destination) { if ($this->isDirectory($destination)) { - $destination = $destination . '/' . basename($source); + $destination = $destination . '/' . drupal_basename($source); } $this->createDirectory($destination); foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST) as $filename => $file) { @@ -296,7 +296,7 @@ abstract class FileTransfer { $chroot = ''; while (count($parts)) { $check = implode($parts, '/'); - if ($this->isFile($check . '/' . basename(__FILE__))) { + if ($this->isFile($check . '/' . drupal_basename(__FILE__))) { // Remove the trailing slash. return substr($chroot,0,-1); } Index: modules/color/color.module =================================================================== RCS file: /cvs/drupal/drupal/modules/color/color.module,v retrieving revision 1.89 diff -u -p -r1.89 color.module --- modules/color/color.module 30 Jul 2010 02:47:27 -0000 1.89 +++ modules/color/color.module 30 Jul 2010 10:03:06 -0000 @@ -86,7 +86,7 @@ function _color_html_alter(&$vars) { foreach ($color_paths as $color_path) { // Color module currently requires unique file names to be used, // which allows us to compare different file paths. - if (basename($old_path) == basename($color_path)) { + if (drupal_basename($old_path) == basename($color_path)) { // Replace the path to the new css file. // This keeps the order of the stylesheets intact. $vars['css'][$old_path]['data'] = $color_path; @@ -346,7 +346,7 @@ function color_scheme_form_submit($form, // Copy over neutral images. foreach ($info['copy'] as $file) { - $base = basename($file); + $base = drupal_basename($file); $source = $paths['source'] . $file; $filepath = file_unmanaged_copy($source, $paths['target'] . $base); $paths['map'][$file] = $base; @@ -388,7 +388,7 @@ function color_scheme_form_submit($form, // Rewrite stylesheet with new colors. $style = _color_rewrite_stylesheet($theme, $info, $paths, $palette, $style); - $base_file = basename($file); + $base_file = drupal_basename($file); $css[] = $paths['target'] . $base_file; _color_save_stylesheet($paths['target'] . $base_file, $style, $paths); } @@ -528,7 +528,7 @@ function _color_render_images($theme, &$ // Cut out slices. foreach ($info['slices'] as $file => $coord) { list($x, $y, $width, $height) = $coord; - $base = basename($file); + $base = drupal_basename($file); $image = drupal_realpath($paths['target'] . $base); // Cut out slice. Index: modules/file/tests/file.test =================================================================== RCS file: /cvs/drupal/drupal/modules/file/tests/file.test,v retrieving revision 1.18 diff -u -p -r1.18 file.test --- modules/file/tests/file.test 2 Jul 2010 12:37:57 -0000 1.18 +++ modules/file/tests/file.test 30 Jul 2010 10:03:06 -0000 @@ -713,6 +713,9 @@ class FileTokenReplaceTestCase extends F $instance = field_info_instance('node', $field_name, $type_name); $test_file = $this->getTestFile('text'); + // Coping a file to test uploads with non-latin filenames. + $filename = drupal_dirname($test_file->uri) . '/текстовый файл.txt'; + $test_file = file_copy($test_file, $filename); // Create a new node with the uploaded file. $nid = $this->uploadNodeFile($test_file, $field_name, $type_name); Index: modules/image/image.test =================================================================== RCS file: /cvs/drupal/drupal/modules/image/image.test,v retrieving revision 1.23 diff -u -p -r1.23 image.test --- modules/image/image.test 30 Jun 2010 22:37:49 -0000 1.23 +++ modules/image/image.test 30 Jul 2010 10:03:06 -0000 @@ -178,9 +178,9 @@ class ImageStylesPathAndUrlUnitTest exte // Get the URL of a file that has not been generated yet and try to access // it before image_style_url has been called. - $generated_uri = $scheme . '://styles/' . $this->style_name . '/' . basename($original_uri); + $generated_uri = $scheme . '://styles/' . $this->style_name . '/' . drupal_basename($original_uri); $this->assertFalse(file_exists($generated_uri), t('Generated file does not exist.')); - $expected_generate_url = url('image/generate/' . $this->style_name . '/' . $scheme . '/' . basename($original_uri), array('absolute' => TRUE)); + $expected_generate_url = url('image/generate/' . $this->style_name . '/' . $scheme . '/' . drupal_basename($original_uri), array('absolute' => TRUE)); $this->drupalGet($expected_generate_url); $this->assertResponse(403, t('Access to generate URL was denied.')); Index: modules/simpletest/drupal_web_test_case.php =================================================================== RCS file: /cvs/drupal/drupal/modules/simpletest/drupal_web_test_case.php,v retrieving revision 1.225 diff -u -p -r1.225 drupal_web_test_case.php --- modules/simpletest/drupal_web_test_case.php 19 Jul 2010 21:54:46 -0000 1.225 +++ modules/simpletest/drupal_web_test_case.php 30 Jul 2010 10:03:07 -0000 @@ -1184,6 +1184,9 @@ class DrupalWebTestCase extends DrupalTe $test_info['in_child_site'] = FALSE; include_once DRUPAL_ROOT . '/includes/install.inc'; + + // Avoid exceptions from t() during install if the current language is not 'en'. + $GLOBALS['language']->language = 'en'; drupal_install_system(); $this->preloadRegistry(); @@ -1475,7 +1478,15 @@ class DrupalWebTestCase extends DrupalTe * An header. */ protected function curlHeaderCallback($curlHandler, $header) { - $this->headers[] = $header; + // Headers could be splited on chunks so prepending last header line if + // current header has no colon (":"). Additional details could be found + // in rfc2616 http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2 + if (strpos($header, ':') === FALSE) { + $this->headers[] = array_pop($this->headers) . $header; + } + else { + $this->headers[] = $header; + } // Errors are being sent via X-Drupal-Assertion-* headers, // generated by _drupal_log_error() in the exact form required Index: modules/simpletest/simpletest.pages.inc =================================================================== RCS file: /cvs/drupal/drupal/modules/simpletest/simpletest.pages.inc,v retrieving revision 1.31 diff -u -p -r1.31 simpletest.pages.inc --- modules/simpletest/simpletest.pages.inc 24 Jul 2010 17:28:26 -0000 1.31 +++ modules/simpletest/simpletest.pages.inc 30 Jul 2010 10:03:07 -0000 @@ -255,7 +255,7 @@ function simpletest_result_form($form, & $row = array(); $row[] = $assertion->message; $row[] = $assertion->message_group; - $row[] = basename($assertion->file); + $row[] = drupal_basename($assertion->file); $row[] = $assertion->line; $row[] = $assertion->function; $row[] = simpletest_result_status_image($assertion->status); Index: modules/simpletest/tests/common.test =================================================================== RCS file: /cvs/drupal/drupal/modules/simpletest/tests/common.test,v retrieving revision 1.117 diff -u -p -r1.117 common.test --- modules/simpletest/tests/common.test 30 Jul 2010 02:47:28 -0000 1.117 +++ modules/simpletest/tests/common.test 30 Jul 2010 10:03:07 -0000 @@ -1740,7 +1740,7 @@ class DrupalErrorCollectionUnitTest exte function assertError($error, $group, $function, $file, $message = NULL) { $this->assertEqual($error['group'], $group, t("Group was %group", array('%group' => $group))); $this->assertEqual($error['caller']['function'], $function, t("Function was %function", array('%function' => $function))); - $this->assertEqual(basename($error['caller']['file']), $file, t("File was %file", array('%file' => $file))); + $this->assertEqual(drupal_basename($error['caller']['file']), $file, t("File was %file", array('%file' => $file))); if (isset($message)) { $this->assertEqual($error['message'], $message, t("Message was %message", array('%message' => $message))); } Index: modules/simpletest/tests/file.test =================================================================== RCS file: /cvs/drupal/drupal/modules/simpletest/tests/file.test,v retrieving revision 1.59 diff -u -p -r1.59 file.test --- modules/simpletest/tests/file.test 26 Jul 2010 03:04:29 -0000 1.59 +++ modules/simpletest/tests/file.test 30 Jul 2010 10:03:07 -0000 @@ -173,7 +173,9 @@ class FileTestCase extends DrupalWebTest */ function createFile($filepath = NULL, $contents = NULL, $scheme = 'public') { if (is_null($filepath)) { - $filepath = $this->randomName(); + // Prefix with non-latin characters used to ensure that all file-related + // tests works with international filenames. + $filepath = 'Файл для тестирования ' . $this->randomName(); } $filepath = $scheme . '://' . $filepath; @@ -186,7 +188,7 @@ class FileTestCase extends DrupalWebTest $file = new stdClass(); $file->uri = $filepath; - $file->filename = basename($file->uri); + $file->filename = drupal_basename($file->uri); $file->filemime = 'text/plain'; $file->uid = 1; $file->timestamp = REQUEST_TIME; @@ -344,11 +346,11 @@ class FileValidatorTest extends DrupalWe $this->image = new stdClass(); $this->image->uri = 'misc/druplicon.png'; - $this->image->filename = basename($this->image->uri); + $this->image->filename = drupal_basename($this->image->uri); $this->non_image = new stdClass(); $this->non_image->uri = 'misc/jquery.js'; - $this->non_image->filename = basename($this->non_image->uri); + $this->non_image->filename = drupal_basename($this->non_image->uri); } /** @@ -513,7 +515,7 @@ class FileUnmanagedSaveDataTest extends $filepath = file_unmanaged_save_data($contents, 'public://asdf.txt', FILE_EXISTS_REPLACE); $this->assertTrue($filepath, t('Unnamed file saved correctly.')); $this->assertEqual(file_directory_path('public'), file_directory_path(file_uri_scheme($filepath)), t("File was placed in Drupal's files directory.")); - $this->assertEqual('asdf.txt', basename($filepath), t('File was named correctly.')); + $this->assertEqual('asdf.txt', drupal_basename($filepath), t('File was named correctly.')); $this->assertEqual($contents, file_get_contents(drupal_realpath($filepath)), t('Contents of the file are correct.')); $this->assertFilePermissions($filepath, variable_get('file_chmod_file', 0664)); } @@ -622,7 +624,7 @@ class FileSaveUploadTest extends FileHoo $this->drupalPost('file-test/upload', $edit, t('Submit')); $this->assertResponse(200, t('Received a 200 response for posted test file.')); $this->assertRaw(t('You WIN!')); - $this->assertTrue(is_file('temporary://' . $dir . '/' . trim(basename($image3_realpath)))); + $this->assertTrue(is_file('temporary://' . $dir . '/' . trim(drupal_basename($image3_realpath)))); // Check that file_load_multiple() with no arguments returns FALSE. $this->assertFalse(file_load_multiple(), t('No files were loaded.')); @@ -1915,7 +1917,7 @@ class FileSaveDataTest extends FileHookT $this->assertTrue($result, t('Unnamed file saved correctly.')); $this->assertEqual(file_directory_path('public'), file_directory_path(file_stream_wrapper_valid_scheme($result->uri)), t("File was placed in Drupal's files directory.")); - $this->assertEqual($result->filename, basename($result->uri), t("Filename was set to the file's basename.")); + $this->assertEqual($result->filename, drupal_basename($result->uri), t("Filename was set to the file's basename.")); $this->assertEqual($contents, file_get_contents($result->uri), t('Contents of the file are correct.')); $this->assertEqual($result->filemime, 'application/octet-stream', t('A MIME type was set.')); $this->assertEqual($result->status, FILE_STATUS_PERMANENT, t("The file's status was set to permanent.")); @@ -1933,11 +1935,14 @@ class FileSaveDataTest extends FileHookT function testWithFilename() { $contents = $this->randomName(8); - $result = file_save_data($contents, 'public://' . 'asdf.txt'); + // Using filename with non-latin characters. + $filename = 'Текстовый файл.txt'; + + $result = file_save_data($contents, 'public://' . $filename); $this->assertTrue($result, t('Unnamed file saved correctly.')); $this->assertEqual(file_directory_path('public'), file_directory_path(file_stream_wrapper_valid_scheme($result->uri)), t("File was placed in Drupal's files directory.")); - $this->assertEqual('asdf.txt', basename($result->uri), t('File was named correctly.')); + $this->assertEqual($filename, drupal_basename($result->uri), t('File was named correctly.')); $this->assertEqual($contents, file_get_contents($result->uri), t('Contents of the file are correct.')); $this->assertEqual($result->filemime, 'text/plain', t('A MIME type was set.')); $this->assertEqual($result->status, FILE_STATUS_PERMANENT, t("The file's status was set to permanent.")); @@ -2049,7 +2054,10 @@ class FileDownloadTest extends FileTestC // Test generating an URL to a created file. $file = $this->createFile(); $url = file_create_url($file->uri); - $this->assertEqual($GLOBALS['base_url'] . '/' . file_directory_path() . '/' . $file->filename, $url, t('Correctly generated a URL for a created file.')); + // URLs could not contains characters outside the ASCII set so has to be + // encoded. + $filename = $GLOBALS['base_url'] . '/' . file_directory_path() . '/' . rawurlencode($file->filename); + $this->assertEqual($filename, $url, t('Correctly generated a URL for a created file.')); $this->drupalHead($url); $this->assertResponse(200, t('Confirmed that the generated URL is correct by downloading the created file.')); @@ -2076,9 +2084,13 @@ class FileDownloadTest extends FileTestC file_test_set_return('download', array('x-foo' => 'Bar')); $this->drupalHead($url); $headers = $this->drupalGetHeaders(); - $this->assertEqual($headers['x-foo'] , 'Bar', t('Found header set by file_test module on private download.')); + $this->assertEqual($headers['x-foo'], 'Bar', t('Found header set by file_test module on private download.')); $this->assertResponse(200, t('Correctly allowed access to a file when file_test provides headers.')); + // Test the filename transfered correclly. + $filename = 'inline; filename="' . $file->filename . '"'; + $this->assertEqual(mime_header_decode($headers['content-disposition']), $filename, t('Filename found in headers.')); + // Deny access to all downloads via a -1 header. file_test_set_return('download', -1); $this->drupalHead($url); @@ -2316,7 +2328,7 @@ class FileMimeTypeTest extends DrupalWeb * Test mapping of mimetypes from filenames. */ public function testFileMimeTypeDetection() { - $prefix = 'simpletest://'; + $prefix = 'public://'; $test_case = array( 'test.jar' => 'application/java-archive', Index: modules/simpletest/tests/file_test.module =================================================================== RCS file: /cvs/drupal/drupal/modules/simpletest/tests/file_test.module,v retrieving revision 1.24 diff -u -p -r1.24 file_test.module --- modules/simpletest/tests/file_test.module 24 Jul 2010 17:28:26 -0000 1.24 +++ modules/simpletest/tests/file_test.module 30 Jul 2010 10:03:07 -0000 @@ -134,7 +134,7 @@ function _file_test_form_submit(&$form, /** * Reset/initialize the history of calls to the file_* hooks. * - * @see file_test_get_calls() + * @see file_test_get_calls() * @see file_test_reset() */ function file_test_reset() { Index: modules/system/system.module =================================================================== RCS file: /cvs/drupal/drupal/modules/system/system.module,v retrieving revision 1.950 diff -u -p -r1.950 system.module --- modules/system/system.module 30 Jul 2010 02:47:28 -0000 1.950 +++ modules/system/system.module 30 Jul 2010 10:03:08 -0000 @@ -3224,12 +3224,12 @@ function system_image_toolkits() { function system_retrieve_file($url, $destination = NULL, $managed = FALSE, $replace = FILE_EXISTS_RENAME) { $parsed_url = parse_url($url); if (!isset($destination)) { - $path = file_build_uri(basename($parsed_url['path'])); + $path = file_build_uri(drupal_basename($parsed_url['path'])); } else { if (is_dir(drupal_realpath($destination))) { // Prevent URIs with triple slashes when glueing parts together. - $path = str_replace('///', '//', "$destination/") . basename($parsed_url['path']); + $path = str_replace('///', '//', "$destination/") . drupal_basename($parsed_url['path']); } else { $path = $destination; Index: modules/system/system.test =================================================================== RCS file: /cvs/drupal/drupal/modules/system/system.test,v retrieving revision 1.133 diff -u -p -r1.133 system.test --- modules/system/system.test 21 Jul 2010 00:26:21 -0000 1.133 +++ modules/system/system.test 30 Jul 2010 10:03:08 -0000 @@ -1780,7 +1780,7 @@ class RetrieveFileTestCase extends Drupa function testFileRetrieving() { // Test 404 handling by trying to fetch a randomly named file. drupal_mkdir($sourcedir = 'public://' . $this->randomName()); - $filename = $this->randomName(); + $filename = 'Файл для тестирования ' . $this->randomName(); $url = file_create_url($sourcedir . '/' . $filename); $retrieved_file = system_retrieve_file($url); $this->assertFalse($retrieved_file, t('Non-existent file not fetched.')); @@ -1788,7 +1788,12 @@ class RetrieveFileTestCase extends Drupa // Actually create that file, download it via HTTP and test the returned path. file_put_contents($sourcedir . '/' . $filename, 'testing'); $retrieved_file = system_retrieve_file($url); - $this->assertEqual($retrieved_file, 'public://' . $filename, t('Sane path for downloaded file returned (public:// scheme).')); + + // URLs could not contains characters outside the ASCII set so $filename + // has to be encoded. + $encoded_filename = rawurlencode($filename); + + $this->assertEqual($retrieved_file, 'public://' . $encoded_filename, t('Sane path for downloaded file returned (public:// scheme).')); $this->assertTrue(is_file($retrieved_file), t('Downloaded file does exist (public:// scheme).')); $this->assertEqual(filesize($retrieved_file), 7, t('File size of downloaded file is correct (public:// scheme).')); file_unmanaged_delete($retrieved_file); @@ -1796,7 +1801,7 @@ class RetrieveFileTestCase extends Drupa // Test downloading file to a different location. drupal_mkdir($targetdir = 'temporary://' . $this->randomName()); $retrieved_file = system_retrieve_file($url, $targetdir); - $this->assertEqual($retrieved_file, "$targetdir/$filename", t('Sane path for downloaded file returned (temporary:// scheme).')); + $this->assertEqual($retrieved_file, "$targetdir/$encoded_filename", t('Sane path for downloaded file returned (temporary:// scheme).')); $this->assertTrue(is_file($retrieved_file), t('Downloaded file does exist (temporary:// scheme).')); $this->assertEqual(filesize($retrieved_file), 7, t('File size of downloaded file is correct (temporary:// scheme).')); file_unmanaged_delete($retrieved_file); Index: modules/update/update.manager.inc =================================================================== RCS file: /cvs/drupal/drupal/modules/update/update.manager.inc,v retrieving revision 1.24 diff -u -p -r1.24 update.manager.inc --- modules/update/update.manager.inc 29 Jul 2010 02:27:43 -0000 1.24 +++ modules/update/update.manager.inc 30 Jul 2010 10:03:08 -0000 @@ -702,7 +702,7 @@ function update_manager_file_get($url) { // Check the cache and download the file if needed. $cache_directory = 'temporary://update-cache'; - $local = $cache_directory . '/' . basename($parsed_url['path']); + $local = $cache_directory . '/' . drupal_basename($parsed_url['path']); if (!file_exists($cache_directory)) { mkdir($cache_directory); Index: modules/user/user.install =================================================================== RCS file: /cvs/drupal/drupal/modules/user/user.install,v retrieving revision 1.54 diff -u -p -r1.54 user.install --- modules/user/user.install 28 Jun 2010 14:59:24 -0000 1.54 +++ modules/user/user.install 30 Jul 2010 10:03:08 -0000 @@ -544,7 +544,7 @@ function user_update_7004(&$sandbox) { // Create a file object. $file = new stdClass(); $file->uri = $user->picture; - $file->filename = basename($file->uri); + $file->filename = drupal_basename($file->uri); $file->filemime = file_get_mimetype($file->uri); $file->uid = $user->uid; $file->status = FILE_STATUS_PERMANENT;