2015-08-12 2 views
0

Когда получен запрос POST, есть ли способ проверить его заголовки, прежде чем получить тело запроса и разгладить его?Как проверить заголовки запроса POST перед тем, как получить и разобрать тело запроса?

Представьте, что у вас очень большие входящие запросы POST (~ 25 МБ), и вам нужно решить, обрабатывать их или отбрасывать их на основе содержимого своих заголовков.

Щадить, пропускную способность памяти, процессора, и время было бы гораздо лучше, если бы это могло быть возможным, чтобы этот поток:

  1. запрос POST попадает на сервер.
  2. Сервер получает его только до содержимого заголовков, а затем держит передачу в режиме ожидания.
  3. Сервер проверяет заголовки и решает, что делать.
  4. Если заголовки в порядке, он продолжает получать запрос и анализирует тело, в противном случае он закрывает соединение и отправляет ответ 401.

Возможно ли это вообще? Если да, то что это хороший способ сделать это в Koa?

Спасибо!

+0

Как насчет проверки 'request.headers' с некоторым промежуточным программным обеспечением? – tymeJV

+0

@tymeJV есть ли способ убедиться, что получение тела запроса приостановлено до тех пор, пока заголовки запроса не будут проверены? – Pensierinmusica

ответ

2

Вы не можете проверить заголовки перед «получением» корпуса. Если вы хотите сделать что-то подобное, вам нужно создать пользовательскую функцию, которая считывает байты из сокета и анализирует только заголовки и закрывает соединение в случае определенной логики, что, вероятно, больше, чем вы готовы делать.

Что вы можете сделать, создает функцию промежуточного программного обеспечения, которая читает заголовки, а затем либо: а) переходит к следующему промежуточному программному обеспечению или б) завершает запрос. Затем вы можете сделать это так, чтобы это промежуточное программное обеспечение было выполнено ПЕРЕД ПОМОЩЬЮ ПОЛУЧЕНИЯ ПОЛЬЗОВАТЕЛЯ (если вы используете что-то вроде koa-body). Таким образом, хотя тело уже «получено», запрос отправляется до того, как тело даже разобрано.

Это довольно легко реализовать что-то подобное, и есть много руководств, в которых описывается процесс создания и регистрации нового промежуточного программного обеспечения. Если вы еще не знаете, как это сделать, я предлагаю начать here.

EDIT: Если вы выполняете загрузку файлов, и вы используете multipart, то не должно быть проблем с проверкой заголовков с использованием функции промежуточного программного обеспечения и отправкой 401. Это приведет к прекращению соединения и загрузки файлов, поскольку пока вы это сделаете, прежде чем начинать синтаксический анализ загрузки.

+0

Привет @Yuri, спасибо за ваш ответ! Я добавил некоторые детали выше. Дело в том, что каждый раз, когда вы читаете заголовки, неэффективно получать все тело. Фактически, если заголовки не в порядке, запрос отбрасывается. Таким образом, было бы гораздо лучше получить тело только после проверки заголовков, если они в порядке. Не уверен, что это возможно, и насколько это было бы сложно. – Pensierinmusica

+0

Я вижу ... последнее: что, если оно не много, но просто очень большое приложение/json? Будет ли ваш предложенный подход по-прежнему действительным? Благодаря! – Pensierinmusica

+0

@Pensierinmusica Если он не является многопрофильным, вам может быть лучше отправить исходный запрос без данных, и если заголовки будут нормально отвечать ОК, но если заголовки не отвечают на плохой запрос. Затем клиент может решить, следует ли повторно отправлять запрос со всей совокупностью данных, когда он получает начальный ответ от сервера. Недостатком является то, что для этого требуются две круглые поездки.Я не вижу другого подхода. –