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

Я работаю над PHP webapp, который принимает большие 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- Продолжать. Я не уверен, что это возможно, поэтому у меня есть два вопроса:

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

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

Ответ 1

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

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

Ответ 2

Что именно должно быть обработано, когда на сервер поступил только заголовок (включая "Expect: 100-continue")?

Apache, похоже, прав, не позволяя PHP обрабатывать что-либо: он отправляет обратно "100 Continue", чтобы клиент отправил тело. Только тогда нужно что-то обрабатывать.

Ответ 3

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