Android / Java: HttpURLConnection не возвращает заголовки перенаправленного файла (например, на S3)

Мой код (воспроизведенный ниже) подключается к URL-адресу и загружает файл на диск на Android. Все стандартные вещи. Когда я пытаюсь использовать этот код для файла на S3, доступ к которому осуществляется через поддомен на нашем сервере, сопоставленный с корзиной (например, foo.example.com => bucket с именем foo.example.com), это часто терпит неудачу. Оказывается (с помощью удобной команды curl ..

 "curl -v -L -X GET http://foo.example.com/f/a.txt") 

.. здесь происходит перенаправление.

Загрузка файла работает нормально, поскольку HttpURLConnection будет следовать перенаправлениям по умолчанию, но вызовы, требующие информации заголовка (getContentLength , getHeaderFieldDate ("Last-Modified", 0) и т.д.) возвращают заголовки из перенаправления 307.

Кто-нибудь знает, как это обойти?

Спасибо

File local = null;
        try {


            Log.i(TAG, "Downloading file " + source);
            conn = (HttpURLConnection) new URL(source).openConnection();
            fileSize = conn.getContentLength(); // ** THIS IS WRONG ON REDIRECTED FILES
            out = new BufferedOutputStream(new FileOutputStream(destination, false), 8 * 1024); 
            conn.connect();

            stream = new BufferedInputStream(conn.getInputStream(), 8 * 1024);

            byte[] buffer = new byte[MAX_BUFFER_SIZE];

            while (true) {
                int read = stream.read(buffer);

                if (read == -1) {
                    break;
                }
                // writing to buffer
                out.write(buffer, 0, read);
                downloaded += read;

                publishProgress(downloaded, fileSize);

                if (isCancelled()) {
                    return "The user cancelled the download"; 
                }

            }
        } catch (Exception e) {
            String msg = "Failed to download file " + source + ". " + e.getMessage();
            Log.e(TAG, msg );
            return msg;
        } finally {
            if (out != null) {
                try {
                    out.flush();
                    out.close();
                } catch (IOException e) {
                    Log.e(TAG, "Failed to close file " + destination);
                    e.printStackTrace();
                }
            }

            if (stream != null) {
                try {
                    stream.close();
                } catch (IOException e) {
                    Log.e(TAG, "Failed to close file " + destination);
                    e.printStackTrace();
                }

            } else {

                long dateLong = conn.getHeaderFieldDate("Last-Modified", 0 ); // ** THIS IS WRONG ON REDIRECTED FILES

                Date d = new Date(dateLong);
                local.setLastModified(dateLong);
            }
7
задан Ben Clayton 25 February 2011 в 15:18
поделиться