POST HTTP usando XHR con codificación de transferencia fragmentada
Tengo una API REST que acepta un archivo de audio a través de una publicación HTTP. La API tiene soporte para Transfer-Encoding: encabezado de solicitud fragmentado para que el archivo se pueda cargar en pedazos a medida que se crea desde una grabadora que se ejecuta en el cliente. De esta manera, el servidor puede comenzar a procesar el archivo a medida que llega para mejorar el rendimiento. Por ejemplo:
HTTP 1.1 POST ... / v1 / processAudio
Transferencia-Codificación: fragmentada
[Trozo 1 256 bytes] (el servidor comienza a procesar cuando llega)
[Trozo 2 256 bytes]
[Trozo 3 256 bytes]
...
Los archivos de audio suelen ser cortos y tienen un tamaño de alrededor de 10K a 100K. Tengo C # y código Java que funciona, así que sé que API funciona. Sin embargo, parece que no puedo hacer que la grabación y la carga funcionen en un navegador usando JavaScript.
Aquí está mi código de prueba que realiza una POST a localhost con 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>
El problema es que recibo el siguiente error en Chrome
Se negó a configurar el encabezado inseguro "Transferencia-Codificación"
streamUpload @ uploadTest.html: 14 onclick @ uploadTest.html: 24
Después de mirar la documentación de XHR, todavía estoy confundido porque no habla de encabezados de solicitud inseguros. Me pregunto si es posible que XHR no permita o implementeTransferencia-Codificación: fragmentada para HTTP POST?
He analizado soluciones alternativas utilizando múltiples solicitudes XHR.send () y WebSockets, pero ambas no son deseables porque requerirá cambios significativos en las API del servidor que ya están en su lugar, son simples, estables y funcionan. El único problema es que parece que no podemos PUBLICAR desde un navegador con psedo-streaming a través de Transfer-Encoding: encabezado de solicitud fragmentado.
Cualquier pensamiento o consejo sería muy útil.