Selaa lähdekoodia

Added GCDWebServerNormalizePath() API

Pierre-Olivier Latour 6 vuotta sitten
vanhempi
commit
ec800b43d5

+ 19 - 0
Frameworks/Tests.m

@@ -1,6 +1,8 @@
 #import <GCDWebServers/GCDWebServers.h>
 #import <XCTest/XCTest.h>
 
+#pragma clang diagnostic ignored "-Weverything"  // Prevent "messaging to unqualified id" warnings
+
 @interface Tests : XCTestCase
 @end
 
@@ -21,4 +23,21 @@
   XCTAssertNotNil(server);
 }
 
+- (void)testPaths {
+  XCTAssertEqualObjects(GCDWebServerNormalizePath(@""), @"");
+  XCTAssertEqualObjects(GCDWebServerNormalizePath(@"/foo/"), @"/foo");
+  XCTAssertEqualObjects(GCDWebServerNormalizePath(@"foo/bar"), @"foo/bar");
+  XCTAssertEqualObjects(GCDWebServerNormalizePath(@"foo//bar"), @"foo/bar");
+  XCTAssertEqualObjects(GCDWebServerNormalizePath(@"foo/bar//"), @"foo/bar");
+  XCTAssertEqualObjects(GCDWebServerNormalizePath(@"foo/./bar"), @"foo/bar");
+  XCTAssertEqualObjects(GCDWebServerNormalizePath(@"foo/bar/."), @"foo/bar");
+  XCTAssertEqualObjects(GCDWebServerNormalizePath(@"foo/../bar"), @"bar");
+  XCTAssertEqualObjects(GCDWebServerNormalizePath(@"/foo/../bar"), @"/bar");
+  XCTAssertEqualObjects(GCDWebServerNormalizePath(@"/foo/.."), @"/");
+  XCTAssertEqualObjects(GCDWebServerNormalizePath(@"/.."), @"/");
+  XCTAssertEqualObjects(GCDWebServerNormalizePath(@"."), @"");
+  XCTAssertEqualObjects(GCDWebServerNormalizePath(@".."), @"");
+  XCTAssertEqualObjects(GCDWebServerNormalizePath(@"../.."), @"");
+}
+
 @end

+ 5 - 0
GCDWebServer/Core/GCDWebServerFunctions.h

@@ -102,6 +102,11 @@ NSString* GCDWebServerFormatISO8601(NSDate* date);
  */
 NSDate* _Nullable GCDWebServerParseISO8601(NSString* string);
 
+/**
+ *  Removes "//", "/./" and "/../" components from path as well as any trailing slash.
+ */
+NSString* GCDWebServerNormalizePath(NSString* path);
+
 #ifdef __cplusplus
 }
 #endif

+ 15 - 0
GCDWebServer/Core/GCDWebServerFunctions.m

@@ -314,3 +314,18 @@ NSString* GCDWebServerComputeMD5Digest(NSString* format, ...) {
   buffer[2 * CC_MD5_DIGEST_LENGTH] = 0;
   return (NSString*)[NSString stringWithUTF8String:buffer];
 }
+
+NSString* GCDWebServerNormalizePath(NSString* path) {
+  NSMutableArray* components = [[NSMutableArray alloc] init];
+  for (NSString* component in [path componentsSeparatedByString:@"/"]) {
+    if ([component isEqualToString:@".."]) {
+      [components removeLastObject];
+    } else if (component.length && ![component isEqualToString:@"."]) {
+      [components addObject:component];
+    }
+  }
+  if (path.length && ([path characterAtIndex:0] == '/')) {
+    return [@"/" stringByAppendingString:[components componentsJoinedByString:@"/"]];  // Preserve initial slash
+  }
+  return [components componentsJoinedByString:@"/"];
+}