Как явным образом отключить режим потоковой передачи для HTTP-соединений в Android?

Я нацелен на веб-службу REST от Android 4.0 с помощью HttpsURLConnection. Это отлично работает, если я не попытаюсь что-то сделать. Это соответствующий раздел кода:

   connection.setDoOutput(true);
   connection.setChunkedStreamingMode(0);

   ByteArrayOutputStream out = new ByteArrayOutputStream();
   serializeObjectToStream(out, object);
   byte[] array = out.toByteArray();
   connection.getOutputStream().write(array, 0, array.length);

Это вызывает следующее исключение:

   java.net.HttpRetryException: Cannot retry streamed HTTP body

От отладки я понял, что выходной поток, который я получаю через connection.getOuputStream(), имеет тип ChunkedOutputStream и от копания в исходном коде Androids, я решил, что если запрос нужно повторить (по какой-либо причине), он выше, потому что он выясняет, что он не использует RetryableOutputStream, который он там хочет.

Вопрос в следующем: как мне заставить HttpsURLConnection возвращать такой RetryableOutputStream, или, вернее, как я могу предотвратить кодирование кодированного запроса? Я думал, что сделал это уже с setChunkedStreamingMode(0), но, видимо, это не так...

[править]

Нет, реализация java.net.HTTPUrlConnection игнорирует режим потоковой передачи 0 или ниже:

 public void setChunkedStreamingMode(int chunkLength) {
    [...]
    if (chunkLength <= 0) {
        this.chunkLength = HttpEngine.DEFAULT_CHUNK_LENGTH;
    } else {
        this.chunkLength = chunkLength;
    }
}

Ответ 1

Облом! Решение состоит в том, чтобы не вызывать setChunkedStreamingMode() (или даже setFixedStreamingMode()) из кода клиента вообще! "-1" являются внутренними значениями по умолчанию для fixedLength и chunkedLength и не могут быть установлены на стороне клиента, поскольку установка значения, меньшего или равного "0", по умолчанию равна HttpEngine.DEFAULT_CHUNK_LENGTH (или генерирует исключение в режиме фиксированного потока).

Ответ 2

Решение состоит в том, чтобы установить заголовок Content-Length (который может быть задан этой следующей частью) и вызвать setFixedLengthStreamingMode с правильной длиной сообщения POST, которое вы собираетесь отправить.

См. раздел "Режим потокового воспроизведения" в этом FAQ:

Использование java.net.URLConnection для запуска и обработки HTTP-запросов