0

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...

Dan Spiteri
  • 373
  • 1
  • 4
  • 20
  • The stack trace is incomplete, can you provide Caused part of it? It only contains `Downloadable#getConnection()` information – hoaz Dec 06 '13 at 20:54

2 Answers2

0

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.

smeaggie
  • 197
  • 9
  • I searched for ages and could not find it on the javadoc! :@ but i managed to find something else on a forums somewhere, after about 2hours of searching. I had to disable keepAlive and i also changed my user-agent to what firefox sends. this seems to work, strangley, even though my server doesnt check for those. :S – Dan Spiteri Dec 06 '13 at 21:40
0

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!

Ruraj
  • 467
  • 2
  • 8
  • 13