Ich verwende die grundlegende http.request()
-Funktion von Node ohne Probleme auf normalen HTTP-Servern. Ich muss http.request()
(oder ähnlich) mit SHOUTcast Servern verwenden. Das SHOUTcast "Protokoll" ist vollständig kompatibel mit HTTP, abgesehen von einem Detail ... der ersten Antwortzeile.
Normale HTTP-Server antworten mit:
%Vor%SHOUTcast-Server antworten mit:
%Vor% Auch hier ist der Rest des Protokolls der gleiche. Der einzige Unterschied ist HTTP/1.x
vs. ICY
.
Ich möchte die http.request()
-Funktion von Node erweitern, unterklassifizieren oder irgendwie ändern, damit ich sie mit SHOUTcast-Servern arbeiten lassen kann. Die Verbindung zu SHOUTcast mit dem Knoten wurde bereits vor hergestellt, aber nur, indem das gesamte Rad neu erfunden wurde. Ich würde das lieber nicht tun, da es sich um einen geringen Protokollunterschied handelt.
Erweitern oder überschreiben Sie die relevanten Teile des HTTP-Parsers des Knotens. (Ich bezweifle, dass dies möglich ist, da der Parser ein systemeigener Code ist . )
Erstellen Sie meinen eigenen Code, der die relevanten Teile von HTTP analysiert, aber so viele vorhandene Node-Komponenten wie möglich für HTTP verwendet.
Erstellen Sie einen einfachen internen Proxy (oder geben Sie Daten irgendwie weiter), damit ich diese erste Server-Antwortzeile ändern kann, bevor sie den HTTP-Parser von Node erreicht.
Noch etwas?
Ich habe auch überlegt, Shred zu verwenden, aber es bietet keine Option zum Streamen der Antwort. (Es wartet darauf, dass die gesamte Server-Antwort abgeschlossen ist, bevor ein Ereignis ausgelöst wird. Dies funktioniert nicht für Streaming-Server, auf denen die Daten unbegrenzt laufen können.) Entlang dieser Zeilen versuchte ich Anfrage , aber es verwendet Nodes eigenen HTTP-Parser, so dass ich die gleichen Analysefehler erhalte wie beim nativen HTTP-Client.
3. Erstellen Sie einen einfachen internen Proxy
Bang. Du hast es verstanden.
Verwenden Sie das Objekt Node.js net
, um einen TCP-Server zu erstellen, der sich tatsächlich zwischen dem Benutzer und der http befindet Server. Ersetzen Sie die erste Zeile aller Anforderungen und Antworten, wie Sie es beschrieben haben, und Sie können den http-Server weiterhin unverändert verwenden. (Sie erstellen einen internen http-Server an einem nicht standardmäßigen Port, den net-Server an einem anderen Port, und ketten dann Streams zwischen den beiden mit etwas Code zum Abfangen des ersten Datenblocks vom anfordernden Benutzer und des ersten Chunks von Daten vom antwortenden Server.)
Ihr gesamter Code in Javascript und alles streamt (fast) ohne Pufferblutung.
BEARBEITEN, es scheint, ich habe deinen Beitrag etwas falsch gelesen. Ich sehe, dass Sie nicht versuchen, einen Node.js Shoutcast-Server zu implementieren, sondern versuchen, auf Daten von ihm zuzugreifen. Das net
-Objekt sollte immer noch funktionieren, aber nicht ganz auf die gleiche Weise.
Sie müssen net.connect
verwenden, um mit dem angegebenen shoutcast-Server zu sprechen, und einen neuen net
-Server verwenden, der über den net.connect
-Stream weiß, um zwischen ihm und Ihrem http.request()
zu agieren. Also würde es wie funktionieren:
So würde ich es strukturieren.
Ich habe mir einen anderen Weg ausgedacht, ähnlich dem internen Proxy, aber ohne die extra Verbindung. Es scheint, dass es möglich ist, den intern verwendeten Socket für den HTTP-Client zu überschreiben. Wenn dies erledigt ist, ist es einfach, Daten anzuhängen und zu modifizieren, bevor sie an den ursprünglichen internen Socket ondata
function übergeben wird.
Tags und Links javascript node.js javascript-framework shoutcast