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.