0001    //
0002    //  Socket.swift
0003    //  Swifter
0004    //
0005    //  Copyright (c) 2014-2016 Damian KoĊ‚akowski. All rights reserved.
0006    //
0007    
0008    #if os(Linux)
0009        import Glibc
0010    #else
0011        import Foundation
0012    #endif
0013    
0014    /* Low level routines for POSIX sockets */
0015    
0016    public enum SocketError
Socket.swift:40
            throw SocketError.SocketCreationFailed(Socket.descriptionOfLastError())
Socket.swift:47
            throw SocketError.SocketSettingReUseAddrFailed(details)
Socket.swift:72
            throw SocketError.BindFailed(details)
Socket.swift:78
            throw SocketError.ListenFailed(details)
Socket.swift:104
            throw SocketError.AcceptFailed(Socket.descriptionOfLastError())
Socket.swift:128
                    throw SocketError.WriteFailed(Socket.descriptionOfLastError())
Socket.swift:139
            throw SocketError.RecvFailed(Socket.descriptionOfLastError())
Socket.swift:160
            throw SocketError.GetPeerNameFailed(Socket.descriptionOfLastError())
Socket.swift:164
            throw SocketError.GetNameInfoFailed(Socket.descriptionOfLastError())
Socket.swift:167
            throw SocketError.ConvertingPeerNameFailed
: ErrorType { 0017 case SocketCreationFailed
Socket.swift:40
            throw SocketError.SocketCreationFailed(Socket.descriptionOfLastError())
(String) 0018 case SocketSettingReUseAddrFailed
Socket.swift:47
            throw SocketError.SocketSettingReUseAddrFailed(details)
(String) 0019 case BindFailed
Socket.swift:72
            throw SocketError.BindFailed(details)
(String) 0020 case ListenFailed
Socket.swift:78
            throw SocketError.ListenFailed(details)
(String) 0021 case WriteFailed
Socket.swift:128
                    throw SocketError.WriteFailed(Socket.descriptionOfLastError())
(String) 0022 case GetPeerNameFailed
Socket.swift:160
            throw SocketError.GetPeerNameFailed(Socket.descriptionOfLastError())
(String) 0023 case ConvertingPeerNameFailed
Socket.swift:167
            throw SocketError.ConvertingPeerNameFailed
0024 case GetNameInfoFailed
Socket.swift:164
            throw SocketError.GetNameInfoFailed(Socket.descriptionOfLastError())
(String) 0025 case AcceptFailed
Socket.swift:104
            throw SocketError.AcceptFailed(Socket.descriptionOfLastError())
(String) 0026 case RecvFailed
Socket.swift:139
            throw SocketError.RecvFailed(Socket.descriptionOfLastError())
(String) 0027 } 0028 0029 public class Socket
HttpHandlers+WebSockets.swift:25
            let protocolSessionClosure: (Socket -> Void) = { socket in
HttpHandlers+WebSockets.swift:58
        private let socket: Socket
HttpHandlers+WebSockets.swift:60
        public init(_ socket: Socket) {
HttpParser.swift:22
    public func readHttpRequest(socket: Socket) throws -> HttpRequest {
HttpParser.swift:52
    private func readBody(socket: Socket, size: Int) throws -> [UInt8] {
HttpParser.swift:58
    private func readHeaders(socket: Socket) throws -> [String: String] {
HttpResponse.swift:68
    case SwitchProtocols([String: String], Socket -> Void)
HttpResponse.swift:142
    func socketSession() -> (Socket -> Void)?  {
HttpServerIO.swift:17
    private var listenSocket: Socket = Socket(socketFileDescriptor: -1)
HttpServerIO.swift:17
    private var listenSocket: Socket = Socket(socketFileDescriptor: -1)
HttpServerIO.swift:18
    private var clientSockets: Set<Socket> = []
HttpServerIO.swift:23
        listenSocket = try Socket.tcpSocketForListen(listenPort)
HttpServerIO.swift:54
    private func handleConnection(socket: Socket) {
HttpServerIO.swift:86
        let socket: Socket
HttpServerIO.swift:99
    private func respond(socket: Socket, response: HttpResponse, keepAlive: Bool) throws -> Bool {
Socket.swift:31
    public class func tcpSocketForListen(port: in_port_t, maxPendingConnection: Int32 = SOMAXCONN) throws -> Socket {
Socket.swift:40
            throw SocketError.SocketCreationFailed(Socket.descriptionOfLastError())
Socket.swift:45
            let details = Socket.descriptionOfLastError()
Socket.swift:46
            Socket.release(socketFileDescriptor)
Socket.swift:49
        Socket.setNoSigPipe(socketFileDescriptor)
Socket.swift:61
            addr.sin_port = Socket.htonsPort(port)
Socket.swift:70
            let details = Socket.descriptionOfLastError()
Socket.swift:71
            Socket.release(socketFileDescriptor)
Socket.swift:76
            let details = Socket.descriptionOfLastError()
Socket.swift:77
            Socket.release(socketFileDescriptor)
Socket.swift:80
        return Socket(socketFileDescriptor: socketFileDescriptor)
Socket.swift:92
        Socket.release(self.socketFileDescriptor)
Socket.swift:96
        Socket.shutdwn(self.socketFileDescriptor)
Socket.swift:99
    public func acceptClientSocket() throws -> Socket {
Socket.swift:104
            throw SocketError.AcceptFailed(Socket.descriptionOfLastError())
Socket.swift:106
        Socket.setNoSigPipe(clientSocket)
Socket.swift:107
        return Socket(socketFileDescriptor: clientSocket)
Socket.swift:128
                    throw SocketError.WriteFailed(Socket.descriptionOfLastError())
Socket.swift:139
            throw SocketError.RecvFailed(Socket.descriptionOfLastError())
Socket.swift:152
            if n > Socket.CR { characters.append(Character(UnicodeScalar(n))) }
Socket.swift:153
        } while n != Socket.NL
Socket.swift:160
            throw SocketError.GetPeerNameFailed(Socket.descriptionOfLastError())
Socket.swift:164
            throw SocketError.GetNameInfoFailed(Socket.descriptionOfLastError())
Socket.swift:214
public func ==(socket1: Socket, socket2: Socket) -> Bool {
Socket.swift:214
public func ==(socket1: Socket, socket2: Socket) -> Bool {
: Hashable, Equatable { 0030 0031 public class func tcpSocketForListen
HttpServerIO.swift:23
        listenSocket = try Socket.tcpSocketForListen(listenPort)
(port: in_port_t, maxPendingConnection: Int32 = SOMAXCONN) throws -> Socket { 0032 0033 #if os(Linux) 0034 let socketFileDescriptor = socket(AF_INET, Int32(SOCK_STREAM.rawValue), 0) 0035 #else 0036 let socketFileDescriptor = socket(AF_INET, SOCK_STREAM, 0) 0037 #endif 0038 0039 if socketFileDescriptor == -1 { 0040 throw SocketError.SocketCreationFailed(Socket.descriptionOfLastError()) 0041 } 0042 0043 var value: Int32 = 1 0044 if setsockopt(socketFileDescriptor, SOL_SOCKET, SO_REUSEADDR, &value, socklen_t(sizeof(Int32))) == -1 { 0045 let details = Socket.descriptionOfLastError() 0046 Socket.release(socketFileDescriptor) 0047 throw SocketError.SocketSettingReUseAddrFailed(details) 0048 } 0049 Socket.setNoSigPipe(socketFileDescriptor) 0050 0051 #if os(Linux) 0052 var addr = sockaddr_in() 0053 addr.sin_family = sa_family_t(AF_INET) 0054 addr.sin_port = Socket.htonsPort(port) 0055 addr.sin_addr = in_addr(s_addr: in_addr_t(0)) 0056 addr.sin_zero = (0, 0, 0, 0, 0, 0, 0, 0) 0057 #else 0058 var addr = sockaddr_in() 0059 addr.sin_len = __uint8_t(sizeof(sockaddr_in)) 0060 addr.sin_family = sa_family_t(AF_INET) 0061 addr.sin_port = Socket.htonsPort(port) 0062 addr.sin_addr = in_addr(s_addr: inet_addr("0.0.0.0")) 0063 addr.sin_zero = (0, 0, 0, 0, 0, 0, 0, 0) 0064 #endif 0065 0066 var bind_addr = sockaddr() 0067 memcpy(&bind_addr, &addr, Int(sizeof(sockaddr_in))) 0068 0069 if bind(socketFileDescriptor, &bind_addr, socklen_t(sizeof(sockaddr_in))) == -1 { 0070 let details = Socket.descriptionOfLastError() 0071 Socket.release(socketFileDescriptor) 0072 throw SocketError.BindFailed(details) 0073 } 0074 0075 if listen(socketFileDescriptor, maxPendingConnection ) == -1 { 0076 let details = Socket.descriptionOfLastError() 0077 Socket.release(socketFileDescriptor) 0078 throw SocketError.ListenFailed(details) 0079 } 0080 return Socket(socketFileDescriptor: socketFileDescriptor) 0081 } 0082 0083 private let socketFileDescriptor
Socket.swift:86
        self.socketFileDescriptor = socketFileDescriptor
Socket.swift:89
    public var hashValue: Int { return Int(self.socketFileDescriptor) }
Socket.swift:92
        Socket.release(self.socketFileDescriptor)
Socket.swift:96
        Socket.shutdwn(self.socketFileDescriptor)
Socket.swift:102
        let clientSocket = accept(self.socketFileDescriptor, &addr, &len)
Socket.swift:125
                    let s = write(self.socketFileDescriptor, $0.baseAddress + sent, Int(data.count - sent))
Socket.swift:137
        let next = recv(self.socketFileDescriptor as Int32, &buffer, Int(buffer.count), 0)
Socket.swift:159
        if getpeername(self.socketFileDescriptor, &addr, &len) != 0 {
Socket.swift:215
    return socket1.socketFileDescriptor == socket2.socketFileDescriptor
Socket.swift:215
    return socket1.socketFileDescriptor == socket2.socketFileDescriptor
: Int32 0084 0085 public init
HttpServerIO.swift:17
    private var listenSocket: Socket = Socket(socketFileDescriptor: -1)
Socket.swift:80
        return Socket(socketFileDescriptor: socketFileDescriptor)
Socket.swift:107
        return Socket(socketFileDescriptor: clientSocket)
(socketFileDescriptor: Int32) { 0086 self.socketFileDescriptor = socketFileDescriptor 0087 } 0088 0089 public var hashValue: Int { return Int(self.socketFileDescriptor) } 0090 0091 public func release
HttpServerIO.swift:41
        listenSocket.release()
HttpServerIO.swift:76
        socket.release()
() { 0092 Socket.release(self.socketFileDescriptor) 0093 } 0094 0095 public func shutdwn
HttpServerIO.swift:44
                socket.shutdwn()
() { 0096 Socket.shutdwn(self.socketFileDescriptor) 0097 } 0098 0099 public func acceptClientSocket
HttpServerIO.swift:25
            while let socket = try? self.listenSocket.acceptClientSocket() {
() throws -> Socket { 0100 var addr = sockaddr() 0101 var len: socklen_t = 0 0102 let clientSocket = accept(self.socketFileDescriptor, &addr, &len) 0103 if clientSocket == -1 { 0104 throw SocketError.AcceptFailed(Socket.descriptionOfLastError()) 0105 } 0106 Socket.setNoSigPipe(clientSocket) 0107 return Socket(socketFileDescriptor: clientSocket) 0108 } 0109 0110 public func writeUTF8
HttpServerIO.swift:100
        try socket.writeUTF8("HTTP/1.1 \(response.statusCode()) \(response.reasonPhrase())\r\n")
HttpServerIO.swift:105
            try socket.writeUTF8("Content-Length: \(content.length)\r\n")
HttpServerIO.swift:109
            try socket.writeUTF8("Connection: keep-alive\r\n")
HttpServerIO.swift:113
            try socket.writeUTF8("\(name): \(value)\r\n")
HttpServerIO.swift:116
        try socket.writeUTF8("\r\n")
(string: String) throws { 0111 try writeUInt8(ArraySlice(string.utf8)) 0112 } 0113 0114 public func writeUInt8
HttpHandlers+WebSockets.swift:80
                try self.socket.writeUInt8([finAndOpCode])
HttpHandlers+WebSockets.swift:81
                try self.socket.writeUInt8(maskAndLngth)
(data: [UInt8]) throws { 0115 try writeUInt8(ArraySlice(data)) 0116 } 0117 0118 public func writeUInt8
HttpHandlers+WebSockets.swift:82
                try self.socket.writeUInt8(data)
HttpServerIO.swift:92
                try socket.writeUInt8(data)
Socket.swift:111
        try writeUInt8(ArraySlice(string.utf8))
Socket.swift:115
        try writeUInt8(ArraySlice(data))
(data: ArraySlice<UInt8>) throws { 0119 try data.withUnsafeBufferPointer { 0120 var sent = 0 0121 while sent < data.count { 0122 #if os(Linux) 0123 let s = send(self.socketFileDescriptor, $0.baseAddress + sent, Int(data.count - sent), Int32(MSG_NOSIGNAL)) 0124 #else 0125 let s = write(self.socketFileDescriptor, $0.baseAddress + sent, Int(data.count - sent)) 0126 #endif 0127 if s <= 0 { 0128 throw SocketError.WriteFailed(Socket.descriptionOfLastError()) 0129 } 0130 sent += s 0131 } 0132 } 0133 } 0134 0135 public func read
HttpHandlers+WebSockets.swift:127
            let fst = try socket.read()
HttpHandlers+WebSockets.swift:141
            let sec = try socket.read()
HttpHandlers+WebSockets.swift:150
                let b0 = UInt64(try socket.read())
HttpHandlers+WebSockets.swift:151
                let b1 = UInt64(try socket.read())
HttpHandlers+WebSockets.swift:154
                let b0 = UInt64(try socket.read())
HttpHandlers+WebSockets.swift:155
                let b1 = UInt64(try socket.read())
HttpHandlers+WebSockets.swift:156
                let b2 = UInt64(try socket.read())
HttpHandlers+WebSockets.swift:157
                let b3 = UInt64(try socket.read())
HttpHandlers+WebSockets.swift:158
                let b4 = UInt64(try socket.read())
HttpHandlers+WebSockets.swift:159
                let b5 = UInt64(try socket.read())
HttpHandlers+WebSockets.swift:160
                let b6 = UInt64(try socket.read())
HttpHandlers+WebSockets.swift:161
                let b7 = UInt64(try socket.read())
HttpHandlers+WebSockets.swift:164
            let mask = [try socket.read(), try socket.read(), try socket.read(), try socket.read()]
HttpHandlers+WebSockets.swift:164
            let mask = [try socket.read(), try socket.read(), try socket.read(), try socket.read()]
HttpHandlers+WebSockets.swift:164
            let mask = [try socket.read(), try socket.read(), try socket.read(), try socket.read()]
HttpHandlers+WebSockets.swift:164
            let mask = [try socket.read(), try socket.read(), try socket.read(), try socket.read()]
HttpHandlers+WebSockets.swift:166
                frm.payload.append(try socket.read() ^ mask[Int(i % 4)])
HttpParser.swift:54
        for _ in 0..<size { body.append(try socket.read()) }
Socket.swift:151
            n = try self.read()
() throws -> UInt8 { 0136 var buffer = [UInt8](count: 1, repeatedValue: 0) 0137 let next = recv(self.socketFileDescriptor as Int32, &buffer, Int(buffer.count), 0) 0138 if next <= 0 { 0139 throw SocketError.RecvFailed(Socket.descriptionOfLastError()) 0140 } 0141 return buffer[0] 0142 } 0143 0144 private static let CR
Socket.swift:152
            if n > Socket.CR { characters.append(Character(UnicodeScalar(n))) }
= UInt8(13) 0145 private static let NL
Socket.swift:153
        } while n != Socket.NL
= UInt8(10) 0146 0147 public func readLine
HttpParser.swift:23
        let statusLine = try socket.readLine()
HttpParser.swift:61
            let headerLine = try socket.readLine()
() throws -> String { 0148 var characters: String = "" 0149 var n: UInt8 = 0 0150 repeat { 0151 n = try self.read() 0152 if n > Socket.CR { characters.append(Character(UnicodeScalar(n))) } 0153 } while n != Socket.NL 0154 return characters 0155 } 0156 0157 public func peername
HttpServerIO.swift:55
        let address = try? socket.peername()
() throws -> String { 0158 var addr = sockaddr(), len: socklen_t = socklen_t(sizeof(sockaddr)) 0159 if getpeername(self.socketFileDescriptor, &addr, &len) != 0 { 0160 throw SocketError.GetPeerNameFailed(Socket.descriptionOfLastError()) 0161 } 0162 var hostBuffer = [CChar](count: Int(NI_MAXHOST), repeatedValue: 0) 0163 if getnameinfo(&addr, len, &hostBuffer, socklen_t(hostBuffer.count), nil, 0, NI_NUMERICHOST) != 0 { 0164 throw SocketError.GetNameInfoFailed(Socket.descriptionOfLastError()) 0165 } 0166 guard let name = String.fromCString(hostBuffer) else { 0167 throw SocketError.ConvertingPeerNameFailed 0168 } 0169 return name 0170 } 0171 0172 private class func descriptionOfLastError
Socket.swift:40
            throw SocketError.SocketCreationFailed(Socket.descriptionOfLastError())
Socket.swift:45
            let details = Socket.descriptionOfLastError()
Socket.swift:70
            let details = Socket.descriptionOfLastError()
Socket.swift:76
            let details = Socket.descriptionOfLastError()
Socket.swift:104
            throw SocketError.AcceptFailed(Socket.descriptionOfLastError())
Socket.swift:128
                    throw SocketError.WriteFailed(Socket.descriptionOfLastError())
Socket.swift:139
            throw SocketError.RecvFailed(Socket.descriptionOfLastError())
Socket.swift:160
            throw SocketError.GetPeerNameFailed(Socket.descriptionOfLastError())
Socket.swift:164
            throw SocketError.GetNameInfoFailed(Socket.descriptionOfLastError())
() -> String { 0173 return String.fromCString(UnsafePointer(strerror(errno))) ?? "Error: \(errno)" 0174 } 0175 0176 private class func setNoSigPipe
Socket.swift:49
        Socket.setNoSigPipe(socketFileDescriptor)
Socket.swift:106
        Socket.setNoSigPipe(clientSocket)
(socket: Int32) { 0177 #if os(Linux) 0178 // There is no SO_NOSIGPIPE in Linux (nor some other systems). You can instead use the MSG_NOSIGNAL flag when calling send(), 0179 // or use signal(SIGPIPE, SIG_IGN) to make your entire application ignore SIGPIPE. 0180 #else 0181 // Prevents crashes when blocking calls are pending and the app is paused ( via Home button ). 0182 var no_sig_pipe: Int32 = 1 0183 setsockopt(socket, SOL_SOCKET, SO_NOSIGPIPE, &no_sig_pipe, socklen_t(sizeof(Int32))) 0184 #endif 0185 } 0186 0187 private class func shutdwn
Socket.swift:96
        Socket.shutdwn(self.socketFileDescriptor)
(socket: Int32) { 0188 #if os(Linux) 0189 shutdown(socket, Int32(SHUT_RDWR)) 0190 #else 0191 Darwin.shutdown(socket, SHUT_RDWR) 0192 #endif 0193 } 0194 0195 private class func release
Socket.swift:46
            Socket.release(socketFileDescriptor)
Socket.swift:71
            Socket.release(socketFileDescriptor)
Socket.swift:77
            Socket.release(socketFileDescriptor)
Socket.swift:92
        Socket.release(self.socketFileDescriptor)
(socket: Int32) { 0196 #if os(Linux) 0197 shutdown(socket, Int32(SHUT_RDWR)) 0198 #else 0199 Darwin.shutdown(socket, SHUT_RDWR) 0200 #endif 0201 close(socket) 0202 } 0203 0204 private class func htonsPort
Socket.swift:61
            addr.sin_port = Socket.htonsPort(port)
(port: in_port_t) -> in_port_t { 0205 #if os(Linux) 0206 return htons(port) 0207 #else 0208 let isLittleEndian = Int(OSHostByteOrder()) == OSLittleEndian 0209 return isLittleEndian ? _OSSwapInt16(port) : port 0210 #endif 0211 } 0212 } 0213 0214 public func ==(socket1: Socket, socket2: Socket) -> Bool { 0215 return socket1.socketFileDescriptor == socket2.socketFileDescriptor 0216 } 0217