PROCEDURE pServeurSocketEcoute()
ENTETE_WEBSOCKET_CLIENT is string = "Sec-WebSocket-Key: "
ENTETE_WEBSOCKET_PROTOCOL is string = "Sec-WebSocket-Protocol: "
IF SocketCreate("Serveur", 5001) = False THEN
Error("Erreur de création " + ErrorInfo(errMessage))
ELSE
ThreadExecute("Thread1", threadNormal, ProcédureAttente)
END
INTERNAL PROCEDURE ProcédureAttente()
LOOP
Multitask(0)
IF SocketWaitForConnection("Serveur") THEN
Canal is string
Canal = SocketAccept("Serveur")
SocketChangeTransmissionMode(Canal, SocketNoEndTag)
ThreadExecute(Canal, threadNormal, ProcédureGestion, Canal)
END
END
INTERNAL PROCEDURE ProcédureGestion(Canal)
sRequête is string ANSI
tabProtocol is array of strings
sRes is string
sProtocol is string = "JSON"
WHILE StringCount(sRequête, CR + CR) = 0
sRequête += SocketRead(Canal)
END
sClé is string ANSI
FOR EACH STRING sLigne OF sRequête SEPARATED BY CR
Trace(sLigne)
IF sLigne [= ENTETE_WEBSOCKET_CLIENT THEN
sClé = sLigne[[Length(ENTETE_WEBSOCKET_CLIENT)+1 TO]]
ELSE IF sLigne [= ENTETE_WEBSOCKET_PROTOCOL
StringToArray(ExtractString(sLigne, 2, ":"), tabProtocol, ",")
END
END
sRes = [
HTTP/1.1 101 Web Socket Protocol Handshake
Upgrade: websocket
Connection: Upgrade
WebSocket-Origin: <AdresseIPServeur>
WebSocket-Location: ws://<AdresseIPServeur>:5001
Sec-WebSocket-Accept: %1
]
IF tabProtocol.Count <> 0 THEN
sRes += [CR] + "Sec-WebSocket-Protocol: %2"
sProtocol = Upper(NoSpace(tabProtocol[1]))
sRes = StringBuild(sRes, Encrypt(HashString(HA_SHA_160,
sClé + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"), "",
compressNone, encodeBASE64), sProtocol + CR + CR)
ELSE
sRes = StringBuild(sRes, Encrypt(HashString(HA_SHA_160,
sClé + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"), "",
compressNone, encodeBASE64) + CR + CR)
END
SocketWrite(Canal, sRes)
LOOP
bufFrame is Buffer = SocketRead(Canal)
IF 0 = Length(bufFrame) THEN
Trace("Break")
BREAK
END
nLongueurFrame is int = Asc(bufFrame[[2]]) & 127
bufMasque is Buffer
bufDonne is Buffer
IF 126 = nLongueurFrame THEN
nLongueurFrame = HexaToInt(
BufferToHexa(bufFrame[[3 ON 2]]))
bufMasque = bufFrame[[5 TO 8]]
bufDonne = bufFrame[[9 TO]]
ELSE IF 127 = nLongueurFrame THEN
nLongueurFrame = HexaToInt(BufferToHexa(bufFrame[[3 ON 8]]))
bufMasque = bufFrame[[11 TO 14]]
bufDonne = bufFrame[[15 TO]]
ELSE
bufMasque = bufFrame[[3 TO 6]]
bufDonne = bufFrame[[7 TO]]
END
sTexte is string ANSI
FOR i = 1 _TO_ Length(bufDonne)
sTexte += Charact(BitwiseXOR(
Asc(bufDonne[[i]]), Asc(bufMasque[[(i - 1) modulo 4 + 1]])))
END
Trace(UTF8ToAnsi(sTexte))
SWITCH sProtocol
CASE "XML"
sRes = [
<XML status="ok">
%1
</XML>
]
CASE "JSON"
sRes = [
{ "status" : "ok",
"reponse": "%1" }
]
OTHER CASE
sRes = StringToUTF8("Format non supporté !")
END
sRes = StringBuild(sRes, sTexte)
nLongueurRéponse is int = Length(sRes)
bufRéponse is Buffer
bufRéponse[[1]] = Charact(BitwiseOR(0x80, BitwiseAND(0x1, 0xF)))
IF nLongueurRéponse <= 125 THEN
bufRéponse[[2]] = Charact(nLongueurRéponse)
ELSE IF nLongueurRéponse <= 65536 THEN
bufRéponse[[2]] = Charact(126)
bufRéponse += HexaToBuffer(Right(IntToHexa(nLongueurRéponse), 4))
ELSE
bufRéponse[[2]] = Charact(127)
bufRéponse += HexaToBuffer(IntToHexa(nLongueurRéponse))
END
SocketWrite(Canal, bufRéponse + sRes)
END
END
END