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

问题描述 投票:2回答:2

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

哪个java库支持这个?

java http webdav
2个回答
3
投票

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

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


0
投票

首先,在以下情况下,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响应。这不应该太难。

© www.soinside.com 2019 - 2024. All rights reserved.