哪个java http客户端支持状态码102处理?

时间:2014-04-07 07:59:21

标签: java http webdav

我们公司应该通过HTTP调用类似REST的服务,响应状态代码102 Processing进行冗长(耗时)的操作。据我所知,102 Processing并不是官方HTTP标准的一部分,而是an extension for the WebDAV protocol。说,它不是我们尝试访问的WebDAV,而是一个借用"借用的HTTP服务。这个状态代码。

哪个java库支持这个?

2 个答案:

答案 0 :(得分:3)

1)HTTP规范定义了状态代码注册表(http://www.iana.org/assignments/http-status-codes);无论在哪种规范中描述状态代码都无关紧要。

2)话虽如此,RFC 4918(废弃RFC 2518)不再定义代码102(缺少任何实现)。

答案 1 :(得分:0)

首先,在以下情况下,“ 102正在处理”状态似乎很有用:

操作持续时间很长,例如,一些复杂的带有级联的数据库删除操作,或者在WebDAV上,是大目录深度复制等。

我需要这样做,因为在某些环境中,访问是通过防火墙进行的,超时时间为5分钟。如果超过5分钟没有任何TCP连接通过连接,则连接已关闭。在服务器端,这显示为IOError连接已关闭,在客户端,这也显示为连接已关闭或超时错误消息。

我们使用102 PROCESSING,因为我们需要保持打开选项以在写入Servlet输出流之前仍然以最终200、300(重定向)或400(错误)进行回复。

确实不能很好地支持102 PROCESSING。 JETTY(服务器)有一些基本的实现,我用一个单独的线程在上面进行了处理,该线程休眠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个处理作为最终响应,然后从输入流中读取其他所有内容,并在暂停期间阻塞。

如果我可以找到该实现或另一个HttpURLConnection实现的源代码,我会做一些事情使其生效。

它应该也已经可以处理100 CONTINUE响应了。这样做应该不难。