【问题标题】:Does JRE HttpServer violates the 'expect-continue' semantics of HTTP?JRE HttpServer 是否违反了 HTTP 的“expect-continue”语义?
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

    • 作为这个好答案的补充,我要补充一点,sun HttpServer 的使用范围非常。对于任何真正的网络服务器需求,你应该使用像jetty、apache或其他高质量java网络服务器的主机。
    • @jtahlborn 这个服务器嵌入的项目是一个学术环境,所以 afaik 有其他考虑使用这个,比如它是 java 的一部分。我不得不承认 Jetty 应该是一个更好的决定,因为几乎没有人将 sun httpserver 用于任何严重的事情。
    • @antlersoft 感谢您的回答,但是服务器在发送 100 后不愿意接受请求,因为客户端尚未授权。根据www8.org/w8-papers/5c-protocols/key/key.html,这是一个有意图的用例。在这种情况下,无法与 sun httpserver 通信,它应该避免发送 continue 消息。但是,是的,它不是核心协议,它只是带宽优化的外围设备。也许称其为违规是不合适的......而且可能无论如何都不有趣......这个问题似乎没有多少朋友:)
    猜你喜欢
    • 1970-01-01
    • 2021-06-19
    • 2017-03-17
    • 2014-02-15
    • 2010-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-03
    相关资源
    最近更新 更多