5

我正在构建一个 httpserver 作为我的学术 Java 课程的一部分,该服务器应该只支持基本的 GET 和 POST 请求。

我想知道是否有一种优雅的方法来处理在将 html 文件流内容(以及在我已经发送响应标头之后)写入 HttpServer 输出流的过程中发生的错误

通过优雅的方式,我指的是显示或将用户重定向到“内部服务器错误”错误页面。

我尝试重新发送带有 501 错误代码的 http 响应标头,但是 java 抛出一个异常,声称标头已经发送...

一种解决方法是将文件的内容读入内存,然后才发送标头和内容,但可能会出现其他问题,此外,我不想在将大文件作为响应发送之前将它们加载到内存中.

4

2 回答 2

5

一旦通过网络发送响应状态,就无法更改。因此,如果您发送了200 OK回复,之后您将无法改变主意。如您所见,这会在响应中间发生错误的情况下出现问题。

据我所知,您唯一能做的就是发送分块响应。请参阅 RFC 2616 的第 3.6.1 节:

分块编码修改消息的主体,以便将其作为一系列块传输,每个块都有自己的大小指示符,后跟一个包含实体头字段的可选尾部。这允许动态生成的内容与接收者验证其已收到完整消息所需的信息一起传输。

此预告片的目的是提供有关实体主体的信息,这些信息在发送实体主体之前无法计算。但是,第 7.1 节允许在此预告片中包含任何标题:

扩展头机制允许在不改变协议的情况下定义额外的实体头字段,但不能假设这些字段可以被接收者识别。无法识别的头域应该被接收者忽略并且必须被透明代理转发。

因此,虽然您可以表示在响应中发生了错误,但必须在两部分之间约定如何发出信号。通常,您不能使用任何您可以假设客户端将理解为发出错误情况的信号的方法。

在带有Content-length标头的消息中过早结束连接是一种选择,但这是明确禁止的:

当在允许消息体的消息中给出 Content-Length 时,其字段值必须与消息体中的八位字节数完全匹配。HTTP/1.1 用户代理必须在收到和检测到无效长度时通知用户。

也就是说,虽然服务器不能发送比他宣传的更短的消息,但客户端必须检查这个错误情况并报告(代理甚至可以缓存这个部分响应)。

于 2011-08-17T10:35:37.440 回答
-1

通过优雅的方式,我指的是显示或将用户重定向到“内部服务器错误”错误页面。

如果您无法发送“成功”响应,您将如何发送不同的响应?您所能做的就是记录它并忘记它。

于 2011-08-17T10:43:54.110 回答