Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Утилита wget. Бага определения типа файла.  (Прочитано 10087 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« : 23-05-2013 13:56 » new

Интересная бага попалась. Вернусь домой, опишу детальнее. Пока, чтобы не потерять тут привожу логи. Взаимосмязанные вещи выделил цветом.

---request begin---
GET /large-file.tar.bz2 HTTP/1.0
Referer: http://example.com/
Range: bytes=3359124103-
User-Agent: Wget/1.12 (linux-gnu)
Accept: */*
Host: example.com
Connection: Keep-Alive

---request end---
HTTP request sent, awaiting response...
---response begin---
HTTP/1.1 416 Requested Range Not Satisfiable
Server: nginx/1.4.1
Date: Thu, 23 May 2013 13:50:45 GMT
Content-Type: text/html
Content-Length: 212
Connection: close
Content-Range: bytes */3359124103

---response end---
416 Requested Range Not Satisfiable

    The file is already fully retrieved; nothing to do.

Кратко суть такова: файл уже имеется, но с ключом -c wget делает попытку его докачать, на что получает ответ 416 — это все нормально, но далее wget начинает сканировать файл как html в поисках ссылок (ключ -r), но это не html и размер в 3.2 ГБ не дает шанса wget на 32-бит машине (по strace видно, что он использует mmap).

Я думаю, что wget приписывает файлу MIME из Content-Type ответа 416, хотя Content-Type относится к тексту ошибки.

Кроме как написать разработчикам других идей нет?
« Последнее редактирование: 23-05-2013 17:57 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 23-05-2013 19:39 » 

http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=626992
Бага два года назад описана. Версия та же: 1.12. Только это саппорт Дебиан. Они переправили репорт в GNU:
https://savannah.gnu.org/bugs/index.php?33833
С тех пор вышла 1.13 и 1.14. Осталось убедить RedHat.

Просмотрел историю изменений с 1.12: бага не исправлена.
« Последнее редактирование: 23-05-2013 19:59 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 24-05-2013 09:27 » 

Мой патч, делающий самое простое: если 416, то не HTML. Более правильно было бы выполнить HEAD-запрос и взять MIME из Content-Type.

Код: (Diff) wget-1.12-http_416_mime.patch
diff -urN wget-1.12/src/http.c wget-1.12-rxl-patch/src/http.c
--- wget-1.12/src/http.c        2009-09-22 07:02:18.000000000 +0400
+++ wget-1.12-rxl-patch/src/http.c      2013-05-24 13:20:46.000000000 +0400
@@ -2167,9 +2167,9 @@
   /* If content-type is not given, assume text/html.  This is because
      of the multitude of broken CGI's that "forget" to generate the
      content-type.  */
-  if (!type ||
+  if (statcode != HTTP_STATUS_RANGE_NOT_SATISFIABLE && (!type ||
         0 == strncasecmp (type, TEXTHTML_S, strlen (TEXTHTML_S)) ||
-        0 == strncasecmp (type, TEXTXHTML_S, strlen (TEXTXHTML_S)))
+        0 == strncasecmp (type, TEXTXHTML_S, strlen (TEXTXHTML_S))))
     *dt |= TEXTHTML;
   else
     *dt &= ~TEXTHTML;

Реальный прогон показал, что проблема исчезла. Подозреваю, что обратная проблема возникнет, если уже скачанный файл будет html (т.е. тот, который надо сканировать на ссылки).
« Последнее редактирование: 24-05-2013 09:31 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines