Kaynağa Gözat

Merge pull request #75 from julien-c/master

Linux: HTTP Range support: get rid of the NSRegularExpression dependency
Damian Kołakowski 10 yıl önce
ebeveyn
işleme
3e86e1119a
1 değiştirilmiş dosya ile 14 ekleme ve 4 silme
  1. 14 4
      Sources/Swifter/HttpHandlers.swift

+ 14 - 4
Sources/Swifter/HttpHandlers.swift

@@ -8,7 +8,7 @@ import Foundation
 
 public class HttpHandlers {
     
-    private static let rangeExpression = try! NSRegularExpression(pattern: "bytes=(\\d*)-(\\d*)", options: .CaseInsensitive)
+    private static let rangePrefix = "bytes="
     
     public class func directory(dir: String) -> (HttpRequest -> HttpResponse) {
         return { request in
@@ -25,12 +25,22 @@ public class HttpHandlers {
             
             if let rangeHeader = request.headers["range"] {
                 
-                guard let match = rangeExpression.matchesInString(rangeHeader, options: .Anchored, range: NSRange(location: 0, length: rangeHeader.characters.count)).first where match.numberOfRanges == 3 else {
+                guard rangeHeader.hasPrefix(HttpHandlers.rangePrefix) else {
                     return HttpResponse.BadRequest
                 }
                 
-                let startStr = (rangeHeader as NSString).substringWithRange(match.rangeAtIndex(1))
-                let endStr = (rangeHeader as NSString).substringWithRange(match.rangeAtIndex(2))
+#if os(Linux)
+                let rangeString = rangeHeader.substringFromIndex(HttpHandlers.rangePrefix.characters.count)
+#else
+                let rangeString = rangeHeader.substringFromIndex(rangeHeader.startIndex.advancedBy(HttpHandlers.rangePrefix.characters.count))
+#endif
+                let rangeStringExploded = rangeString.split("-")
+                guard rangeStringExploded.count == 2 else {
+                    return HttpResponse.BadRequest
+                }
+                
+                let startStr = rangeStringExploded[0]
+                let endStr   = rangeStringExploded[1]
                 
                 guard let start = Int(startStr), end = Int(endStr) else {
                     var array = [UInt8](count: fileBody.length, repeatedValue: 0)