Как грамотно вырезать HTTP-заголовки в ответе?

Тема в разделе "PHP", создана пользователем HatoL, 10 май 2012.

Статус темы:
Закрыта.
Модераторы: latteo
  1. HatoL

    HatoL

    Регистр.:
    5 фев 2008
    Сообщения:
    206
    Симпатии:
    36
    Скачиваю бинарный файл (mp3) с помощью сокетов (cURL не предлагайте). Как и положено, в в самом начале сервак сует что-то типа:

    Код:
    HTTP/1.1 200 OK
    Server: nginx/1.0.11
    Date: Wed, 09 May 2012 20:45:12 GMT
    Content-Type: audio/mpeg
    Content-Length: 11949364
    Last-Modified: Sun, 23 May 2010 20:06:29 GMT
    Connection: close
    Expires: Sat, 26 May 2012 20:45:12 GMT
    Cache-Control: max-age=1468800
    Accept-Ranges: bytes
    Как это грамотно вырезать? Неужели вручную смотреть, когда сервак закончит слать заголовки и начнет давать контент?

    И попутно вопрос... Почему-то при загрузке страницы через сокеты, HTML-текст не отформатирован... Даже переводов строк нет, хотя при загрузке через курл есть.
     
  2. stealthdebuger

    stealthdebuger Механик

    Administrator
    Регистр.:
    25 авг 2008
    Сообщения:
    624
    Симпатии:
    1.379
    В качестве примера
    PHP:
          $isBody false;
          while (!
    feof($fp))
              {
              if(!
    $isBody)
                  {
                  
    $b=fgets($fp128);
                  if(
    $b=="\r\n")
                      
    $isBody=true;
                    
    header('Content-Type: application/octet-stream');
                    
    header('Content-Disposition: attachment; filename='.$filename);
                  }
                else
                  {
                    echo 
    fgets($fp1024);
                    
    flush;
                  }
              }
     
    latteo и HatoL нравится это.
  3. HatoL

    HatoL

    Регистр.:
    5 фев 2008
    Сообщения:
    206
    Симпатии:
    36
    Неплохо. Я думаю можно даже сделать два цикла. Первый while (true), выход из цикла по окончании заголовков. Второй просто для чтения данных. Чтобы каждый раз проверка не производилась.

    Что насчет форматирования данных? Я даже поставил модификатор b в открытии файла, а также использовал fread вместо fgets, все равно...
     
  4. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    735
    Симпатии:
    261
    Во-первых, есть функция fgets() которая читает до конца строки.
    Во-вторых, есть rfc.1945, который гарантирует, что заголовки от мессаджа отделены пустой строкой.

    Итого, в цикле через fgets() читаем построчно заголовки ответа сервера, как только наткнулись на пустой заголовок - дальше fread() в большой буфер (1024 - это очень мало, хотя хз, что там у тебя за скорость) свою mp3. It's just that easy!
     
  5. o_nix

    o_nix

    Регистр.:
    7 ноя 2007
    Сообщения:
    1.073
    Симпатии:
    1.037
    а почему именно сокеты ??

    для скачивания файла вроде удобнее спец встроенную функцию php использовать
    и танцы с бубном будут не нужны...
    в этом случае хватит одной строки
    PHP:
    copy($url$name);
     
Статус темы:
Закрыта.