internal static void LoadWebSocketMessagesFromStream(Session oS, Stream strmWSMessages) { try { WebSocket socket = new WebSocket(oS, null, null) { sName = string.Format("SAZ-Session#{0}", oS.id) }; oS.__oTunnel = socket; socket.ReadWebSocketMessageListFromStream(strmWSMessages); } finally { strmWSMessages.Dispose(); } }
private static WebSocketMessage[] _ParseMessagesFromStream(WebSocket wsOwner, ref MemoryStream strmData, bool bIsOutbound, bool bTrimAfterParsing) { List<WebSocketMessage> list = new List<WebSocketMessage>(); strmData.Position = 0L; long position = 0L; while ((strmData.Length - strmData.Position) > 2L) { byte[] buffer = new byte[2]; strmData.Read(buffer, 0, buffer.Length); ulong num2 = (ulong) (buffer[1] & 0x7f); if (num2 == 0x7eL) { if (strmData.Length < (strmData.Position + 2L)) { break; } byte[] buffer2 = new byte[2]; strmData.Read(buffer2, 0, buffer2.Length); num2 = (ulong) ((buffer2[0] << 8) + buffer2[1]); } else if (num2 == 0x7fL) { if (strmData.Length < (strmData.Position + 8L)) { break; } byte[] buffer3 = new byte[8]; strmData.Read(buffer3, 0, buffer3.Length); num2 = (ulong) ((((((((buffer3[0] << 0x18) + (buffer3[1] << 0x10)) + (buffer3[2] << 8)) + buffer3[3]) + (buffer3[4] << 0x18)) + (buffer3[5] << 0x10)) + (buffer3[6] << 8)) + buffer3[7]); } bool flag = 0x80 == (buffer[1] & 0x80); if (strmData.Length < (( strmData.Position + (long)num2) + (flag ? 4L : 0L)) ) { break; } WebSocketMessage item = new WebSocketMessage(wsOwner, Interlocked.Increment(ref wsOwner._iMsgCount), bIsOutbound); item.AssignHeader(buffer[0]); if (flag) { byte[] buffer4 = new byte[4]; strmData.Read(buffer4, 0, buffer4.Length); item.MaskingKey = buffer4; } byte[] buffer5 = new byte[num2]; strmData.Read(buffer5, 0, buffer5.Length); item.PayloadData = buffer5; list.Add(item); position = strmData.Position; } strmData.Position = position; if (bTrimAfterParsing) { byte[] buffer6 = new byte[strmData.Length - position]; strmData.Read(buffer6, 0, buffer6.Length); strmData.Dispose(); strmData = new MemoryStream(); strmData.Write(buffer6, 0, buffer6.Length); } return list.ToArray(); }
internal static void CreateTunnel(Session oSession) { if ((((oSession != null) && (oSession.oRequest != null)) && ((oSession.oRequest.headers != null) && (oSession.oRequest.pipeClient != null))) && ((oSession.oResponse != null) && (oSession.oResponse.pipeServer != null))) { ClientPipe pipeClient = oSession.oRequest.pipeClient; oSession.oRequest.pipeClient = null; ServerPipe pipeServer = oSession.oResponse.pipeServer; oSession.oResponse.pipeServer = null; WebSocket socket = new WebSocket(oSession, pipeClient, pipeServer); oSession.__oTunnel = socket; new Thread(new ThreadStart(socket.RunTunnel)) { IsBackground = true }.Start(); } }