Я начал внедрять образец сервера (в netty) для поддержки 100 continue. У меня возникла некоторая путаница, когда я прохожу через раздел 8.2.3 RCF2616. Это говорит
После получения запроса, который включает в себя поле заголовка запроса Expect с ожиданием «100-continue», исходный сервер ДОЛЖЕН либо ответить статусом 100 (Continue) и продолжить чтение из входного потока, либо ответить кодом окончательного статуса. Исходный сервер НЕ ДОЛЖЕН ждать тела запроса перед отправкой ответа 100 (Продолжить). Если он отвечает окончательным кодом состояния, он МОЖЕТ закрыть транспортное соединение или МОЖЕТ продолжить чтение и отклонить остальную часть запроса. Он НЕ ДОЛЖЕН выполнять запрошенный метод, если он возвращает окончательный код состояния.
Что означает исходный сервер НЕ ДОЛЖЕН ждать тела запроса перед отправкой ответа 100 (продолжить). Должен ли мой сервер сначала проверить заголовки, а затем отправить код состояния 100 (продолжить) или немедленно отправить код статуса 100?
Пожалуйста, поясните мне фактическое поведение http-сервера для поддержки 100 продолжить
В настоящее время это мой channelRead
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
if (msg instanceof HttpRequest) {
HttpRequest req = (HttpRequest) msg;
request = req;
if (req.getMethod() != HttpMethod.POST) {
FullHttpResponse response = new DefaultFullHttpResponse(HTTP_1_1, METHOD_NOT_ALLOWED);
ctx.write(response).addListener(ChannelFutureListener.CLOSE);
} else {
boolean valid = false;
for (Map.Entry<String, String> header : req.headers()) {
if (header.getKey().equals("my-special-header")) {
valid = true;
break;
}
}
if (!valid) {
FullHttpResponse resp = new DefaultFullHttpResponse(HTTP_1_1, BAD_REQUEST);
ctx.write(resp).addListener(ChannelFutureListener.CLOSE);
} else {
if (HttpHeaders.is100ContinueExpected(request)) {
ctx.write(new DefaultFullHttpResponse(HTTP_1_1, CONTINUE));
}
}
}
} else if (msg instanceof LastHttpContent && msg != LastHttpContent.EMPTY_LAST_CONTENT) {
DefaultLastHttpContent content = (DefaultLastHttpContent) msg;
System.out.println("content read");
FullHttpResponse response = new DefaultFullHttpResponse(HTTP_1_1, OK, content.content());
response.headers().set(CONTENT_TYPE, "text/plain");
response.headers().set(CONTENT_LENGTH, response.content().readableBytes());
boolean keepAlive =HttpHeaders.isKeepAlive(request);
if (!keepAlive) {
ctx.write(response).addListener(ChannelFutureListener.CLOSE);
} else {
response.headers().set(CONNECTION, Values.KEEP_ALIVE);
ctx.write(response);
}
}
}
The origin server must not wait for the message body before sending the 100 (Continue) response.
В настоящее время моя реализация проверяет действительный заголовок и отправляет 100 или неверный запрос - person user392919   schedule 28.09.2015