'In java some redirected urls return the data from redirected page okay but some do not

I have some Java code that takes a url and then returns the data (and at later point BufferedImage is constructed from it, the problem is it works for most urls from particular website but not all.

The urls are actually redirects so for example I pass

 //https://coverartarchive.org/release/bdd0e35c-ce68-3f5b-b957-f83ab5846111/front

it will actually redirect to

//https://ia600301.us.archive.org/31/items/mbid-bdd0e35c-ce68-3f5b-b957-f83ab5846111/mbid-bdd0e35c-ce68-3f5b-b957-f83ab5846111-6094238097.jpg

and return the correct data

But if I pass the seemingly very similar url

//http://coverartarchive.org/release/6b105b89-21ee-414a-b98f-b2756c92b0bc/front
        

Then although this is what is the url seen if pasted into web-browser

//https://ia902907.us.archive.org/33/items/mbid-6b105b89-21ee-414a-b98f-b2756c92b0bc/mbid-6b105b89-21ee-414a-b98f-b2756c92b0bc-3167310704.jpg

My code only returns 169 bytes

If I pass the url it redirects to directly

//https://ia902907.us.archive.org/33/items/mbid-6b105b89-21ee-414a-b98f-b2756c92b0bc/mbid-6b105b89-21ee-414a-b98f-b2756c92b0bc-3167310704.jpg

then it works okay, but I dont have this url so not a solution.

This is quite old code, maybe a better way to do it now, but is my code broken or is the website broken ?

private static byte[] convertUrlToByteArray(URL url) throws IOException
        {
            //Get imagedata, we want to ensure we just write the data as is as long as in a supported format
            URLConnection connection = url.openConnection();
            connection.setConnectTimeout(URL_TIMEOUT);
            connection.setReadTimeout(URL_TIMEOUT);
         
            // Since you get a URLConnection, use it to get the InputStream
            InputStream in = connection.getInputStream();
            // Now that the InputStream is open, get the content length
            int contentLength = connection.getContentLength();
            // To avoid having to resize the array over and over and over as
            // bytes are written to the array, provide an accurate estimate of
            // the ultimate size of the byte array
            ByteArrayOutputStream tmpOut;
            if (contentLength != -1)
            {
                tmpOut = new ByteArrayOutputStream(contentLength);
            }
            else
            {
                tmpOut = new ByteArrayOutputStream(16384); // Pick some appropriate size
            }
    
            byte[] buf = new byte[1024];
            while (true)
            {
                int len = in.read(buf);
                if (len == -1)
                {
                    break;
                }
                tmpOut.write(buf, 0, len);
            }
            in.close();
            tmpOut.close(); // No effect, but good to do anyway to keep the metaphor alive
            return tmpOut.toByteArray();
        }


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source