소스 검색

Improved tokens detection for HTTP headers.

Damian Kołakowski 10 년 전
부모
커밋
e6d6098b7a
2개의 변경된 파일9개의 추가작업 그리고 2개의 파일을 삭제
  1. 2 2
      Sources/HttpHandlers+WebSockets.swift
  2. 7 0
      Sources/HttpRequest.swift

+ 2 - 2
Sources/HttpHandlers+WebSockets.swift

@@ -13,10 +13,10 @@ extension HttpHandlers {
             text: ((WebSocketSession, String) -> Void)?,
         _ binary: ((WebSocketSession, [UInt8]) -> Void)?) -> (HttpRequest -> HttpResponse) {
         return { r in
-            guard r.headers["upgrade"] == "websocket" else {
+            guard r.hasTokenForHeader("upgrade", token: "websocket") else {
                 return .BadRequest(.Text("Invalid value of 'Upgrade' header: \(r.headers["upgrade"])"))
             }
-            guard r.headers["connection"] == "Upgrade" || r.headers["connection"] == "keep-alive, Upgrade" else {
+            guard r.hasTokenForHeader("connection", token: "upgrade") else {
                 return .BadRequest(.Text("Invalid value of 'Connection' header: \(r.headers["connection"])"))
             }
             guard let secWebSocketKey = r.headers["sec-websocket-key"] else {

+ 7 - 0
Sources/HttpRequest.swift

@@ -17,6 +17,13 @@ public class HttpRequest {
     public var address: String? = ""
     public var params: [String: String] = [:]
     
+    public func hasTokenForHeader(headerName: String, token: String) -> Bool {
+        guard let headerValue = headers[headerName] else {
+            return false
+        }
+        return headerValue.split(",").filter({ $0.trim().lowercaseString == token }).count > 0
+    }
+    
     public func parseUrlencodedForm() -> [(String, String)] {
         guard let contentTypeHeader = headers["content-type"] else {
             return []