HttpServer.swift 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. //
  2. // HttpServer.swift
  3. //
  4. // Created by Damian Kolakowski on 05/06/14.
  5. // Copyright (c) 2014 Damian Kołakowski. All rights reserved.
  6. //
  7. import Foundation
  8. /* HTTP stream parser */
  9. class HttpServer
  10. {
  11. var handlers: Dictionary<String, (Void -> (CInt, String))> = Dictionary()
  12. var acceptSocket: CInt = -1
  13. subscript (path: String) -> ((Void -> (CInt, String))) {
  14. get {
  15. return handlers[path]!
  16. }
  17. set ( newValue ) {
  18. self.handlers.updateValue(newValue, forKey: path)
  19. }
  20. }
  21. func start(listenPort: in_port_t) -> (Bool, String?) {
  22. releaseAcceptSocket()
  23. let (socket, error) = Socket.tcpForListen(listenPort)
  24. if ( socket == -1 ) {
  25. return (false, error)
  26. }
  27. acceptSocket = socket
  28. dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), { () -> Void in
  29. while ( self.acceptSocket != -1 ) {
  30. var addr = sockaddr(sa_len: 0, sa_family: 0, sa_data: (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)), len: socklen_t = 0
  31. let socket = accept(self.acceptSocket, &addr, &len)
  32. if ( socket == -1 ) {
  33. self.releaseAcceptSocket();
  34. return
  35. }
  36. Socket.nosigpipe(socket)
  37. dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), { () -> Void in
  38. let parser = HttpParser()
  39. if let (path, headers) = parser.parseHttpHeader(socket) {
  40. if let handler = self.handlers[path] {
  41. let (status, response) = handler()
  42. // no support for keep-alive for now so let's stay with HTTP 1.0
  43. Socket.writeString(socket, response: "HTTP/1.0 \(status) OK\r\n\r\n\(response)")
  44. }
  45. }
  46. Socket.release(socket)
  47. });
  48. }
  49. });
  50. return (true, nil)
  51. }
  52. func stop() {
  53. releaseAcceptSocket()
  54. }
  55. func releaseAcceptSocket() {
  56. if ( acceptSocket != -1 ) {
  57. Socket.release(acceptSocket)
  58. acceptSocket = -1
  59. }
  60. }
  61. }