HTTP 请求处理和 409 响应

IBM Traveler 通过特定方式处理 HTTP 请求,这些方式可能会导致 409 响应。

IBM Traveler 服务器与其设备之间的所有通信均通过 HTTP 进行处理。对 Domino 发出 HTTP 请求时,HTTP 会将该请求传递给 IBM Traveler servlet(请求会作为 Domino HTTP 任务的一部分来运行)。该 servlet 主要是通过本地套接字传递到 IBM Traveler 任务的传递程序。这意味着,当请求传递到 IBM Traveler 后,该 servlet 会等待响应,以将其作为 HTTP 响应回传给设备。

设备与 Domino HTTP 之间的网络操作可在 Domino HTTP 级别查看,但这些操作不会传递到在 Domino HTTP Web 容器中运行的 servlet。因此,在收到响应之前,IBM Traveler servlet 不会知道设备是否已失去连接或者是否故意关闭了 HTTP 请求。

HTTP 有许多定义的响应代码。200 表示“正常”。409 表示“冲突”。另外还有其他响应代码,但这两个代码是本文的主要重点。

根据已有知识,大多数设备一次只能有一个面向服务器的 HTTP 请求保持打开状态。如果设备需要发出新的请求,那么设备会关闭先前的请求,然后再打开新的请求。如果设备失去了连接,那么先前的请求将自动关闭;连接复原后,设备将打开新的请求。这些请求关闭时,不管出于何种原因关闭,Domino HTTP 都会识别到此类关闭情况,但 IBM Traveler servlet 不会。因此,请求将保持打开状态并占用系统资源,包括 HTTP 线程。要释放这些资源,IBM Traveler 应具有收到新请求时关闭先前请求的逻辑,而且根据已有知识,设备知道已关闭先前的那些请求。要关闭请求,IBM Traveler servlet 必须通过向 Domino HTTP 返回某些内容来进行响应,然后 Domino HTTP 将尝试传递该响应;该响应的传递最终应该会失败,因为请求已关闭,但这一切都会记录到日志中。根据此新请求与旧请求冲突的逻辑,IBM Traveler 在这种情况下使用的 HTTP 代码为 409。因此,您可能会在日志(IBM Traveler 和 HTTP)中看到许多 HTTP 409 响应。虽然这些响应不是 200(正常)响应,但也并不指示有问题,这些响应表示的是在这些情况下管理 HTTP 资源的方式。

如果系统中包含了代理或防火墙,那么代理或防火墙自己的请求也会保持打开状态,并获得 409 响应。但是,设备最终应该不会收到这些响应,因为请求至少会在设备与服务器之间路径中的一个点上被放弃。