0001 #if os(Linux) 0002 import Glibc 0003 #else 0004 import Foundation 0005 #endif 0006 0007 import Vaquita 0008 0009 enum SocketType { 0010 case TCP 0011 case UDP 0012 } 0013 0014 enum SocketError: ErrorType { 0015 case SocketCreationFailed
Socket.swift:75 throw SocketError.AcceptFailed(Socket.descriptionOfLastError())Socket.swift:114 throw SocketError.RecvFailed(Socket.descriptionOfLastError())Socket.swift:138 throw SocketError.GetPeerNameFailed(Socket.descriptionOfLastError())Socket.swift:144 throw SocketError.GetNameInfoFailed(Socket.descriptionOfLastError())Socket.swift:148 throw SocketError.ConvertingPeerNameFailedSocketManager.swift:24 throw SocketError.SocketCreationFailed(Socket.descriptionOfLastError())SocketManager.swift:33 throw SocketError.SocketSettingReUseAddrFailed(details)SocketManager.swift:57 throw SocketError.BindFailed(details)SocketManager.swift:63 throw SocketError.ListenFailed(details)SocketServer.swift:138 } catch let socketError as SocketError {(String) 0016 case SocketSettingReUseAddrFailed
Socket.swift:28 case let .SocketCreationFailed(message):SocketManager.swift:24 throw SocketError.SocketCreationFailed(Socket.descriptionOfLastError())(String) 0017 case BindFailed
Socket.swift:30 case let .SocketSettingReUseAddrFailed(message):SocketManager.swift:33 throw SocketError.SocketSettingReUseAddrFailed(details)(String) 0018 case ListenFailed
Socket.swift:32 case let .BindFailed(message):SocketManager.swift:57 throw SocketError.BindFailed(details)(String) 0019 case WriteFailed
Socket.swift:34 case let .ListenFailed(message):SocketManager.swift:63 throw SocketError.ListenFailed(details)(String) 0020 case GetPeerNameFailed
Socket.swift:36 case let .WriteFailed(message):(String) 0021 case ConvertingPeerNameFailed
Socket.swift:38 case let .GetPeerNameFailed(message):Socket.swift:138 throw SocketError.GetPeerNameFailed(Socket.descriptionOfLastError())0022 case GetNameInfoFailed
Socket.swift:148 throw SocketError.ConvertingPeerNameFailed(String) 0023 case AcceptFailed
Socket.swift:40 case let .GetNameInfoFailed(message):Socket.swift:144 throw SocketError.GetNameInfoFailed(Socket.descriptionOfLastError())(String) 0024 case RecvFailed
Socket.swift:42 case let .AcceptFailed(message):Socket.swift:75 throw SocketError.AcceptFailed(Socket.descriptionOfLastError())(String) 0025 0026 var errorMessage
Socket.swift:44 case let .RecvFailed(message):Socket.swift:114 throw SocketError.RecvFailed(Socket.descriptionOfLastError()): String? { 0027 switch self { 0028 case let .SocketCreationFailed(message): 0029 return message 0030 case let .SocketSettingReUseAddrFailed(message): 0031 return message 0032 case let .BindFailed(message): 0033 return message 0034 case let .ListenFailed(message): 0035 return message 0036 case let .WriteFailed(message): 0037 return message 0038 case let .GetPeerNameFailed(message): 0039 return message 0040 case let .GetNameInfoFailed(message): 0041 return message 0042 case let .AcceptFailed(message): 0043 return message 0044 case let .RecvFailed(message): 0045 return message 0046 default: 0047 return nil 0048 } 0049 } 0050 } 0051 0052 struct Socket
SocketServer.swift:139 if let message = socketError.errorMessage {{ 0053 0054 let rawSocket
Response.swift:33 let socket: SocketResponse.swift:134 init(request: Request, responder: Responder, socket: Socket) {Socket.swift:70 func acceptClientSocket() throws -> Socket {Socket.swift:75 throw SocketError.AcceptFailed(Socket.descriptionOfLastError())Socket.swift:77 Socket.setNoSigPipe(clientSocket)Socket.swift:78 return Socket(rawSocket: clientSocket)Socket.swift:114 throw SocketError.RecvFailed(Socket.descriptionOfLastError())Socket.swift:128 if n > Socket.CR { characters.append(Character(UnicodeScalar(n))) }Socket.swift:129 } while n != Socket.NLSocket.swift:138 throw SocketError.GetPeerNameFailed(Socket.descriptionOfLastError())Socket.swift:144 throw SocketError.GetNameInfoFailed(Socket.descriptionOfLastError())Socket.swift:179 extension Socket: Hashable {Socket.swift:187 extension Socket: Equatable {Socket.swift:190 func ==(socket1: Socket, socket2: Socket) -> Bool {Socket.swift:190 func ==(socket1: Socket, socket2: Socket) -> Bool {SocketManager.swift:11 pendingConnectionCount: Int32 = SOMAXCONN) throws -> Socket {SocketManager.swift:24 throw SocketError.SocketCreationFailed(Socket.descriptionOfLastError())SocketManager.swift:31 let details = Socket.descriptionOfLastError()SocketManager.swift:36 Socket.setNoSigPipe(rawSocket)SocketManager.swift:40 socketAddress.sin_port = Socket.htonsPort(port)SocketManager.swift:55 let details = Socket.descriptionOfLastError()SocketManager.swift:61 let details = Socket.descriptionOfLastError()SocketManager.swift:66 return Socket(rawSocket: rawSocket)SocketManager.swift:70 class func closeSocket(socket: Socket) {SocketManager.swift:74 class func shutdownSocket(socket: Socket) {SocketParser.swift:18 func readHttpRequest(socket: Socket) throws -> Request {SocketParser.swift:95 private func readHeaders(socket: Socket) throws -> [String: String] {SocketServer.swift:19 private var listenSocket: Socket = Socket(rawSocket: -1)SocketServer.swift:19 private var listenSocket: Socket = Socket(rawSocket: -1)SocketServer.swift:21 private var clientSockets: Set<Socket> = []SocketServer.swift:67 func handleConnection(socket: Socket) {: Int32 0055 0056 var peerName: String? 0057 0058 init
Socket.swift:59 self.rawSocket = rawSocketSocket.swift:63 SocketManager.closeRawSocket(rawSocket)Socket.swift:67 SocketManager.shutdownRawSocket(rawSocket)Socket.swift:73 let clientSocket = accept(rawSocket, &addr, &len)Socket.swift:112 let next = recv(self.rawSocket as Int32, &buffer, Int(buffer.count), 0)Socket.swift:137 if getpeername(self.rawSocket, &addr, &len) != 0 {Socket.swift:183 return Int(self.rawSocket)Socket.swift:191 return socket1.rawSocket == socket2.rawSocketSocket.swift:191 return socket1.rawSocket == socket2.rawSocketSocketManager.swift:71 closeRawSocket(socket.rawSocket)SocketManager.swift:75 shutdownRawSocket(socket.rawSocket)(rawSocket: Int32) { 0059 self.rawSocket = rawSocket 0060 } 0061 0062 func release
Socket.swift:78 return Socket(rawSocket: clientSocket)SocketManager.swift:66 return Socket(rawSocket: rawSocket)SocketServer.swift:19 private var listenSocket: Socket = Socket(rawSocket: -1)() { 0063 SocketManager.closeRawSocket(rawSocket) 0064 } 0065 0066 func shutdown() { 0067 SocketManager.shutdownRawSocket(rawSocket) 0068 } 0069 0070 func acceptClientSocket
SocketServer.swift:91 self.listenSocket.release()SocketServer.swift:95 socket.release()SocketServer.swift:114 socket.release()() throws -> Socket { 0071 var addr = sockaddr() 0072 var len: socklen_t = 0 0073 let clientSocket = accept(rawSocket, &addr, &len) 0074 if clientSocket == -1 { 0075 throw SocketError.AcceptFailed(Socket.descriptionOfLastError()) 0076 } 0077 Socket.setNoSigPipe(clientSocket) 0078 return Socket(rawSocket: clientSocket) 0079 } 0080 0081 func writeString
SocketServer.swift:45 while let socket = try? self.listenSocket.acceptClientSocket() {(string: String) throws { 0082 let data = Data(string: string) 0083 try writeData(data) 0084 } 0085 0086 func writeData(data: Data) throws { 0087 try data.bytes.withUnsafeBufferPointer { 0088 0089 var sent = 0 0090 0091 while sent < data.bytes.count { 0092 0093 #if os(Linux) 0094 let s = send(self.rawSocket, 0095 $0.baseAddress + sent, Int(data.size - sent), 0096 Int32(MSG_NOSIGNAL)) 0097 #else 0098 let s = write(self.rawSocket, 0099 $0.baseAddress + sent, Int(data.size - sent)) 0100 #endif 0101 0102 if s <= 0 { 0103 throw SocketError.WriteFailed(Socket.descriptionOfLastError()) 0104 } 0105 sent += s 0106 } 0107 } 0108 } 0109 0110 func read
SocketServer.swift:118 try socket.writeString("HTTP/1.1 \(response.status.code) \(response.reasonPhrase)\r\n")SocketServer.swift:131 try socket.writeString("\(name): \(value)\r\n")SocketServer.swift:134 try socket.writeString("\r\n")() throws -> UInt8 { 0111 var buffer = [UInt8](count: 1, repeatedValue: 0) 0112 let next = recv(self.rawSocket as Int32, &buffer, Int(buffer.count), 0) 0113 if next <= 0 { 0114 throw SocketError.RecvFailed(Socket.descriptionOfLastError()) 0115 } 0116 return buffer[0] 0117 } 0118 0119 private static let CR
Socket.swift:127 n = try self.read()= UInt8(13) 0120 0121 private static let NL
Socket.swift:128 if n > Socket.CR { characters.append(Character(UnicodeScalar(n))) }= UInt8(10) 0122 0123 func readLine
Socket.swift:129 } while n != Socket.NL() throws -> String { 0124 var characters: String = "" 0125 var n: UInt8 = 0 0126 repeat { 0127 n = try self.read() 0128 if n > Socket.CR { characters.append(Character(UnicodeScalar(n))) } 0129 } while n != Socket.NL 0130 return characters 0131 } 0132 0133 func peername
SocketParser.swift:20 let statusLine = try socket.readLine()SocketParser.swift:98 let headerLine = try socket.readLine()() throws -> String { 0134 0135 var addr = sockaddr(), len: socklen_t = socklen_t(sizeof(sockaddr)) 0136 0137 if getpeername(self.rawSocket, &addr, &len) != 0 { 0138 throw SocketError.GetPeerNameFailed(Socket.descriptionOfLastError()) 0139 } 0140 0141 var hostBuffer = [CChar](count: Int(NI_MAXHOST), repeatedValue: 0) 0142 0143 if getnameinfo(&addr, len, &hostBuffer, socklen_t(hostBuffer.count), nil, 0, NI_NUMERICHOST) != 0 { 0144 throw SocketError.GetNameInfoFailed(Socket.descriptionOfLastError()) 0145 } 0146 0147 guard let name = String.fromCString(hostBuffer) else { 0148 throw SocketError.ConvertingPeerNameFailed 0149 } 0150 0151 return name 0152 } 0153 0154 static func descriptionOfLastError
SocketServer.swift:69 let address = try? socket.peername()() -> String { 0155 return String.fromCString(UnsafePointer(strerror(errno))) ?? "Error: \(errno)" 0156 } 0157 0158 static func setNoSigPipe
Socket.swift:75 throw SocketError.AcceptFailed(Socket.descriptionOfLastError())Socket.swift:114 throw SocketError.RecvFailed(Socket.descriptionOfLastError())Socket.swift:138 throw SocketError.GetPeerNameFailed(Socket.descriptionOfLastError())Socket.swift:144 throw SocketError.GetNameInfoFailed(Socket.descriptionOfLastError())SocketManager.swift:24 throw SocketError.SocketCreationFailed(Socket.descriptionOfLastError())SocketManager.swift:31 let details = Socket.descriptionOfLastError()SocketManager.swift:55 let details = Socket.descriptionOfLastError()SocketManager.swift:61 let details = Socket.descriptionOfLastError()(socket: Int32) { 0159 #if os(Linux) 0160 // There is no SO_NOSIGPIPE in Linux (nor some other systems). You can instead use the MSG_NOSIGNAL flag when calling send(), 0161 // or use signal(SIGPIPE, SIG_IGN) to make your entire application ignore SIGPIPE. 0162 #else 0163 // Prevents crashes when blocking calls are pending and the app is paused ( via Home button ). 0164 var no_sig_pipe: Int32 = 1 0165 setsockopt(socket, SOL_SOCKET, SO_NOSIGPIPE, &no_sig_pipe, socklen_t(sizeof(Int32))) 0166 #endif 0167 } 0168 0169 static func htonsPort
Socket.swift:77 Socket.setNoSigPipe(clientSocket)SocketManager.swift:36 Socket.setNoSigPipe(rawSocket)(port: in_port_t) -> in_port_t { 0170 #if os(Linux) 0171 return port.bigEndian //use htons(). LLVM Crash currently 0172 #else 0173 let isLittleEndian = Int(OSHostByteOrder()) == OSLittleEndian 0174 return isLittleEndian ? _OSSwapInt16(port) : port 0175 #endif 0176 } 0177 } 0178 0179 extension Socket: Hashable { 0180 0181 var hashValue: Int { 0182 0183 return Int(self.rawSocket) 0184 } 0185 } 0186 0187 extension Socket: Equatable { 0188 } 0189 0190 func ==(socket1: Socket, socket2: Socket) -> Bool { 0191 return socket1.rawSocket == socket2.rawSocket 0192 } 0193
SocketManager.swift:40 socketAddress.sin_port = Socket.htonsPort(port)