|

Полноценное использование служебного Инета
Xakep, номер #039, стр. 039-056-5
Таким образом, скрипт должен сформировать и отправить на сервер запрос, подобный тому, что я привел в качестве примера. Обращаю твое внимание на то, что в данном случае символом перевода строки служит комбинация "\r\n", а не стандартный юниховский "\n". Запрос обязательно должен заканчиваться пустой строкой (т.е. в конце последней строки будет идти "\r\n\r\n"). Если этого не сделать, сервер не поймет, что запрос закончен, и будет ждать столько, сколько позволяет таймаут.
После отправки запроса следует начать принимать данные, для передачи которых, в отличие от ftp, не требуется создание нового соединения (т.е. передача будет происходить в уже установленном соединении). Данные будут состоять из заголовка, представляющего собой несколько строк, разделенных "\r\n", после которого будет идти пустая строка и затем - требуемые данные. В заголовке указывается размер передаваемых данных, код ответа сервера и еще много дополнительной информации. Все это примерно в таком духе:
HTTP/1.1 200 OK
Date: Tue, 29 Jan 2002 16:10:59 GMT
Server: Apache/1.3.6 (Win32)
Last-Modified: Sun, 07 Oct 2001 00:23:46 GMT
ETag: "0-8e7b0c-3bbda092"
Accept-Ranges: bytes
Content-Length: 9358092
Connection: close
Content-Type: audio/mpeg
<Сами данные>
Первая строка содержит краткий ответ сервера на команду, поэтому полезно его анализировать. Например, если будет не "200 OK", а "404 Not Found", то, видимо, данные будут не очень содержательны.
Perl-код, опускающий заголовок и сохраняющий данные в файл, выглядит так:
while () {
if ($_ eq "\r\n") {last;}
}
while () {
print NF;
}
Где HTTPCMD - дескриптор текущего соединения, а NF - дескриптор файла, в который будут сохранены данные.
Таким образом, файл получен и сохранен на используемом сервере под любым удобным именем, т.е. можно качать, бить в тамтамы и кричать "Ура!".
Теперь пара слов о том, как использовать этот метод в свое удовольствие и при этом не навлечь на себя гнев админа. Хорошо зарекомендовала себя следующая схема работы: выбирается размер скачиваемого куска, лежащий в разумных пределах. Если предполагается использовать упомянутую выше схему возни с дискетами под названием "геморрой", то это значение будет равно 1400000 (чуть меньше размера дискеты, т.к. последняя может быть слегка битой). Если схема "геморрой" использоваться не будет, то размер куска следует выбрать чуть больше, однако указанное значение (1400000) на практике зарекомендовало себя неплохо. Далее, скрипту через URL передается номер куска, который требуется скачать, он, путем нехитрых математических операций, получает диапазон требующихся байт, создает и отправляет соответствующий запрос серверу, сохраняет переданные им данные (желательно не в cgi-bin, а туда, где лежат html-ки), затем вот таким кодом:
Назад на стр. 039-056-4 Содержание Вперед на стр. 039-056-6
|