Пример сервера для поддержки 100-continue

Я начал внедрять образец сервера (в 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);
        }
    }
}

person user392919    schedule 28.09.2015    source источник
comment
RFC 2616 устарел. Вы можете прочитать ‹greenbytes.de/tech/webdav/rfc7231.html# header.expect ›.   -  person Julian Reschke    schedule 28.09.2015
comment
Спасибо, но мне все еще неясно The origin server must not wait for the message body before sending the 100 (Continue) response. В настоящее время моя реализация проверяет действительный заголовок и отправляет 100 или неверный запрос   -  person user392919    schedule 28.09.2015


Ответы (1)


Я думаю, что "НЕ ДОЛЖНО ждать тела запроса" довольно ясно. Тело не содержит заголовков, поэтому я не уверен, откуда у вас замешательство ...

person Julian Reschke    schedule 28.09.2015