xhr.setRequestHeader("Content-Type", "application/octet-stream"); daraus wird: Content-Type: application/octet-stream; charset=UTF-8
In bestimmten Fällen ergänzt und/oder verändert der Browser diverse Header-Informationen.
Nachzulesen ist das in der Spezifikation von setRequestHeader(), dort steht in einer Notiz, dass beim Senden Header-Informationen ggf. geändert werden. Folgt man dem Link zur send()-Spezifikationen, stellt man dort unter Punkt 4 fest, dass bei bestimmten Typen des body-Parameters (Blob, BufferSource, FormData, URLSearchParams und USVString) der Content-Type-Header gesetzt wird. Und zwar in einer Weise, die dort auch näher beschrieben ist.
Von hier aus, solltest du dein beschriebenes Verhalten nun selber ergründen und ggf. auch reparieren können.