Просмотр исходного кода

Merge pull request #39 from JetForMe/master

Added simple equality test for HttpResponse.
Damian Kołakowski 10 лет назад
Родитель
Сommit
aa9e746d0f
2 измененных файлов с 52 добавлено и 18 удалено
  1. 36 11
      Common/HttpResponse.swift
  2. 16 7
      Common/HttpServer.swift

+ 36 - 11
Common/HttpResponse.swift

@@ -14,39 +14,39 @@ public enum HttpResponseBody {
     case HTML(String)
     case HTML(String)
     case RAW(String)
     case RAW(String)
     
     
-    func data() -> String? {
+    func data() -> (content: String?, contentType: String?) {
         switch self {
         switch self {
         case .JSON(let object):
         case .JSON(let object):
             if NSJSONSerialization.isValidJSONObject(object) {
             if NSJSONSerialization.isValidJSONObject(object) {
                 do {
                 do {
                     let json = try NSJSONSerialization.dataWithJSONObject(object, options: NSJSONWritingOptions.PrettyPrinted)
                     let json = try NSJSONSerialization.dataWithJSONObject(object, options: NSJSONWritingOptions.PrettyPrinted)
                     if let nsString = NSString(data: json, encoding: NSUTF8StringEncoding) {
                     if let nsString = NSString(data: json, encoding: NSUTF8StringEncoding) {
-                        return nsString as String
+                        return (nsString as String, "application/json")
                     }
                     }
                 } catch let serializationError as NSError {
                 } catch let serializationError as NSError {
-                    return "Serialisation error: \(serializationError)"
+                    return ("Serialisation error: \(serializationError)", nil)
                 }
                 }
             }
             }
-            return "Invalid object to serialise."
+            return ("Invalid object to serialise.", nil)
         case .XML(_):
         case .XML(_):
-            return "XML serialization not supported."
+            return ("XML serialization not supported.", nil)
         case .PLIST(let object):
         case .PLIST(let object):
             let format = NSPropertyListFormat.XMLFormat_v1_0
             let format = NSPropertyListFormat.XMLFormat_v1_0
             if NSPropertyListSerialization.propertyList(object, isValidForFormat: format) {
             if NSPropertyListSerialization.propertyList(object, isValidForFormat: format) {
                 do {
                 do {
                     let plist = try NSPropertyListSerialization.dataWithPropertyList(object, format: format, options: 0)
                     let plist = try NSPropertyListSerialization.dataWithPropertyList(object, format: format, options: 0)
                     if let nsString = NSString(data: plist, encoding: NSUTF8StringEncoding) {
                     if let nsString = NSString(data: plist, encoding: NSUTF8StringEncoding) {
-                        return nsString as String
+                        return (nsString as String, "application/plist")
                     }
                     }
                 } catch let serializationError as NSError {
                 } catch let serializationError as NSError {
-                    return "Serialisation error: \(serializationError)"
+                    return ("Serialisation error: \(serializationError)", nil)
                 }
                 }
             }
             }
-            return "Invalid object to serialise."
+            return ("Invalid object to serialise.", nil)
         case .RAW(let body):
         case .RAW(let body):
-            return body
+            return (body, "application/octet-stream")
         case .HTML(let body):
         case .HTML(let body):
-            return "<html><body>\(body)</body></html>"
+            return ("<html><body>\(body)</body></html>", "text/html")
         }
         }
     }
     }
 }
 }
@@ -93,6 +93,13 @@ public enum HttpResponse {
         var headers = [String:String]()
         var headers = [String:String]()
         headers["Server"] = "Swifter"
         headers["Server"] = "Swifter"
         switch self {
         switch self {
+		case .OK(let body):
+			let d = body.data()
+			if let ct = d.1
+			{
+				headers["Content-Type"] = ct
+			}
+			
         case .MovedPermanently(let location) : headers["Location"] = location
         case .MovedPermanently(let location) : headers["Location"] = location
         default:[]
         default:[]
         }
         }
@@ -101,9 +108,27 @@ public enum HttpResponse {
     
     
     func body() -> NSData? {
     func body() -> NSData? {
         switch self {
         switch self {
-        case .OK(let body)      : return body.data()?.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
+        case .OK(let body):
+			let d = body.data()
+			return d.0?.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
+			
         case .RAW(_, let data)  : return data
         case .RAW(_, let data)  : return data
         default                 : return nil
         default                 : return nil
         }
         }
     }
     }
 }
 }
+
+/**
+	Makes it possible to compare handler responses with '==', but
+	ignores any associated values. This should generally be what
+	you want. E.g.:
+	
+		let resp = handler(updatedRequest)
+		if resp == .NotFound {
+			print("Client requested not found: \(request.url)")
+		}
+*/
+
+func ==(inLeft: HttpResponse, inRight: HttpResponse) -> Bool {
+	return inLeft.statusCode() == inRight.statusCode()
+}

+ 16 - 7
Common/HttpServer.swift

@@ -76,16 +76,25 @@ public class HttpServer
         return false
         return false
     }
     }
     
     
-    public func findHandler(url:String) -> (NSRegularExpression, Handler)? {
-        return self.handlers.filter {
-            $0.0.numberOfMatchesInString(url, options: self.matchingOptions, range: HttpServer.asciiRange(url)) > 0
-        }.first
+    func findHandler(url:String) -> (NSRegularExpression, Handler)? {
+		let u = NSURL(string: url)!
+		let path = u.path!
+		for handler in self.handlers {
+			let regex = handler.0
+            let matches = regex.numberOfMatchesInString(path, options: self.matchingOptions, range: HttpServer.asciiRange(path)) > 0
+			if matches {
+				return handler;
+			}
+        }
+		return nil
     }
     }
     
     
-    public func captureExpressionGroups(expression: NSRegularExpression, value: String) -> [String] {
+    func captureExpressionGroups(expression: NSRegularExpression, value: String) -> [String] {
+		let u = NSURL(string: value)!
+		let path = u.path!
         var capturedGroups = [String]()
         var capturedGroups = [String]()
-        if let result = expression.firstMatchInString(value, options: matchingOptions, range: HttpServer.asciiRange(value)) {
-            let nsValue: NSString = value
+        if let result = expression.firstMatchInString(path, options: matchingOptions, range: HttpServer.asciiRange(path)) {
+            let nsValue: NSString = path
             for var i = 1 ; i < result.numberOfRanges ; ++i {
             for var i = 1 ; i < result.numberOfRanges ; ++i {
                 if let group = nsValue.substringWithRange(result.rangeAtIndex(i)).stringByRemovingPercentEncoding {
                 if let group = nsValue.substringWithRange(result.rangeAtIndex(i)).stringByRemovingPercentEncoding {
                     capturedGroups.append(group)
                     capturedGroups.append(group)