Поддержка HTTP 100 Продолжить с PHP

Я работаю над веб-приложением PHP, которое принимает большие загрузки файлов POSTed от определенных клиентов и хотел бы принять или отклонить эти загрузки (на основе различных заголовков и других факторов, а не только размера) до того, как файл будет загружен с использованием HTTP / 1.1 100 Продолжать.

Краткая справка из HTTP / 1.1 spec 8.2.3 :

Назначение статуса 100 (Продолжить) (см. Раздел 10.1.1) - позволить клиенту, который отправляет сообщение запроса с телом запроса, определить, готов ли исходный сервер принять запрос (на основе заголовков запроса) до того, как клиент отправит тело запроса. В некоторых случаях для клиента может быть неприемлемо или крайне неэффективно отправлять тело, если сервер отклонит сообщение, не глядя на тело.

Проблема в том, что Apache видит Expect: 100-continue от клиента, возвращает 100 Continue и принимает все загруженные файлы до того, как PHP начинает обработку ... Однако мне нужно, чтобы PHP начал обработку сразу после Expect: 100-continue. Я не уверен, возможно ли это, поэтому у меня два вопроса:

  1. Можно ли заставить PHP начинать обработку сразу после Expect: 100-continue?
  2. Если нет, то какая альтернатива?

В настоящее время я думаю о эмуляции 100 continue, указав, что клиент сначала отправляет запрос HEAD с теми же заголовками, что и POST. Затем веб-приложение может вернуть ответ, чтобы продолжить POST, или код ошибки. Другие предложения приветствуются!


person Jonah Braun    schedule 12.02.2010    source источник
comment
Я понимаю, что это очень старый вопрос, но вы в конечном итоге использовали запрос HEAD, а затем POST? Если да, то насколько удобно было его реализовать? В настоящее время меня разочаровывает неспособность правильно реализовать ожидание 100-продолжений в стеке PHP / Apache.   -  person Marvin    schedule 17.02.2016
comment
100 continue невозможно правильно контролировать в PHP (по крайней мере, так и было, я перешел на лучшие языки). Если у вас есть контроль над клиентом, то да, отправка HEAD (или любого другого типа запроса) для предварительной проверки основного POST - это путь. Если у вас нет контроля над клиентом, единственный вариант - настроить прокси / промежуточное ПО, которое может перехватить 100 и ответить соответствующим образом.   -  person Jonah Braun    schedule 19.02.2016
comment
У меня есть контроль над клиентом, так что это хороший запасной вариант. В настоящее время я пытаюсь создать ловушку в Apache для реализации надлежащих проверок заголовка перед продолжением до 100. Не уверен, что это приведет к чему-нибудь полезному. stackoverflow.com/questions/35456122/ < / а>   -  person Marvin    schedule 19.02.2016
comment
Какие точные предварительные условия вы пытаетесь проверить и что вы пытаетесь предотвратить с помощью заголовка, включая expect: 100-continue? Что произойдет, если клиент не отправит часть 100 в заголовке, а вместо этого отправит тело напрямую? Кстати, это клиент или ваш http / api-клиент?   -  person Kasper Agg    schedule 09.12.2018


Ответы (2)


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

Но да, PHP работает так: скрипт запускается только тогда, когда клиент отправляет весь запрос.

person Evert    schedule 11.12.2016

Попытка сделать это на уровне HTTP кажется слишком сложной. Как разработчику важно не зацикливаться на конкретном решении. Проблема в том, что вы хотите выполнить серию проверок, прежде чем обрабатывать загрузку. Все, что вам нужно сделать, это поместить соответствующую страницу перед загрузкой. Эта квалификационная страница покажет им форму загрузки только в том случае, если они пройдут серию проверок и соответствуют требованиям. Это именно то, что вы пытаетесь сделать, только вы можете сделать это в коде PHP. Если это возможно, HTTP 100 всегда будет требовать большого количества дополнительных настроек, что создаст головную боль для поддержки в дальнейшем. Если вы сделаете это в коде, те, кто придут за вами (или вы сами через пару лет), смогут четко понять, что делает приложение.

person Daniel Ice    schedule 13.02.2010
comment
@ Daniel: Обратная связь - Ваши ответы кажутся преждевременными - не понимая необходимости OP, вы предлагаете ему отказаться от обработки HTTP 100 - person ; 22.12.2010