Просмотр исходного кода

Added web-socket data frame encoder.

Damian Kołakowski 10 лет назад
Родитель
Сommit
77c6e90c90

+ 55 - 3
Sources/HttpHandlers+WebSockets.swift

@@ -61,11 +61,63 @@ extension HttpHandlers {
         }
         
         public func writeText(text: String) -> Void {
-            
+            let finAndOpCode = encodeFinAndOpCode(true, op: OpCode.TEXT)
+            let maskAndLngth = encodeLengthAndMaskFlag(UInt64(text.utf8.count), false)
+            do {
+                try socket.writeUInt8([finAndOpCode])
+                try socket.writeUInt8(maskAndLngth)
+                try socket.writeUInt8([UInt8](text.utf8))
+            } catch {
+                print(error)
+            }
         }
-        
+    
         public func writeBinary(binary: [UInt8]) -> Void {
-            
+            let finAndOpCode = encodeFinAndOpCode(true, op: OpCode.BINARY)
+            let maskAndLngth = encodeLengthAndMaskFlag(UInt64(binary.count), false)
+            do {
+                try self.socket.writeUInt8([finAndOpCode])
+                try self.socket.writeUInt8(maskAndLngth)
+                try self.socket.writeUInt8(binary)
+            } catch {
+                print(error)
+            }
+        }
+        
+        private func encodeFinAndOpCode(fin: Bool, op: OpCode) -> UInt8 {
+            var b = UInt8(fin ? 0x80 : 0x00);
+            switch op {
+            case .CONTINUE : b |= 0x00 & 0x0F;
+            case .TEXT     : b |= 0x01 & 0x0F;
+            case .BINARY   : b |= 0x02 & 0x0F;
+            case .CLOSE    : b |= 0x08 & 0x0F;
+            case .PING     : b |= 0x09 & 0x0F;
+            case .PONG     : b |= 0x0A & 0x0F;
+            }
+            return b
+        }
+        
+        private func encodeLengthAndMaskFlag(len: UInt64, _ masked: Bool) -> [UInt8] {
+            let b: UInt8 = masked ? 0x80 : 0x00;
+            var buffer = [UInt8]()
+            if (len > 0xFF_FF) {
+                buffer.append(b | 0x7F);
+                buffer.append(UInt8(len >> 56) & 0xFF);
+                buffer.append(UInt8(len >> 48) & 0xFF);
+                buffer.append(UInt8(len >> 40) & 0xFF);
+                buffer.append(UInt8(len >> 32) & 0xFF);
+                buffer.append(UInt8(len >> 24) & 0xFF);
+                buffer.append(UInt8(len >> 16) & 0xFF);
+                buffer.append(UInt8(len >> 8 ) & 0xFF);
+                buffer.append(UInt8(len & 0xFF));
+            } else if (len >= 0x7E) {
+                buffer.append(b | 0x7E);
+                buffer.append(UInt8(len >> 8));
+                buffer.append(UInt8(len & 0xFF));
+            } else {
+                buffer.append(b | UInt8(len));
+            }
+            return buffer
         }
         
         public func readFrame(socket: Socket) throws -> Frame {

BIN
Swifter.xcodeproj/project.xcworkspace/xcuserdata/damiankolakowski.xcuserdatad/UserInterfaceState.xcuserstate


+ 28 - 12
Swifter.xcodeproj/xcuserdata/damiankolakowski.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist

@@ -1699,11 +1699,11 @@
             ignoreCount = "0"
             continueAfterRunningActions = "No"
             filePath = "Sources/HttpHandlers+WebSockets.swift"
-            timestampString = "475842615.4941"
+            timestampString = "475876251.893112"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "115"
-            endingLineNumber = "115"
+            startingLineNumber = "157"
+            endingLineNumber = "157"
             landmarkName = "readFrame(_:)"
             landmarkType = "5">
             <Locations>
@@ -1747,11 +1747,11 @@
             ignoreCount = "0"
             continueAfterRunningActions = "No"
             filePath = "Sources/HttpHandlers+WebSockets.swift"
-            timestampString = "475842615.4941"
+            timestampString = "475876251.893112"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "121"
-            endingLineNumber = "121"
+            startingLineNumber = "163"
+            endingLineNumber = "163"
             landmarkName = "HttpHandlers"
             landmarkType = "3">
          </BreakpointContent>
@@ -1763,11 +1763,11 @@
             ignoreCount = "0"
             continueAfterRunningActions = "No"
             filePath = "Sources/HttpHandlers+WebSockets.swift"
-            timestampString = "475842615.4941"
+            timestampString = "475876251.893112"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "114"
-            endingLineNumber = "114"
+            startingLineNumber = "156"
+            endingLineNumber = "156"
             landmarkName = "readFrame(_:)"
             landmarkType = "5">
          </BreakpointContent>
@@ -1939,11 +1939,11 @@
             ignoreCount = "0"
             continueAfterRunningActions = "No"
             filePath = "Sources/HttpHandlers+WebSockets.swift"
-            timestampString = "475842615.4941"
+            timestampString = "475876251.893112"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "113"
-            endingLineNumber = "113"
+            startingLineNumber = "155"
+            endingLineNumber = "155"
             landmarkName = "readFrame(_:)"
             landmarkType = "5">
          </BreakpointContent>
@@ -2360,5 +2360,21 @@
             landmarkType = "5">
          </BreakpointContent>
       </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            shouldBeEnabled = "No"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "Sources/HttpHandlers+WebSockets.swift"
+            timestampString = "475876297.816839"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "66"
+            endingLineNumber = "66"
+            landmarkName = "writeText(_:)"
+            landmarkType = "5">
+         </BreakpointContent>
+      </BreakpointProxy>
    </Breakpoints>
 </Bucket>