我们公司应该通过HTTP调用类似REST的服务,响应状态代码102 Processing
进行冗长(耗时)的操作。据我所知,102 Processing并不是官方HTTP标准的一部分,而是an extension for the WebDAV protocol。说,它不是我们尝试访问的WebDAV,而是一个“借用”此状态代码的HTTP服务。
哪个java库支持这个?
1)HTTP规范定义了状态代码注册表(http://www.iana.org/assignments/http-status-codes);在描述状态代码的规范中确实无关紧要。
2)话虽这么说,RFC 4918(废弃RFC 2518)不再定义代码102(缺少任何实现)。
首先,在以下情况下,102 PROCESSING状态似乎很有用:
该动作运行时间很长,例如,一些复杂的数据库删除操作与级联,或者,在WebDAV上,一个大目录深拷贝等。
我需要这个,因为在某些环境中,访问是通过防火墙进行的,并且超时为5分钟。如果TCP连接没有任何超过5分钟,则连接将关闭。在服务器端,这显示为关闭的IOError连接,在客户端这也显示连接已关闭或超时错误消息。
我们使用102 PROCESSING,因为在我们可以写入servlet输出流之前,我们需要保持我们的选项打开以仍然使用finall 200,300(重定向)或400(错误)进行回复。
确实不能很好地支持102 PROCESSING。 JETTY(服务器)有一些基本的实现,我用一个单独的Thread休息了5分钟,检查servlet输出流是否仍未提交,然后发出response.sendProcessing()并再次进入休眠状态。一旦写入实际输出,就会终止线程。
Apache HTTPD如果用作此JETTY实现的反向代理,则通过罚款传递这102个PROCESSING响应。但是在其中10个之后它会抛出一个错误。
sun.net.www.protocol.http.HttpURLConnection对此不太适用。我有一个小测试程序:
import java.net.URL;
import java.net.URLConnection;
import java.net.HttpURLConnection;
import java.io.*;
public class urlcontest {
public static void main(String args[]) throws Exception {
URLConnection conn = new URL(args[0]).openConnection();
System.err.println("URLConnection class: " + conn.getClass());
if(args.length > 1)
conn.setRequestProperty("Cookie",args[1]);
conn.setAllowUserInteraction(false);
conn.setDoOutput(false);
conn.setDoInput(true);
InputStream in = null;
if(conn instanceof HttpURLConnection) {
HttpURLConnection hconn = (HttpURLConnection)conn;
int responseStatus = hconn.getResponseCode();
try {
in = hconn.getInputStream();
System.err.println("HTTP input: " + responseStatus);
} catch(IOException e) {
System.err.println("HTTP error: " + responseStatus);
in = ((HttpURLConnection)conn).getErrorStream();
}
} else
in = conn.getInputStream();
byte[] buf = new byte[4096];
int nread = 0;
while((nread = in.read(buf)) > 0)
System.out.write(buf, 0, nread);
in.close();
}
}
有了这个,我得到以下行为:
URLConnection class: class sun.net.www.protocol.http.HttpURLConnection
HTTP input: 102
HTTP/1.1 102 Processing
HTTP/1.1 102 Processing
HTTP/1.1 102 Processing
HTTP/1.1 301 Moved Permanently
Location: ...
Content-Type: text/html
Content-Length: ...
Server: Jetty(6.0.1)
<html>...</html>
因此,显然,它将第一个102 PROCESSING作为最终响应,然后从输入流中读取所有其他内容,在暂停期间阻塞。
如果我能找到这个或另一个HttpURLConnection实现的源代码,我会做一些事情来使它工作。
不知怎的,它应该已经处理了100 CONTINUE响应。这不应该太难。