0001 #if os(Linux) 0002 import Glibc 0003 0004 private let sock_stream = Int32(SOCK_STREAM.rawValue) 0005 0006 private let system_accept = Glibc.accept 0007 private let system_bind = Glibc.bind 0008 private let system_close = Glibc.close 0009 private let system_listen = Glibc.listen 0010 private let system_read = Glibc.read 0011 private let system_send = Glibc.send 0012 private let system_write = Glibc.write 0013 private let system_shutdown = Glibc.shutdown 0014 private let system_select = Glibc.select 0015 private let system_pipe = Glibc.pipe 0016 #else 0017 import Darwin.C 0018 0019 private let sock_stream= SOCK_STREAM 0020 0021 private let system_accept
Socket.swift:68 descriptor = socket(AF_INET, sock_stream, IPPROTO_TCP)= Darwin.accept 0022 private let system_bind
Socket.swift:108 let descriptor = system_accept(self.descriptor, nil, nil)= Darwin.bind 0023 private let system_close
Socket.swift:102 guard system_bind(descriptor, sockaddr_cast(&addr), len) != -1 else {= Darwin.close 0024 private let system_listen
Socket.swift:116 system_close(descriptor)= Darwin.listen 0025 private let system_read
Socket.swift:89 if system_listen(descriptor, backlog) == -1 {= Darwin.read 0026 private let system_send
Socket.swift:142 let bytes = system_read(descriptor, data.bytes, data.capacity)= Darwin.send 0027 private let system_write
Socket.swift:130 system_send(descriptor, bytes, Int(strlen(bytes)), flags)= Darwin.write 0028 private let system_shutdown
Socket.swift:136 system_write(descriptor, bytes, Int(strlen(bytes)))= Darwin.shutdown 0029 private let system_select
Socket.swift:120 system_shutdown(descriptor, Int32(SHUT_RDWR))= Darwin.select 0030 private let system_pipe
Socket.swift:224 let result = system_select(maxFD + 1, &readFDs, &writeFDs, &errorFDs, &timeout)= Darwin.pipe 0031 #endif 0032 0033 0034 struct SocketError
Socket.swift:58 if system_pipe(&fds) == -1 {: ErrorType, CustomStringConvertible { 0035 let function
Socket.swift:59 throw SocketError()Socket.swift:74 throw SocketError(function: "setsockopt()")Socket.swift:79 throw SocketError(function: "setsockopt()")Socket.swift:90 throw SocketError()Socket.swift:103 throw SocketError()Socket.swift:110 throw SocketError()Socket.swift:144 throw SocketError(): String 0036 let number
Socket.swift:39 self.function = functionSocket.swift:44 return "Socket.\(function) failed [\(number)]": Int32 0037 0038 init
Socket.swift:40 self.number = errnoSocket.swift:44 return "Socket.\(function) failed [\(number)]"(function: String = __FUNCTION__) { 0039 self.function = function 0040 self.number = errno 0041 } 0042 0043 var description: String { 0044 return "Socket.\(function) failed [\(number)]" 0045 } 0046 } 0047 0048 0049 /// Represents a TCP AF_INET socket 0050 class Socket
Socket.swift:59 throw SocketError()Socket.swift:74 throw SocketError(function: "setsockopt()")Socket.swift:79 throw SocketError(function: "setsockopt()")Socket.swift:90 throw SocketError()Socket.swift:103 throw SocketError()Socket.swift:110 throw SocketError()Socket.swift:144 throw SocketError(){ 0051 typealias Descriptor
Arbiter.swift:15 func socket(backlog: Int32) throws -> Socket {Arbiter.swift:18 let socket = try Socket()Arbiter.swift:38 var listeners: [Socket] = []HTTPParser.swift:32 let socket: SocketHTTPParser.swift:34 init(socket: Socket) {Signals.swift:28 var pipe: [Socket]Signals.swift:32 pipe = try Socket.pipe()Socket.swift:56 class func pipe() throws -> [Socket] {Socket.swift:61 return [Socket(descriptor: fds[0]), Socket(descriptor: fds[1])]Socket.swift:61 return [Socket(descriptor: fds[0]), Socket(descriptor: fds[1])]Socket.swift:107 func accept() throws -> Socket {Socket.swift:112 return Socket(descriptor: descriptor)Socket.swift:201 func filter(sockets: [Socket], inout _ set: fd_set) -> [Socket] {Socket.swift:201 func filter(sockets: [Socket], inout _ set: fd_set) -> [Socket] {Socket.swift:208 func select(reads: [Socket], _ writes: [Socket], _ errors: [Socket], timeout: timeval) -> ([Socket], [Socket], [Socket]) {Socket.swift:208 func select(reads: [Socket], _ writes: [Socket], _ errors: [Socket], timeout: timeval) -> ([Socket], [Socket], [Socket]) {Socket.swift:208 func select(reads: [Socket], _ writes: [Socket], _ errors: [Socket], timeout: timeval) -> ([Socket], [Socket], [Socket]) {Socket.swift:208 func select(reads: [Socket], _ writes: [Socket], _ errors: [Socket], timeout: timeval) -> ([Socket], [Socket], [Socket]) {Socket.swift:208 func select(reads: [Socket], _ writes: [Socket], _ errors: [Socket], timeout: timeval) -> ([Socket], [Socket], [Socket]) {Socket.swift:208 func select(reads: [Socket], _ writes: [Socket], _ errors: [Socket], timeout: timeval) -> ([Socket], [Socket], [Socket]) {SyncronousWorker.swift:13 let listeners: [Socket]SyncronousWorker.swift:20 init(logger: Logger, listeners: [Socket], timeout: Int, application: RequestType -> ResponseType) {SyncronousWorker.swift:58 func runOne(listener: Socket) {SyncronousWorker.swift:67 func runMultiple(listeners: [Socket]) {SyncronousWorker.swift:86 func wait() -> [Socket] {SyncronousWorker.swift:92 func accept(listener: Socket) {SyncronousWorker.swift:99 func handle(client: Socket) {SyncronousWorker.swift:123 func sendResponse(client: Socket, response: ResponseType) {Worker.swift:13 init(logger: Logger, listeners: [Socket], timeout: Int, application: RequestType -> ResponseType)= Int32 0052 typealias Port
Socket.swift:54 let descriptor: DescriptorSocket.swift:84 init(descriptor: Descriptor) {= UInt16 0053 0054 let descriptor
Socket.swift:94 func bind(address: String, port: Port) throws {: Descriptor 0055 0056 class func pipe
Socket.swift:68 descriptor = socket(AF_INET, sock_stream, IPPROTO_TCP)Socket.swift:70 assert(descriptor > 0)Socket.swift:73 guard setsockopt(descriptor, SOL_SOCKET, SO_REUSEADDR, &value, socklen_t(sizeof(Int32))) != -1 else {Socket.swift:78 guard setsockopt(descriptor, SOL_SOCKET, SO_NOSIGPIPE, &value, socklen_t(sizeof(Int32))) != -1 else {Socket.swift:85 self.descriptor = descriptorSocket.swift:89 if system_listen(descriptor, backlog) == -1 {Socket.swift:102 guard system_bind(descriptor, sockaddr_cast(&addr), len) != -1 else {Socket.swift:108 let descriptor = system_accept(self.descriptor, nil, nil)Socket.swift:116 system_close(descriptor)Socket.swift:120 system_shutdown(descriptor, Int32(SHUT_RDWR))Socket.swift:130 system_send(descriptor, bytes, Int(strlen(bytes)), flags)Socket.swift:136 system_write(descriptor, bytes, Int(strlen(bytes)))Socket.swift:142 let bytes = system_read(descriptor, data.bytes, data.capacity)Socket.swift:152 let flags = fcntl(descriptor, F_GETFL, 0)Socket.swift:157 let flags = fcntl(descriptor, F_GETFL, 0)Socket.swift:166 let _ = fcntl(descriptor, F_SETFL, newFlags)Socket.swift:173 let flags = fcntl(descriptor, F_GETFL, 0)Socket.swift:178 let flags = fcntl(descriptor, F_GETFL, 0)Socket.swift:187 let _ = fcntl(descriptor, F_SETFL, newFlags)Socket.swift:203 fdIsSet($0.descriptor, &set)Socket.swift:213 reads.forEach { fdSet($0.descriptor, &readFDs) }Socket.swift:217 writes.forEach { fdSet($0.descriptor, &writeFDs) }Socket.swift:221 errors.forEach { fdSet($0.descriptor, &errorFDs) }Socket.swift:223 let maxFD = (reads + writes + errors).map { $0.descriptor }.reduce(0, combine: max)() throws -> [Socket] { 0057 var fds: [Int32] = [0, 0] 0058 if system_pipe(&fds) == -1 { 0059 throw SocketError() 0060 } 0061 return [Socket(descriptor: fds[0]), Socket(descriptor: fds[1])] 0062 } 0063 0064 init
Signals.swift:32 pipe = try Socket.pipe()() throws { 0065 #if os(Linux) 0066 descriptor = socket(AF_INET, sock_stream, 0) 0067 #else 0068 descriptor = socket(AF_INET, sock_stream, IPPROTO_TCP) 0069 #endif 0070 assert(descriptor > 0) 0071 0072 var value: Int32 = 1; 0073 guard setsockopt(descriptor, SOL_SOCKET, SO_REUSEADDR, &value, socklen_t(sizeof(Int32))) != -1 else { 0074 throw SocketError(function: "setsockopt()") 0075 } 0076 0077 #if !os(Linux) 0078 guard setsockopt(descriptor, SOL_SOCKET, SO_NOSIGPIPE, &value, socklen_t(sizeof(Int32))) != -1 else { 0079 throw SocketError(function: "setsockopt()") 0080 } 0081 #endif 0082 } 0083 0084 init
Arbiter.swift:18 let socket = try Socket()(descriptor: Descriptor) { 0085 self.descriptor = descriptor 0086 } 0087 0088 func listen
Socket.swift:61 return [Socket(descriptor: fds[0]), Socket(descriptor: fds[1])]Socket.swift:61 return [Socket(descriptor: fds[0]), Socket(descriptor: fds[1])]Socket.swift:112 return Socket(descriptor: descriptor)(backlog: Int32) throws { 0089 if system_listen(descriptor, backlog) == -1 { 0090 throw SocketError() 0091 } 0092 } 0093 0094 func bind
Arbiter.swift:20 try socket.listen(backlog)(address: String, port: Port) throws { 0095 var addr = sockaddr_in() 0096 addr.sin_family = sa_family_t(AF_INET) 0097 addr.sin_port = in_port_t(htons(in_port_t(port))) 0098 addr.sin_addr = in_addr(s_addr: address.withCString { inet_addr($0) }) 0099 addr.sin_zero = (0, 0, 0, 0, 0, 0, 0, 0) 0100 0101 let len = socklen_t(UInt8(sizeof(sockaddr_in))) 0102 guard system_bind(descriptor, sockaddr_cast(&addr), len) != -1 else { 0103 throw SocketError() 0104 } 0105 } 0106 0107 func accept
Arbiter.swift:19 try socket.bind(hostname, port: port)() throws -> Socket { 0108 let descriptor = system_accept(self.descriptor, nil, nil) 0109 if descriptor == -1 { 0110 throw SocketError() 0111 } 0112 return Socket(descriptor: descriptor) 0113 } 0114 0115 func close
SyncronousWorker.swift:93 if let client = try? listener.accept() {() { 0116 system_close(descriptor) 0117 } 0118 0119 func shutdown
Arbiter.swift:99 listeners.forEach { $0.close() }SyncronousWorker.swift:118 client.close()() { 0120 system_shutdown(descriptor, Int32(SHUT_RDWR)) 0121 } 0122 0123 func send
SyncronousWorker.swift:117 client.shutdown()(output: String) { 0124 output.withCString { bytes in 0125 #if os(Linux) 0126 let flags = Int32(MSG_NOSIGNAL) 0127 #else 0128 let flags = Int32(0) 0129 #endif 0130 system_send(descriptor, bytes, Int(strlen(bytes)), flags) 0131 } 0132 } 0133 0134 func write(output: String) { 0135 output.withCString { bytes in 0136 system_write(descriptor, bytes, Int(strlen(bytes))) 0137 } 0138 } 0139 0140 func read
Signals.swift:42 pipe[1].send(".")SyncronousWorker.swift:126 client.send("Connection: close\r\n")SyncronousWorker.swift:144 client.send("Content-Length: 0\r\n")SyncronousWorker.swift:148 client.send("\r\n")(bytes: Int) throws -> [CChar] { 0141 let data = Data(capacity: bytes) 0142 let bytes = system_read(descriptor, data.bytes, data.capacity) 0143 guard bytes != -1 else { 0144 throw SocketError() 0145 } 0146 return Array(data.characters[0..<bytes]) 0147 } 0148 0149 /// Returns whether the socket is set to non-blocking or blocking 0150 var blocking
Arbiter.swift:123 while try signalHandler.pipe[0].read(1).count > 0 {}HTTPParser.swift:48 let bytes = try socket.read(nextSize): Bool { 0151 get { 0152 let flags = fcntl(descriptor, F_GETFL, 0) 0153 return flags & O_NONBLOCK == 0 0154 } 0155 0156 set { 0157 let flags = fcntl(descriptor, F_GETFL, 0) 0158 let newFlags: Int32 0159 0160 if newValue { 0161 newFlags = flags & ~O_NONBLOCK 0162 } else { 0163 newFlags = flags | O_NONBLOCK 0164 } 0165 0166 let _ = fcntl(descriptor, F_SETFL, newFlags) 0167 } 0168 } 0169 0170 /// Returns whether the socket is has the FD_CLOEXEC flag set 0171 var closeOnExec
Signals.swift:36 socket.blocking = falseSyncronousWorker.swift:49 listeners.forEach { $0.blocking = false }SyncronousWorker.swift:94 client.blocking = true: Bool { 0172 get { 0173 let flags = fcntl(descriptor, F_GETFL, 0) 0174 return flags & FD_CLOEXEC == 1 0175 } 0176 0177 set { 0178 let flags = fcntl(descriptor, F_GETFL, 0) 0179 let newFlags: Int32 0180 0181 if newValue { 0182 newFlags = flags ^ FD_CLOEXEC 0183 } else { 0184 newFlags = flags | FD_CLOEXEC 0185 } 0186 0187 let _ = fcntl(descriptor, F_SETFL, newFlags) 0188 } 0189 } 0190 0191 private func htons
Signals.swift:35 socket.closeOnExec = true(value: CUnsignedShort) -> CUnsignedShort { 0192 return (value << 8) + (value >> 8) 0193 } 0194 0195 private func sockaddr_cast
Socket.swift:97 addr.sin_port = in_port_t(htons(in_port_t(port)))(p: UnsafeMutablePointer<Void>) -> UnsafeMutablePointer<sockaddr> { 0196 return UnsafeMutablePointer<sockaddr>(p) 0197 } 0198 } 0199 0200 0201 func filter
Socket.swift:102 guard system_bind(descriptor, sockaddr_cast(&addr), len) != -1 else {(sockets: [Socket], inout _ set: fd_set) -> [Socket] { 0202 return sockets.filter { 0203 fdIsSet($0.descriptor, &set) 0204 } 0205 } 0206 0207 0208 func select
Socket.swift:230 filter(reads, &readFDs),Socket.swift:231 filter(writes, &writeFDs),Socket.swift:232 filter(errors, &errorFDs)(reads: [Socket], _ writes: [Socket], _ errors: [Socket], timeout: timeval) -> ([Socket], [Socket], [Socket]) { 0209 var timeout = timeout 0210 0211 var readFDs = fd_set() 0212 fdZero(&readFDs) 0213 reads.forEach { fdSet($0.descriptor, &readFDs) } 0214 0215 var writeFDs = fd_set() 0216 fdZero(&writeFDs) 0217 writes.forEach { fdSet($0.descriptor, &writeFDs) } 0218 0219 var errorFDs = fd_set() 0220 fdZero(&errorFDs) 0221 errors.forEach { fdSet($0.descriptor, &errorFDs) } 0222 0223 let maxFD = (reads + writes + errors).map { $0.descriptor }.reduce(0, combine: max) 0224 let result = system_select(maxFD + 1, &readFDs, &writeFDs, &errorFDs, &timeout) 0225 0226 if result == 0 { 0227 return ([], [], []) 0228 } else if result > 0 { 0229 return ( 0230 filter(reads, &readFDs), 0231 filter(writes, &writeFDs), 0232 filter(errors, &errorFDs) 0233 ) 0234 } 0235 0236 // error 0237 return ([], [], []) 0238 } 0239
Arbiter.swift:119 let (read, _, _) = select([signalHandler.pipe[0]], [], [], timeout: timeout)SyncronousWorker.swift:88 let (read, _, _) = select(listeners + [sharedHandler!.pipe[0]], [], [], timeout: timeout)