Обработка «ожидающего» HTTP-заголовка в приложении Express - PullRequest
0 голосов
/ 16 марта 2020

Я создаю Express приложение, которое выполняет низкоуровневую обработку HTTP. Среди запросов, которые должны быть обработаны, есть запросы с произвольными Expect заголовками («произвольное» значение, «содержащее значения, отличные от единственного указанного значения 100-continue»).

У меня наивно Предполагается, что я смогу получить доступ и обработать заголовок Expect в своей функции-обработчике запросов так же, как и любой другой заголовок HTTP-запроса:

import express from "express";

const app = express();

app.post("/foo", (req, res) => {
    console.log(req.header("accept"));
    console.log(req.header("expect"));

    // do stuff

    res.status(200).json({foo: "bar"});
});

app.listen(3000);

Это прекрасно работает, если нет заголовка Expect на самом деле установлен. Однако, как только приложение получает запрос с таким набором заголовков, оно, похоже, даже не вызывает обработчик запроса, а сразу отклоняет запрос со статусом 417 Expectation Failed:

$ http -v localhost:3000/foo foo=bar Expect:202-accepted
POST /foo HTTP/1.1
Accept: application/json, */*
[...]
User-Agent: HTTPie/0.9.9
Expect: 202-accepted

{
    "foo": "bar"
}

HTTP/1.1 417 Expectation Failed
Connection: keep-alive
Date: Mon, 16 Mar 2020 13:12:28 GMT
Transfer-Encoding: chunked

На На первый взгляд кажется, что Express дает некоторую особую обработку запросам с заголовком Expect и отклоняет их еще до того, как они достигнут обработчика запросов. Как я могу «убедить» Express поступить иначе?

1 Ответ

1 голос
/ 16 марта 2020

Запросы с заголовком Expect отлавливаются не Express, а Node.JS ' стандартным http модулем (который используется Express под колпаком). Класс http.Server даже имеет специфицированный c checkExpectation обработчик событий, который вызывается для запросов с заголовком Expect, который не равен 100-continue (выделено мной):

Событие: 'checkExpectation'

Добавлено в: v5.5.0

  • запрос
  • ответ

Отправляется каждый раз при получении запроса с заголовком HTTP Expect, где значение не равно 100-continue. Если это событие не прослушивается, сервер автоматически ответит 417 Expectation Failed соответствующим образом.

Когда это событие отправляется и обрабатывается, событие request не будет отправлено. .

Поскольку событие request не отправляется, запросы Express никогда не обрабатываются. И когда для события checkExpectation не настроен прослушиватель, http.Server просто отклонит запрос с помощью 417 Expectation Failed.

. Возможное решение - не просто вызвать app.listen, но определить свой собственный HTTP-сервер (с вашим приложением Express в качестве прослушивателя запросов), а затем прослушивает checkExpectation события и вручную передает их в ваше приложение express:

import express from "express";
import * as http from "http";

const app = express();
const server = http.createServer(app);

app.post("/foo", (req, res) => {
    console.log(req.header("accept"));
    console.log(req.header("expect"));

    // do stuff

    res.status(200).json({foo: "bar"});
});

server.on("checkExpectation", app);
server.listen(3000);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...