无法下载Java 6或7中的URL-适用于Java 5

无法下载Java 6或7中的URL-适用于Java 5,java,httpconnection,Java,Httpconnection,我们有一些非常基本的代码可以从URL下载内容。它在大多数情况下运行良好,但是我们遇到了一些在j6或7中不起作用,但在j5中起作用的URL 这是相当标准的代码: URL url = new URL(sUrl); URLConnection urlCon = url.openConnection(); if (debug) System.out.println("GETURL DEBUG : set user aganet"); urlCon.setRequestProperty("User

我们有一些非常基本的代码可以从URL下载内容。它在大多数情况下运行良好,但是我们遇到了一些在j6或7中不起作用,但在j5中起作用的URL

这是相当标准的代码:

URL url = new URL(sUrl);
URLConnection urlCon = url.openConnection();
if (debug)
    System.out.println("GETURL DEBUG : set user aganet");
urlCon.setRequestProperty("User-Agent", "SportsPunter.com Robot");
urlCon.setRequestProperty("Accept-Encoding", "gzip");
urlCon.setUseCaches(false);
if (debug)
    System.out.println("GETURL DEBUG : set more properites");
InputStream is = urlCon.getInputStream();
BufferedReader br = null;
String urlencoding = urlCon.getContentEncoding();

if (debug)
    System.out.println("GETURL DEBUG : got url encoding " + urlencoding);

if (urlencoding == null)
    urlencoding = "";
if (urlencoding.toLowerCase().indexOf("gzip") != -1) {
    if (encoding.length() == 0)
        br = new BufferedReader(new InputStreamReader(new GZIPInputStream(is)));
    else
        br = new BufferedReader(new InputStreamReader(new GZIPInputStream(is), encoding));
} else {
    if (encoding.length() == 0)
        br = new BufferedReader(new InputStreamReader(is));
    else
        br = new BufferedReader(new InputStreamReader(is, encoding));
}

String buffer = "";
StringBuffer sb = new StringBuffer(suggestedSize);

long start = System.currentTimeMillis();
if (debug)
    System.out.println("GETURL DEBUG : start reading");

while ((buffer = br.readLine()) != null) {

    if (debug)
        System.out.println("GETURL DEBUG : got buffer " + buffer);
    // irrelevant code snip
}
if (debug)
    System.out.println("GETURL DEBUG : finished");
一个不起作用的URL是:

在java 6/java-1.6.0-openjdk-1.6.0.0.x86_64或java 7 jdk1.7.0_71中运行时的输出如下:

GETURL调试:2014年10月28日星期二21:13:52开始 GETURL调试:检查生存时间 GETURL调试:将用户设置为aganet GETURL调试:设置更多属性 GETURL调试:打开输入流 GETURL调试:获取url编码为空 GETURL调试:开始读取 GETURL调试:已完成

正如您所看到的,对readLine的第一次调用返回一个EOF。如果我们使用read而不是readLine,这是一样的

但是,如果我们改为使用Java5JRE-1.5.0

然后读取缓冲区,一点问题都没有

有趣的是,这两个URL似乎都重定向到https连接

由于心脏出血,我们的一些订阅源发生了一些连接问题。我们的解决方案是设置系统属性: System.setPropertyhttps.protocols,TLSv1

而不是我们曾经拥有的: System.setPropertyhttps.protocols,SSLv3,SSLv2Hello

但是,此属性的任一值都会产生相同的结果

如果我们尝试直接下载https版本,我们会得到以下结果: [danielk@robot类]$。/geturl GETURL调试:于2014年10月28日星期二21:44:28 EDT开始 GETURL调试:检查生存时间 GETURL调试:将用户设置为aganet GETURL调试:设置更多属性 GETURL调试:打开输入流

同样,在Java5中,我们没有得到这个异常,数据是从URL成功下载的

以下是我们设置的接受任何证书的代码:


我使用curl测试url,http url将响应302状态码,重定向到https url。 我认为URLConnecton不会自动处理302状态,因为它是从http到https的,它只会自动从http重定向到http。我认为这是出于安全考虑。
因此,您可以手动处理它,检查状态代码,如果它是302,并且位置头是https,那么您可以打开到https url的新连接。

您尝试过url.openStream吗?最后的代码丢失了。。。