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
Socket.swift:101
	private var initialFrame: Frame?
Socket.swift:102
	private var frames: [Frame] = []
Socket.swift:237
			let fin = data[0] & Frame.FinMask != 0
Socket.swift:238
			let rsv1 = data[0] & Frame.Rsv1Mask != 0
Socket.swift:239
			let rsv2 = data[0] & Frame.Rsv2Mask != 0
Socket.swift:240
			let rsv3 = data[0] & Frame.Rsv3Mask != 0
Socket.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 != 0
Socket.swift:256
			let payloadLength = data[1] & Frame.PayloadLenMask
Socket.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)
{ 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
Frame.swift:74
	var opCode: OpCode
Frame.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 {
: UInt8 { 0056 case Continuation
Socket.swift:454
		case .Continuation:
= 0x0 0057 case Text
Socket.swift:419
		case .Text:
= 0x1 0058 case Binary
Socket.swift:417
		case .Binary:
= 0x2 0059 // 0x3 -> 0x7 reserved 0060 case Close
Frame.swift:66
			return self == .Close || self == .Ping || self == .Pong
Socket.swift:425
		case .Close:
= 0x8 0061 case Ping
Frame.swift:66
			return self == .Close || self == .Ping || self == .Pong
Socket.swift:421
		case .Ping:
= 0x9 0062 case Pong
Frame.swift:66
			return self == .Close || self == .Ping || self == .Pong
Socket.swift:423
		case .Pong:
= 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:85
		self.fin = fin
Socket.swift:406
		guard frame.fin else {
: Bool 0071 var rsv1
Frame.swift:86
		self.rsv1 = rsv1
: Bool 0072 var rsv2
Frame.swift:87
		self.rsv2 = rsv2
: Bool 0073 var rsv3
Frame.swift:88
		self.rsv3 = rsv3
: Bool 0074 var opCode
Frame.swift:89
		self.opCode = opCode
Socket.swift:416
		switch frame.opCode {
: OpCode 0075 var masked
Frame.swift:90
		self.masked = masked
Frame.swift:134
		if masked {
Socket.swift:341
			if frame.masked {
: Bool 0076 var payloadLength
Frame.swift:91
		self.payloadLength = payloadLength
Frame.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 = payloadLength
Socket.swift:352
			if frame.payloadLength > 0 {
: UInt64 0077 var maskKey: Data 0078 var data: Data = [] 0079 0080 var payloadRemainingLength
Frame.swift:92
		self.payloadRemainingLength = payloadLength
Socket.swift:339
			frame.payloadRemainingLength = payloadLength
: UInt64 0081 var headerExtraLength
Frame.swift:93
		self.headerExtraLength = headerExtraLength
Socket.swift:342
				let maskOffset = max(Int(frame.headerExtraLength) - 4, 0)
: 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