Проблему воспроизвёл так: форма, в ней большой файл (и соответственно, multipart/form-data), посылается на скрипт, который НЕ читает посылаемые данные (спутал environ['wsgi.input'] и sys.stdin). Форма с маленьким файлом или без файла проходит. Исправил - работает... почти. Посылаю образ виртуальной машины (8 гигов) - то же самое.
Первое подозрение - файл с дырками и firefox не умеет с такими работать. Делаю честную копию через cat - эффект не меняется. Делаю сохранение файла - килобайт 8 с хвостом сохраняется (где-то случилось переполнение по модулю не иначе) и всё. Смотрю Content-length - а там всего 9к (и сервер так или иначе принимает не всё - поток-то всё те же 8 гигов). Беру chromium - всё заливается и работает как надо.
Что это было? На дворе - 21-й век и connection у нас как водится keep-alive. Если скрипт НЕ прочитает всё, что идёт после заголовка (ровно Content-length байт), то это прочитает браузер как следующий заголовок и скорее всего там будет ну совсем не заголовок (9\x04 это как раз оттуда) - в потоке идёт последовательность запросов и какой-то особой синхронизации (где кончился один и начался другой) нет.
Чего бояться? А нечего - просто ещё один из вариантов неправильно сформулированного запроса. Никто не мешает клиенту подать да хоть бинарные данные. Не уязвимость это.
Остаётся вопрос - а как корректно обрабатывать ситуацию, когда клиент данные посылает, а сервер их получать не хочет? Обрывать соединение (не факт, что скрипту это разрешено)? Посылать код ошибки (да хоть "метод не разрешён" - кто сказал, что тут POST ожидается) - но будет ли читать его браузер?