0001 // Frame.swift 0002 // 0003 // The MIT License (MIT) 0004 // 0005 // Copyright (c) 2015 Zewo 0006 // 0007 // Permission is hereby granted, free of charge, to any person obtaining a copy 0008 // of this software and associated documentation files (the "Software"), to deal 0009 // in the Software without restriction, including without limitation the rights 0010 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 0011 // copies of the Software, and to permit persons to whom the Software is 0012 // furnished to do so, subject to the following conditions: 0013 // 0014 // The above copyright notice and this permission notice shall be included in all 0015 // copies or substantial portions of the Software. 0016 // 0017 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 0018 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 0019 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 0020 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 0021 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 0022 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 0023 // SOFTWARE. 0024 0025 // 0 1 2 3 0026 // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 0027 // +-+-+-+-+-------+-+-------------+-------------------------------+ 0028 // |F|R|R|R| opcode|M| Payload len | Extended payload length | 0029 // |I|S|S|S| (4) |A| (7) | (16/64) | 0030 // |N|V|V|V| |S| | (if payload len==126/127) | 0031 // | |1|2|3| |K| | | 0032 // +-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - + 0033 // | Extended payload length continued, if payload len == 127 | 0034 // + - - - - - - - - - - - - - - - +-------------------------------+ 0035 // | |Masking-key, if MASK set to 1 | 0036 // +-------------------------------+-------------------------------+ 0037 // | Masking-key (continued) | Payload Data | 0038 // +-------------------------------- - - - - - - - - - - - - - - - + 0039 // : Payload Data continued ... : 0040 // + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + 0041 // | Payload Data continued ... | 0042 // +---------------------------------------------------------------+ 0043 0044 struct Frame{ 0045 0046 static let FinMask : UInt8 = 0b10000000 0047 static let Rsv1Mask : UInt8 = 0b01000000 0048 static let Rsv2Mask : UInt8 = 0b00100000 0049 static let Rsv3Mask : UInt8 = 0b00010000 0050 static let OpCodeMask : UInt8 = 0b00001111 0051 0052 static let MaskMask : UInt8 = 0b10000000 0053 static let PayloadLenMask : UInt8 = 0b01111111 0054 0055 enum OpCode
Socket.swift:101 private var initialFrame: Frame?Socket.swift:102 private var frames: [Frame] = []Socket.swift:237 let fin = data[0] & Frame.FinMask != 0Socket.swift:238 let rsv1 = data[0] & Frame.Rsv1Mask != 0Socket.swift:239 let rsv2 = data[0] & Frame.Rsv2Mask != 0Socket.swift:240 let rsv3 = data[0] & Frame.Rsv3Mask != 0Socket.swift:242 guard let opCode = Frame.OpCode(rawValue: data[0] & Frame.OpCodeMask) else {Socket.swift:242 guard let opCode = Frame.OpCode(rawValue: data[0] & Frame.OpCodeMask) else {Socket.swift:246 let masked = data[1] & Frame.MaskMask != 0Socket.swift:256 let payloadLength = data[1] & Frame.PayloadLenMaskSocket.swift:302 let frame = Frame(Socket.swift:459 private func send(opCode: Frame.OpCode, data: Data) throws {Socket.swift:466 let frame = Frame(opCode: opCode, data: data, maskKey: maskKey): UInt8 { 0056 case Continuation
Frame.swift:74 var opCode: OpCodeFrame.swift:84 init(fin: Bool, rsv1: Bool, rsv2: Bool, rsv3: Bool, opCode: OpCode, masked: Bool, payloadLength: UInt64, headerExtraLength: Int) {Frame.swift:97 init(fin: Bool = true, rsv1: Bool = false, rsv2: Bool = false, rsv3: Bool = false, opCode: OpCode, data: Data = [], maskKey: Data = nil) {Socket.swift:459 private func send(opCode: Frame.OpCode, data: Data) throws {= 0x0 0057 case Text
Socket.swift:454 case .Continuation:= 0x1 0058 case Binary
Socket.swift:419 case .Text:= 0x2 0059 // 0x3 -> 0x7 reserved 0060 case Close
Socket.swift:417 case .Binary:= 0x8 0061 case Ping
Frame.swift:66 return self == .Close || self == .Ping || self == .PongSocket.swift:425 case .Close:= 0x9 0062 case Pong
Frame.swift:66 return self == .Close || self == .Ping || self == .PongSocket.swift:421 case .Ping:= 0xA 0063 // 0xB -> 0xF reserved 0064 0065 var isControl: Bool { 0066 return self == .Close || self == .Ping || self == .Pong 0067 } 0068 } 0069 0070 var fin
Frame.swift:66 return self == .Close || self == .Ping || self == .PongSocket.swift:423 case .Pong:: Bool 0071 var rsv1
Frame.swift:85 self.fin = finSocket.swift:406 guard frame.fin else {: Bool 0072 var rsv2
Frame.swift:86 self.rsv1 = rsv1: Bool 0073 var rsv3
Frame.swift:87 self.rsv2 = rsv2: Bool 0074 var opCode
Frame.swift:88 self.rsv3 = rsv3: OpCode 0075 var masked
Frame.swift:89 self.opCode = opCodeSocket.swift:416 switch frame.opCode {: Bool 0076 var payloadLength
Frame.swift:90 self.masked = maskedFrame.swift:134 if masked {Socket.swift:341 if frame.masked {: UInt64 0077 var maskKey: Data 0078 var data: Data = [] 0079 0080 var payloadRemainingLength
Frame.swift:91 self.payloadLength = payloadLengthFrame.swift:118 if payloadLength > UInt64(UInt16.max) {Frame.swift:120 } else if payloadLength >= 126 {Frame.swift:123 payloadLen = UInt8(payloadLength)Socket.swift:330 var payloadLength = UIntMax(frame.payloadLength)Socket.swift:338 frame.payloadLength = payloadLengthSocket.swift:352 if frame.payloadLength > 0 {: UInt64 0081 var headerExtraLength
Frame.swift:92 self.payloadRemainingLength = payloadLengthSocket.swift:339 frame.payloadRemainingLength = payloadLength: Int 0082 var maskOffset = 0 0083 0084 init(fin: Bool, rsv1: Bool, rsv2: Bool, rsv3: Bool, opCode: OpCode, masked: Bool, payloadLength: UInt64, headerExtraLength: Int) { 0085 self.fin = fin 0086 self.rsv1 = rsv1 0087 self.rsv2 = rsv2 0088 self.rsv3 = rsv3 0089 self.opCode = opCode 0090 self.masked = masked 0091 self.payloadLength = payloadLength 0092 self.payloadRemainingLength = payloadLength 0093 self.headerExtraLength = headerExtraLength 0094 self.maskKey = nil 0095 } 0096 0097 init(fin: Bool = true, rsv1: Bool = false, rsv2: Bool = false, rsv3: Bool = false, opCode: OpCode, data: Data = [], maskKey: Data = nil) { 0098 self.fin = fin 0099 self.rsv1 = rsv1 0100 self.rsv2 = rsv2 0101 self.rsv3 = rsv3 0102 self.opCode = opCode 0103 self.masked = maskKey != nil 0104 self.data = data 0105 self.payloadLength = UInt64(data.count) 0106 0107 self.payloadRemainingLength = 0 0108 self.headerExtraLength = 0 0109 self.maskKey = maskKey 0110 } 0111 0112 func getData() -> Data { 0113 var data: Data = [] 0114 0115 data.appendByte(((fin ? 1 : 0) << 7) | ((rsv1 ? 1 : 0) << 6) | ((rsv2 ? 1 : 0) << 5) | ((rsv3 ? 1 : 0) << 4) | opCode.rawValue) 0116 0117 let payloadLen: UInt8 0118 if payloadLength > UInt64(UInt16.max) { 0119 payloadLen = 127 0120 } else if payloadLength >= 126 { 0121 payloadLen = 126 0122 } else { 0123 payloadLen = UInt8(payloadLength) 0124 } 0125 0126 data.appendByte(((masked ? 1 : 0) << 7) | payloadLen) 0127 0128 if payloadLen == 127 { 0129 data += Data(number: payloadLength) 0130 } else if payloadLen == 126 { 0131 data += Data(number: UInt16(payloadLength)) 0132 } 0133 0134 if masked { 0135 data += maskKey 0136 } 0137 0138 data += self.data 0139 0140 return data 0141 } 0142 0143 } 0144
Frame.swift:93 self.headerExtraLength = headerExtraLengthSocket.swift:342 let maskOffset = max(Int(frame.headerExtraLength) - 4, 0)