Не нарушает ли JRE HttpServer семантику HTTP «ожидай и продолжай»? - PullRequest
0 голосов
/ 08 февраля 2012

Это сообщение о некоторых проблемах Я использовал Java, встроенный в com.sun.net.httpserver.HttpServer и схему многоэтапной аутентификации.

Я намекнул на то, что отправка больших объемов данных делает невозможным получение клиентами Java ранних сообщений «Требуется авторизация» (из-за блокировки ввода-вывода Java).

Именно поэтому HTTP определяет «рукопожатие с ожиданием и продолжением»"с кодом состояния 100 ( RFC 2616 ):

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

Так что в этом случае нецелесообразноотправить данные.Сервер ...

ДОЛЖЕН либо ответить статусом 100 (Продолжить) и продолжить чтение из входного потока, либо ответить кодом окончательного состояния.

К сожалениюСолнце HttpServer всегда отвечает кодом состояния 100 без участия приложения .Глядя на источник :

/* check if client sent an Expect 100 Continue.
 * In that case, need to send an interim response.
 * In future API may be modified to allow app to
 * be involved in this process.
 */
String exp = headers.getFirst("Expect");
if (exp != null && exp.equalsIgnoreCase ("100-continue")) {
    logReply (100, requestLine, null);
    sendReply (
        Code.HTTP_CONTINUE, false, null
    );
}

Когда приложение не задействовано, кажется невозможным сообщить клиенту, что отправка его сообщения неуместна, поэтому протокол нарушен(что действительно приводит к таким проблемам, как ранние замкнутые соединения и сломанные трубы).На всякий случай, если я что-то упускаю, лучше спросить сообщество, правильна ли эта интерпретация:)

1 Ответ

1 голос
/ 08 февраля 2012

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

Конечно, автоматический возврат 100-Continue означает, что вы потеряете потенциальный выигрыш в эффективности, который предназначен для Expect-Continue.обеспечить, но эффективность не является тем, что протокол гарантирует.

...