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



我们公司应该通过HTTP调用类似REST的服务,该服务响应状态代码102 Processing以进行冗长(耗时)的操作。据我所知,102 Processing并不是官方HTTP标准的一部分,而是WebDAV协议的扩展。也就是说,我们尝试访问的不是WebDAV,而是"借用"此状态代码的HTTP服务。

哪个 Java 库支持此功能?

1)HTTP规范定义了一个状态代码注册表(http://www.iana.org/assignments/http-status-codes);在哪个规范中描述状态代码并不重要。

2)话虽如此,RFC 4918(过时的RFC 2518)不再定义代码102(因为缺乏任何实现)。

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

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

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

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

确实,102 处理没有得到很好的支持。JETTY(服务器)有一些基本的实现,我用一个单独的线程在上面制作了一些东西,该线程休眠 5 分钟,检查 servlet 输出流是否仍未提交,然后发出响应.sendProcessing() 并再次进入睡眠状态。线程在写入实际输出后立即终止。

Apache HTTPD 如果用作此 JETTY 实现的反向代理,则会通过 fine 传递这些 102 个处理响应。但是在 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 响应。这应该不难做到。

相关内容

  • 没有找到相关文章

最新更新