Tach!
Es fehlen noch Cookies bzw. Additional Headers.
Spricht eigentlich etwas dagegen, PHPs Stream-Context zu verwenden, statt den Request selbst zusammenzubauen? Du musst ja bei deiner Vorgehensweise für jeden möglichen Header einen neuen Parameter zur Funktion hinzufügen, und beim Verwenden die Reihenfolge beachten und für nicht benötigte einen Ersatz (null) übergeben. Zudem ist man auf genau diese Parameter beschränkt.
Die Übertragung per "multipart/form-data" bedarf wohl eher einer eigenständigen Funktion, da hierfür z. B. noch umfangreiche Regeln für den Aufbau der Part-Header sowie Übergabe der Parameter dafür und deren Plausiplitätskontrolle ermittelt werden müssen (z. B. für Fileupload, Kontrolle der Boundary, usw.).
Oder man nimmt eine Bibliothek, die das schon erledigt hat.
dedlfix.