HTTP POST usando XHR com codificação de transferência em blocos

Eu tenho uma API REST que aceita um arquivo de áudio por meio de uma postagem HTTP. A API tem suporte para o cabeçalho de solicitação Transfer-Encoding: chunked, para que o arquivo possa ser carregado em pedaços à medida que é criado a partir de um gravador em execução no cliente. Dessa forma, o servidor pode começar a processar o arquivo à medida que ele chega, para melhorar o desempenho. Por exemplo:

HTTP 1.1 POST ... / v1 / processAudio

Codificação de transferência: fragmentada

[Chunk 1 256 Bytes] (o servidor inicia o processamento quando chega)

[Pedaço de 2 256 bytes]

[Pedaço de 3 256 bytes]

...

Os arquivos de áudio são tipicamente curtos e têm tamanho entre 10 e 100K. Eu tenho código C # e Java que está funcionando, então eu sei que a API funciona. No entanto, não consigo fazer com que a gravação e o upload funcionem em um navegador usando javascript.

Aqui está o meu código de teste que faz um POST para localhost com Transfer-Encoding:

<html>
<script type="text/javascript">
  function streamUpload() {
    var blob = new Blob(['GmnQPBU+nyRGER4JPAW4DjDQC19D']);
    var xhr = new XMLHttpRequest();
    // Add any event handlers here...
    xhr.open('POST', '/', true);
    xhr.setRequestHeader("Transfer-Encoding", "chunked");
    xhr.send(blob);
  }
</script>

<body>
  <div id='demo'>Test Chunked Upload using XHR</div>
  <button onclick="streamUpload()">Start Upload</button>
</body>

</html>

O problema é que estou recebendo o seguinte erro no Chrome

Recusou-se a definir o cabeçalho não seguro "Transfer-Encoding"

streamUpload @ uploadTest.html: 14 onclique em @ uploadTest.html: 24

Depois de analisar a documentação do XHR, ainda estou confuso porque não fala sobre cabeçalhos de solicitação inseguros. Gostaria de saber se é possível que o XHR não permita ou implementeCodificação de transferência: fragmentada para HTTP POST?

Analisei soluções alternativas usando várias solicitações XHR.send () e WebSockets, mas ambas são indesejáveis, pois exigirão alterações significativas nas APIs do servidor que já estão em vigor, simples, estáveis e funcionando. O único problema é que não conseguimos POST em um navegador com psedo-streaming via Transfer-Encoding: cabeçalho de solicitação em pedaços.

Qualquer pensamento ou conselho seria muito útil.

questionAnswers(1)

yourAnswerToTheQuestion