0

这是我在使用内置 Java和多步身份验证方案时遇到的一些问题的后续帖子。com.sun.net.httpserver.HttpServer

有人暗示,发送较大的数据量会使 Java 客户端无法接收早期的“需要授权”消息(由于 Java 阻塞 I/O)。

这就是 HTTP 定义涉及 100 个状态码(RFC 2616)的“预期继续握手”的原因:

100 (Continue) 状态的目的是允许正在发送带有请求正文的请求消息的客户端在客户端发送请求正文之前确定源服务器是否愿意接受请求(基于请求标头) . 在某些情况下,如果服务器在不查看正文的情况下拒绝消息,则客户端发送正文可能不合适或效率极低。

所以在这种情况下不适合发送数据。服务器...

必须以 100(继续)状态响应并继续从输入流中读取,或以最终状态代码响应。

不幸的是,SunHttpServer总是以 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
    );
}

当不涉及应用程序时,似乎无法向客户端传达它不适合发送其消息,因此违反了协议(这确实会导致早期关闭连接和管道损坏等问题)。以防万一我遗漏了什么,我最好问问社区这种解释是否正确:)

4

1 回答 1

1

我不会说它违反了协议,因为服务器和应用程序之间的通信不是协议的一部分,只是服务器和客户端之间的通信。只要服务器在发送 100-Continue 后接受整个客户端请求,就尊重协议。

当然,自动返回 100-Continue 意味着您失去了 Expect-Continue 旨在提供的潜在效率增益,但效率并不是协议所保证的。

于 2012-02-08T16:08:57.927 回答