Mik*_* S. 4 java error-handling http fileinputstream
我将在我的学术Java课程中建立一个httpserver,该服务器应仅支持基本的GET和POST请求。
我想知道是否存在一种处理错误的优雅方法,该错误发生在将 html文件流内容(以及我已经发送响应头)写入HttpServer输出流的过程中。
优雅的方式是指显示用户或将用户重定向到“内部服务器错误”错误页面。
我尝试使用501错误代码重新发送http响应标头,但是java抛出一个异常,声称标头已经发送过...
一种解决方法是将文件的内容读取到内存中,然后再发送标头和内容,但是可能会出现其他问题,此外,我不想在将大文件发送出去作为响应之前将其加载到内存中。
一旦响应状态通过网络发送,就无法更改。因此,如果您发送了200 OK回复,则此后您将无法改变主意。如您所见,如果在响应中间出现错误,这将带来一个问题。
据我所知,您唯一可以做的就是发送分块响应。请参阅RFC 2616的3.6.1节:
分块编码修改消息的主体,以便将其作为一系列块传输,每个块都有自己的大小指示符,后跟一个包含实体报头字段的可选尾部。这允许动态产生的内容与接收者验证其已收到完整消息所需的信息一起传输。
该预告片的目的是提供有关在发送实体之前无法计算的实体信息。但是,第7.1节允许此标头中包含任何标头:
扩展头机制允许在不更改协议的情况下定义其他实体头字段,但是不能假定收件人可以识别这些字段。接收者应忽略无法识别的报头字段,并且必须由透明代理转发。
因此,尽管您可以在响应中间发出错误信号,但必须在两部分之间约定如何发出错误信号。通常,您不能使用任何可以假设客户端会理解为发出错误状态信号的方法。
在带有Content-length标题的消息中过早终止连接是一个选项,但是明确禁止这样做:
在允许消息正文的消息中给出Content-Length时,其字段值务必与消息正文中的OCTET数量完全匹配。当接收和检测到无效长度时,HTTP / 1.1用户代理必须通知用户。
就是说,尽管服务器不得发送比其广告短的消息,但客户端必须检查此错误情况并进行报告(并且代理甚至可以缓存此部分响应)。
| 归档时间: |
|
| 查看次数: |
799 次 |
| 最近记录: |