Java Http~URLConnection response code -1

2019-08-31 16:44发布

问题:

Trying to download a file in Java from a Http server (nginx)

The exact same link java is attempting to download works in the browser and downloads, but java responds with:

java.io.IOException: <URL WOULD BE HERE> returned response code -1
    at com.atlauncher.data.Downloadable.getConnection(Downloadable.java:149)
    at com.atlauncher.data.Downloadable.getFilesize(Downloadable.java:85)
    at com.atlauncher.workers.InstanceInstaller.configurePack(InstanceInstaller.java:1134)
    at com.atlauncher.workers.InstanceInstaller.doInBackground(InstanceInstaller.java:1399)
    at com.atlauncher.workers.InstanceInstaller.doInBackground(InstanceInstaller.java:59)
    at javax.swing.SwingWorker$1.call(SwingWorker.java:296)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
    at java.util.concurrent.FutureTask.run(FutureTask.java:166)
    at javax.swing.SwingWorker.run(SwingWorker.java:335)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:722)

The download code:

this.connection = (HttpURLConnection) new URL(this.url).openConnection();
    this.connection.setUseCaches(false);
    this.connection.setDefaultUseCaches(false);
    this.connection.setConnectTimeout(9000);
    //this.connection.setRequestProperty("Accept-Encoding", "gzip");
    this.connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.72 Safari/537.36");
    this.connection.setRequestProperty("Cache-Control", "no-store,max-age=0,no-cache");
    this.connection.setRequestProperty("Expires", "0");
    this.connection.setRequestProperty("Pragma", "no-cache");
    this.connection.connect();
    if (this.connection.getResponseCode() / 100 != 2) {
        System.out.println(this.connection);
        throw new IOException(this.url + " returned response code "
                + this.connection.getResponseCode());
    }

Any ideas why this is occurring? It's strange that the exact same url works in the browser. And the exact same code works downloading different files from the same server, and directory...

回答1:

To find out, you must not throw the IOException and print the complete response. As according to the javadoc of the getResponseCode() method:

Returns -1 if no code can be discerned from the response (i.e., the response is not valid HTTP).

You may have a response which is not HTTP at all.



回答2:

This has happened to me on one occasion where I was using my own implementation of an HTTP server. When running in browsers, it would work fine but making an HttpURLConnection would give the Invalid Http response and response code would be -1.

The problem was that the HttpURLConnection looks for header strictly in the format

HTTP/1.1 200 OK

but my custom server was giving just an

HTTP 200 OK

As soon as I changed the version to 1.1, it worked. So check your response using cURL as follows:

curl -v -I URL_HERE

Hope it helps!