За последние 24 часа нас посетили 30502 программиста и 1792 робота. Сейчас ищет 1131 программист ...

Получение HTTP-заголовка файла, содержащего русские символы.

Тема в разделе "Прочие вопросы по PHP", создана пользователем rusart, 16 окт 2006.

Статус темы:
Закрыта.
  1. rusart

    rusart Активный пользователь

    С нами с:
    21 сен 2006
    Сообщения:
    10
    Симпатии:
    0
    Адрес:
    Ростов-на-Дону
    Задача:

    Необходимо получить http-заголовки файла, содержащего русские символы. Получением заголовков занимается функция:

    Код (Text):
    1.  
    2. /**
    3.  * @desc Функция возвращает массив HTTP-заголовков страницы, URL которой передается в первом
    4.  *       аргументе. Первый элемент массива "status" имеет вид:
    5.  *       array(
    6.  *              ["full"] - полная строка ответа
    7.  *              ["protocol"] - версия протокола
    8.  *              ["code"] - код статуса ответа
    9.  *              ["desc"] - описание статуса
    10.  *            );
    11.  *       остальные [параметр_ответа] => значение.
    12.  *
    13.  * @param string $sUrl - адрес страницы
    14.  * @return array
    15.  */
    16. function readPageHead($sUrl) {
    17.     if (!$sUrl) {
    18.         return false;
    19.     }
    20.    
    21.     $aUrl = parse_url($sUrl);
    22.    
    23.     if (!$aUrl["host"]) {
    24.         $aUrl["host"] = $_SERVER['SERVER_NAME'];
    25.     }
    26.     $service_port = getservbyname('www', 'tcp');
    27.     $address = gethostbyname($aUrl["host"]);
    28.     $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    29.     if ($socket < 0) {
    30.     //ERR
    31.     } else {
    32.     //OK
    33.     }
    34.     $result = socket_connect($socket, $address, $service_port);
    35.     if ($result < 0) {
    36.     //ERR
    37.     } else {
    38.     //OK
    39.     }
    40.    
    41.     if (!$aUrl["path"]) {
    42.         $aUrl["path"] = "/";
    43.     }
    44.     $sPath = $aUrl["path"];
    45.    
    46.     if ($aUrl["query"]) {
    47.         $sPath .= "?".$aUrl["query"];
    48.     }
    49.    
    50.     $in = "HEAD $sPath HTTP/1.1\r\n";
    51.     $in .= "Host: {$aUrl["host"]}\r\n";
    52.     $in .= "\r\n\r\n";
    53.     $in .= "Connection: Close\r\n\r\n";
    54.     $out = '';
    55.     socket_write($socket, $in, strlen($in));
    56.     $sRet = false;
    57.     while ($out = socket_read($socket, 2048)) {
    58.         echo $out;
    59.         $sRet .= $out;
    60.     }
    61.     socket_close($socket);
    62.     $sRet = trim($sRet);
    63.     $sRet = str_replace('\r',"",addcslashes($sRet,"\r\n"));
    64.     $aHead = explode('\n',$sRet);
    65.     $aaRet = array();
    66.     foreach ($aHead as $iKey=>$sVal) {
    67.         if ($iKey == 0) {
    68.             $aaRet["status"]["full"] = $sVal;
    69.             list($sProtocol,$sCode,$sDesc) = explode(" ",$sVal);
    70.             $aaRet["status"]["protocol"] = $sProtocol;
    71.             $aaRet["status"]["code"] = $sCode;
    72.             $aaRet["status"]["desc"] = $sDesc;
    73.             continue;
    74.         }
    75.         $iPos = strpos($sVal,":");
    76.         $sParam = strtolower(substr($sVal,0,$iPos));
    77.         $sValue = trim(substr($sVal,$iPos+1,strlen($sVal)));
    78.         $aaRet[$sParam] = $sValue;
    79.     }
    80.     return $aaRet;
    81. }
    Однако, на русских именах файлов получаем заголовок 403 Forbidden. Кто знает, с чем это может быть связано и как решить эту проблему?

    P.S. Кодирование имени файла по RFC 1738 не помогло.
     
  2. Anonymous

    Anonymous Guest

    Странно - по идее, это и должно было решить проблему... как кодировали?
     
  3. rusart

    rusart Активный пользователь

    С нами с:
    21 сен 2006
    Сообщения:
    10
    Симпатии:
    0
    Адрес:
    Ростов-на-Дону
    Проблема решена. Был глюк в настройке сервера. Декодирование имени файла помогает. В принципе, достаточно заменить пробелы на %20.
     
Статус темы:
Закрыта.