Xpoint
   [напомнить пароль]

Распарсить большой POST-запрос с помощью Perl

Метки: [без меток]
2008-11-18 00:27:11 [обр] sd[досье]

Поступает большой POST-запрос (multipart/form-data) с большими файлами (одним или несколькими). Требуется его распарсить с помощью Perl.

Вопрос 1: Есть ли готовое решение (с сохранением файлов), не требующее помещения всего запроса в память? Так же не хотелось бы связываться с CGI.pm. Уж больно много там всего того, что мне не нужно.

Я уже готов парсить его сам, используя буфер для чтения и записи в файл, чтобы не забивать память. И в связи с этим тоже есть ещё несколько вопросов:

Вопрос 2: Какую функцию для чтения из STDIN использовать? read, sysread, <> ?

Вопрос 3: Читать придётся в цикле, при этом если функция read (или sysread) вернёт 0, это ещё не значит, что запрос кончился. Вполне возможно, что данные просто ещё не поступили. Получается, я должен сравнивать количество считанных байт с Content-length, если оно его достигнет, то считать, что запрос считан. Однако остаётся дыра: если Content-length заведомо больше, чем реальный размер данных, то скрипт зациклится. Выходит надо добавлять некое ограничение по времени (или по количеству чтений). Верны ли мои рассуждения? Нельзя ли как-то сделать проще?

Вопрос 4: Если мне удастся реализовать это, не получится ли так, что сам апач всё равно будет съедать памяти как весь запрос?

спустя 3 часа 40 минут [обр] Роман Чемисов(1/327)[досье]
sd[досье]
Если есть желание написать свой велосипед, то никто Вам не запрещает подсмотреть как это реализовано в моделях всемирно известных производителей.
спустя 4 часа 50 минут [обр] sd[досье]
Уважаемый Роман, я не думаю, что мои вопросы настолько плохо сформулированы, чтобы не ответить ни на один из них. В самом первом вопросе я интересуюсь всемирно известными производителями. В CGI там уж как-то сильно разамазано. И если уж делать самому, то надо понимать, что ты делаешь.
спустя 3 часа 46 минут [обр] Алексей Севрюков(6/1280)[досье]

sd[досье] Ваши вопросы сформулированы правильно и хорошо. И ответ Романа просто отличный. Скачайте себе perldoc CGI и ковыряйте наздровье. Посмотрите также perldoc CGI::WebIn, может там что-то почерпнете.

P.S. Т.е. Вы полагаете что мы за Вас должны изучить эту размазанность и выдать Вам готовый ответ? Нет уж, увольте. Если же Вы не понимаете что делаете - то зачем Вы это делаете?

спустя 1 час 15 минут [обр] sd[досье]

Спасибо за WebIn.
Я просто надеялся, что кто-то знает заранее ответы на вопросы 2, 3(хотя бы первый из двух) и 4.

PS Я ни в коем случае не полагаю, что кто-то должен за меня что-то делать. Я надеялся, что кто-то уже делал нечто подобное или просто вникал в то, как работают стандартные средства и может не прилагая больших усилия ответить на мои вопросы, оказав мне тем самым большую услугу.
PPS Если бы все всегда делали только то, что понимают, никто не понимал бы ничего.

Powered by POEM™ Engine Copyright © 2002-2005