HttpHandlers+WebSockets.swift 1.2 KB

123456789101112131415161718192021222324252627282930313233
  1. //
  2. // HttpHandlers+WebSockets.swift
  3. // Swifter
  4. //
  5. // Copyright © 2014-2016 Damian Kołakowski. All rights reserved.
  6. //
  7. import Foundation
  8. extension HttpHandlers {
  9. public class func websocket(message:(String) -> ()) -> (HttpRequest -> HttpResponse) {
  10. func closure(r: HttpRequest) -> HttpResponse {
  11. guard r.headers["upgrade"] == "websocket" else {
  12. return .BadRequest
  13. }
  14. guard r.headers["connection"] == "Upgrade" else {
  15. return .BadRequest
  16. }
  17. guard let secWebSocketKey = r.headers["sec-websocket-key"] else {
  18. return .BadRequest
  19. }
  20. let accept = (secWebSocketKey + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11").SHA1()
  21. let acceptBASE64 = String(data: (accept.dataUsingEncoding(NSUTF8StringEncoding)?.base64EncodedDataWithOptions(NSDataBase64EncodingOptions.Encoding64CharacterLineLength))!, encoding: NSUTF8StringEncoding)!;
  22. let upgradeHeaders = [ "Upgrade": "weboscket", "Connection": "Upgrade",
  23. "Sec-WebSocket-Accept": acceptBASE64
  24. ]
  25. return HttpResponse.RAW(101, "Switching Protocols", upgradeHeaders, nil)
  26. }
  27. return closure
  28. }
  29. }