Распарсить большой POST-запрос с помощью Perl
Поступает большой POST-запрос (multipart/form-data) с большими файлами (одним или несколькими). Требуется его распарсить с помощью Perl.
Вопрос 1: Есть ли готовое решение (с сохранением файлов), не требующее помещения всего запроса в память? Так же не хотелось бы связываться с CGI.pm. Уж больно много там всего того, что мне не нужно.
Я уже готов парсить его сам, используя буфер для чтения и записи в файл, чтобы не забивать память. И в связи с этим тоже есть ещё несколько вопросов:
Вопрос 2: Какую функцию для чтения из STDIN использовать? read, sysread, <> ?
Вопрос 3: Читать придётся в цикле, при этом если функция read (или sysread) вернёт 0, это ещё не значит, что запрос кончился. Вполне возможно, что данные просто ещё не поступили. Получается, я должен сравнивать количество считанных байт с Content-length, если оно его достигнет, то считать, что запрос считан. Однако остаётся дыра: если Content-length заведомо больше, чем реальный размер данных, то скрипт зациклится. Выходит надо добавлять некое ограничение по времени (или по количеству чтений). Верны ли мои рассуждения? Нельзя ли как-то сделать проще?
Вопрос 4: Если мне удастся реализовать это, не получится ли так, что сам апач всё равно будет съедать памяти как весь запрос?
Если есть желание написать свой велосипед, то никто Вам не запрещает подсмотреть как это реализовано в моделях всемирно известных производителей.
sd[досье] Ваши вопросы сформулированы правильно и хорошо. И ответ Романа просто отличный. Скачайте себе perldoc CGI и ковыряйте наздровье. Посмотрите также perldoc CGI::WebIn, может там что-то почерпнете.
P.S. Т.е. Вы полагаете что мы за Вас должны изучить эту размазанность и выдать Вам готовый ответ? Нет уж, увольте. Если же Вы не понимаете что делаете - то зачем Вы это делаете?
Спасибо за WebIn.
Я просто надеялся, что кто-то знает заранее ответы на вопросы 2, 3(хотя бы первый из двух) и 4.
PS Я ни в коем случае не полагаю, что кто-то должен за меня что-то делать. Я надеялся, что кто-то уже делал нечто подобное или просто вникал в то, как работают стандартные средства и может не прилагая больших усилия ответить на мои вопросы, оказав мне тем самым большую услугу.
PPS Если бы все всегда делали только то, что понимают, никто не понимал бы ничего.