【发布时间】:2012-02-08 15:59:07
【问题描述】:
这是我使用 com.sun.net.httpserver.HttpServer 中内置的 Java 和多步身份验证方案的一些 problems 的后续帖子。
我是hinted at,发送大量数据会使 Java 客户端无法收到早期的“需要授权”消息(由于 Java 阻塞 I/O)。
这就是为什么HTTP定义“expect-continue握手”涉及100个状态码(RFC 2616)的原因:
100(继续)状态的目的是允许客户端 发送带有请求正文的请求消息以确定是否 源服务器愿意接受请求(基于请求 headers) 在客户端发送请求正文之前。在某些情况下,它 对客户来说可能不合适或效率极低 如果服务器将拒绝消息而不查看,则发送正文 身体。
所以在这种情况下不适合发送数据。服务器...
必须以 100(继续)状态响应并继续阅读 来自输入流,或以最终状态码响应。
不幸的是,Sun HttpServer 总是以 100 状态代码响应而不涉及应用程序。看着source:
/* 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
);
}
当不涉及应用程序时,它似乎无法与客户端沟通它不适合发送其消息,因此违反了协议(这确实导致了早期关闭连接和管道损坏等问题)。万一我遗漏了什么,我最好问问社区这个解释是否正确:)
【问题讨论】:
标签: java http protocols com.sun.net.httpserver