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

Статус
В этой теме нельзя размещать новые ответы.

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-текст не отформатирован... Даже переводов строк нет, хотя при загрузке через курл есть.
 
В качестве примера
PHP:
      $isBody = false;
      while (!feof($fp))
          {
          if(!$isBody)
              {
              $b=fgets($fp, 128);
              if($b=="\r\n")
                  $isBody=true;
                header('Content-Type: application/octet-stream');
                header('Content-Disposition: attachment; filename='.$filename);
              }
            else
              {
                echo fgets($fp, 1024);
                flush;
              }
          }
 
В качестве примера

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

Что насчет форматирования данных? Я даже поставил модификатор b в открытии файла, а также использовал fread вместо fgets, все равно...
 
Во-первых, есть функция fgets() которая читает до конца строки.
Во-вторых, есть rfc.1945, который гарантирует, что заголовки от мессаджа отделены пустой строкой.

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

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