You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by sh...@apache.org on 2016/07/25 07:57:35 UTC

[49/57] [abbrv] cordova-plugins git commit: Merge commit '394cfb12f80de35255a506c0dcbf4a21910e849a'

http://git-wip-us.apache.org/repos/asf/cordova-plugins/blob/36f1a43e/local-webserver/src/ios/GCDWebServer/Mac/main.m
----------------------------------------------------------------------
diff --cc local-webserver/src/ios/GCDWebServer/Mac/main.m
index f446ce0,0000000..33b25e5
mode 100644,000000..100644
--- a/local-webserver/src/ios/GCDWebServer/Mac/main.m
+++ b/local-webserver/src/ios/GCDWebServer/Mac/main.m
@@@ -1,407 -1,0 +1,442 @@@
 +/*
-  Copyright (c) 2012-2014, Pierre-Olivier Latour
++ Copyright (c) 2012-2015, Pierre-Olivier Latour
 + All rights reserved.
 + 
 + Redistribution and use in source and binary forms, with or without
 + modification, are permitted provided that the following conditions are met:
 + * Redistributions of source code must retain the above copyright
 + notice, this list of conditions and the following disclaimer.
 + * Redistributions in binary form must reproduce the above copyright
 + notice, this list of conditions and the following disclaimer in the
 + documentation and/or other materials provided with the distribution.
 + * The name of Pierre-Olivier Latour may not be used to endorse
 + or promote products derived from this software without specific
 + prior written permission.
 + 
 + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 + DISCLAIMED. IN NO EVENT SHALL PIERRE-OLIVIER LATOUR BE LIABLE FOR ANY
 + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 + */
 +
 +#import <libgen.h>
 +
 +#import "GCDWebServer.h"
 +
 +#import "GCDWebServerDataRequest.h"
 +#import "GCDWebServerURLEncodedFormRequest.h"
 +#import "GCDWebServerMultiPartFormRequest.h"
 +
 +#import "GCDWebServerDataResponse.h"
 +#import "GCDWebServerStreamedResponse.h"
 +
 +#import "GCDWebDAVServer.h"
 +
 +#import "GCDWebUploader.h"
 +
 +#ifndef __GCDWEBSERVER_ENABLE_TESTING__
 +#error __GCDWEBSERVER_ENABLE_TESTING__ must be defined
 +#endif
 +
 +typedef enum {
 +  kMode_WebServer = 0,
 +  kMode_HTMLPage,
 +  kMode_HTMLForm,
 +  kMode_HTMLFileUpload,
 +  kMode_WebDAV,
 +  kMode_WebUploader,
 +  kMode_StreamingResponse,
 +  kMode_AsyncResponse
 +} Mode;
 +
 +@interface Delegate : NSObject <GCDWebServerDelegate, GCDWebDAVServerDelegate, GCDWebUploaderDelegate>
 +@end
 +
 +@implementation Delegate
 +
 +- (void)_logDelegateCall:(SEL)selector {
 +  fprintf(stdout, "<DELEGATE METHOD \"%s\" CALLED>\n", [NSStringFromSelector(selector) UTF8String]);
 +}
 +
 +- (void)webServerDidStart:(GCDWebServer*)server {
 +  [self _logDelegateCall:_cmd];
 +}
 +
 +- (void)webServerDidCompleteBonjourRegistration:(GCDWebServer*)server {
 +  [self _logDelegateCall:_cmd];
 +}
 +
++- (void)webServerDidUpdateNATPortMapping:(GCDWebServer*)server {
++  [self _logDelegateCall:_cmd];
++}
++
 +- (void)webServerDidConnect:(GCDWebServer*)server {
 +  [self _logDelegateCall:_cmd];
 +}
 +
 +- (void)webServerDidDisconnect:(GCDWebServer*)server {
 +  [self _logDelegateCall:_cmd];
 +}
 +
 +- (void)webServerDidStop:(GCDWebServer*)server {
 +  [self _logDelegateCall:_cmd];
 +}
 +
 +- (void)davServer:(GCDWebDAVServer*)server didDownloadFileAtPath:(NSString*)path {
 +  [self _logDelegateCall:_cmd];
 +}
 +
 +- (void)davServer:(GCDWebDAVServer*)server didUploadFileAtPath:(NSString*)path {
 +  [self _logDelegateCall:_cmd];
 +}
 +
 +- (void)davServer:(GCDWebDAVServer*)server didMoveItemFromPath:(NSString*)fromPath toPath:(NSString*)toPath {
 +  [self _logDelegateCall:_cmd];
 +}
 +
 +- (void)davServer:(GCDWebDAVServer*)server didCopyItemFromPath:(NSString*)fromPath toPath:(NSString*)toPath {
 +  [self _logDelegateCall:_cmd];
 +}
 +
 +- (void)davServer:(GCDWebDAVServer*)server didDeleteItemAtPath:(NSString*)path {
 +  [self _logDelegateCall:_cmd];
 +}
 +
 +- (void)davServer:(GCDWebDAVServer*)server didCreateDirectoryAtPath:(NSString*)path {
 +  [self _logDelegateCall:_cmd];
 +}
 +
 +- (void)webUploader:(GCDWebUploader*)uploader didDownloadFileAtPath:(NSString*)path {
 +  [self _logDelegateCall:_cmd];
 +}
 +
 +- (void)webUploader:(GCDWebUploader*)uploader didUploadFileAtPath:(NSString*)path {
 +  [self _logDelegateCall:_cmd];
 +}
 +
 +- (void)webUploader:(GCDWebUploader*)uploader didMoveItemFromPath:(NSString*)fromPath toPath:(NSString*)toPath {
 +  [self _logDelegateCall:_cmd];
 +}
 +
 +- (void)webUploader:(GCDWebUploader*)uploader didDeleteItemAtPath:(NSString*)path {
 +  [self _logDelegateCall:_cmd];
 +}
 +
 +- (void)webUploader:(GCDWebUploader*)uploader didCreateDirectoryAtPath:(NSString*)path {
 +  [self _logDelegateCall:_cmd];
 +}
 +
 +@end
 +
 +int main(int argc, const char* argv[]) {
 +  int result = -1;
 +  @autoreleasepool {
 +    Mode mode = kMode_WebServer;
 +    BOOL recording = NO;
 +    NSString* rootDirectory = NSHomeDirectory();
 +    NSString* testDirectory = nil;
 +    NSString* authenticationMethod = nil;
 +    NSString* authenticationRealm = nil;
 +    NSString* authenticationUser = nil;
 +    NSString* authenticationPassword = nil;
++    BOOL bindToLocalhost = NO;
++    BOOL requestNATPortMapping = NO;
 +    
 +    if (argc == 1) {
-       fprintf(stdout, "Usage: %s [-mode webServer | htmlPage | htmlForm | htmlFileUpload | webDAV | webUploader | streamingResponse | asyncResponse] [-record] [-root directory] [-tests directory] [-authenticationMethod Basic | Digest] [-authenticationRealm realm] [-authenticationUser user] [-authenticationPassword password]\n\n", basename((char*)argv[0]));
++      fprintf(stdout, "Usage: %s [-mode webServer | htmlPage | htmlForm | htmlFileUpload | webDAV | webUploader | streamingResponse | asyncResponse] [-record] [-root directory] [-tests directory] [-authenticationMethod Basic | Digest] [-authenticationRealm realm] [-authenticationUser user] [-authenticationPassword password] [--localhost]\n\n", basename((char*)argv[0]));
 +    } else {
 +      for (int i = 1; i < argc; ++i) {
 +        if (argv[i][0] != '-') {
 +          continue;
 +        }
 +        if (!strcmp(argv[i], "-mode") && (i + 1 < argc)) {
 +          ++i;
 +          if (!strcmp(argv[i], "webServer")) {
 +            mode = kMode_WebServer;
 +          } else if (!strcmp(argv[i], "htmlPage")) {
 +            mode = kMode_HTMLPage;
 +          } else if (!strcmp(argv[i], "htmlForm")) {
 +            mode = kMode_HTMLForm;
 +          } else if (!strcmp(argv[i], "htmlFileUpload")) {
 +            mode = kMode_HTMLFileUpload;
 +          } else if (!strcmp(argv[i], "webDAV")) {
 +            mode = kMode_WebDAV;
 +          } else if (!strcmp(argv[i], "webUploader")) {
 +            mode = kMode_WebUploader;
 +          } else if (!strcmp(argv[i], "streamingResponse")) {
 +            mode = kMode_StreamingResponse;
 +          } else if (!strcmp(argv[i], "asyncResponse")) {
 +            mode = kMode_AsyncResponse;
 +          }
 +        } else if (!strcmp(argv[i], "-record")) {
 +          recording = YES;
 +        } else if (!strcmp(argv[i], "-root") && (i + 1 < argc)) {
 +          ++i;
 +          rootDirectory = [[[NSFileManager defaultManager] stringWithFileSystemRepresentation:argv[i] length:strlen(argv[i])] stringByStandardizingPath];
 +        } else if (!strcmp(argv[i], "-tests") && (i + 1 < argc)) {
 +          ++i;
 +          testDirectory = [[[NSFileManager defaultManager] stringWithFileSystemRepresentation:argv[i] length:strlen(argv[i])] stringByStandardizingPath];
 +        } else if (!strcmp(argv[i], "-authenticationMethod") && (i + 1 < argc)) {
 +          ++i;
 +          authenticationMethod = [NSString stringWithUTF8String:argv[i]];
 +        } else if (!strcmp(argv[i], "-authenticationRealm") && (i + 1 < argc)) {
 +          ++i;
 +          authenticationRealm = [NSString stringWithUTF8String:argv[i]];
 +        } else if (!strcmp(argv[i], "-authenticationUser") && (i + 1 < argc)) {
 +          ++i;
 +          authenticationUser = [NSString stringWithUTF8String:argv[i]];
 +        } else if (!strcmp(argv[i], "-authenticationPassword") && (i + 1 < argc)) {
 +          ++i;
 +          authenticationPassword = [NSString stringWithUTF8String:argv[i]];
++        } else if (!strcmp(argv[i], "--localhost")) {
++          bindToLocalhost = YES;
++        } else if (!strcmp(argv[i], "--nat")) {
++          requestNATPortMapping = YES;
 +        }
 +      }
 +    }
 +    
 +    GCDWebServer* webServer = nil;
 +    switch (mode) {
 +      
 +      // Simply serve contents of home directory
 +      case kMode_WebServer: {
 +        fprintf(stdout, "Running in Web Server mode from \"%s\"", [rootDirectory UTF8String]);
 +        webServer = [[GCDWebServer alloc] init];
 +        [webServer addGETHandlerForBasePath:@"/" directoryPath:rootDirectory indexFilename:nil cacheAge:0 allowRangeRequests:YES];
 +        break;
 +      }
 +      
 +      // Renders a HTML page
 +      case kMode_HTMLPage: {
 +        fprintf(stdout, "Running in HTML Page mode");
 +        webServer = [[GCDWebServer alloc] init];
 +        [webServer addDefaultHandlerForMethod:@"GET"
 +                                 requestClass:[GCDWebServerRequest class]
 +                                 processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) {
 +          
 +          return [GCDWebServerDataResponse responseWithHTML:@"<html><body><p>Hello World</p></body></html>"];
 +          
 +        }];
 +        break;
 +      }
 +      
 +      // Implements an HTML form
 +      case kMode_HTMLForm: {
 +        fprintf(stdout, "Running in HTML Form mode");
 +        webServer = [[GCDWebServer alloc] init];
 +        [webServer addHandlerForMethod:@"GET"
 +                                  path:@"/"
 +                          requestClass:[GCDWebServerRequest class]
 +                          processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) {
 +          
 +          NSString* html = @" \
 +            <html><body> \
 +              <form name=\"input\" action=\"/\" method=\"post\" enctype=\"application/x-www-form-urlencoded\"> \
 +              Value: <input type=\"text\" name=\"value\"> \
 +              <input type=\"submit\" value=\"Submit\"> \
 +              </form> \
 +            </body></html> \
 +          ";
 +          return [GCDWebServerDataResponse responseWithHTML:html];
 +          
 +        }];
 +        [webServer addHandlerForMethod:@"POST"
 +                                  path:@"/"
 +                          requestClass:[GCDWebServerURLEncodedFormRequest class]
 +                          processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) {
 +          
 +          NSString* value = [[(GCDWebServerURLEncodedFormRequest*)request arguments] objectForKey:@"value"];
 +          NSString* html = [NSString stringWithFormat:@"<html><body><p>%@</p></body></html>", value];
 +          return [GCDWebServerDataResponse responseWithHTML:html];
 +          
 +        }];
 +        break;
 +      }
 +      
 +      // Implements HTML file upload
 +      case kMode_HTMLFileUpload: {
 +        fprintf(stdout, "Running in HTML File Upload mode");
 +        webServer = [[GCDWebServer alloc] init];
 +        NSString* formHTML = @" \
 +          <form name=\"input\" action=\"/\" method=\"post\" enctype=\"multipart/form-data\"> \
 +          <input type=\"hidden\" name=\"secret\" value=\"42\"> \
 +          <input type=\"file\" name=\"files\" multiple><br/> \
 +          <input type=\"submit\" value=\"Submit\"> \
 +          </form> \
 +        ";
 +        [webServer addHandlerForMethod:@"GET"
 +                                  path:@"/"
 +                          requestClass:[GCDWebServerRequest class]
 +                          processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) {
 +          
 +          NSString* html = [NSString stringWithFormat:@"<html><body>%@</body></html>", formHTML];
 +          return [GCDWebServerDataResponse responseWithHTML:html];
 +          
 +        }];
 +        [webServer addHandlerForMethod:@"POST"
 +                                  path:@"/"
 +                          requestClass:[GCDWebServerMultiPartFormRequest class]
 +                          processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) {
 +          
 +          NSMutableString* string = [NSMutableString string];
 +          for (GCDWebServerMultiPartArgument* argument in [(GCDWebServerMultiPartFormRequest*)request arguments]) {
 +            [string appendFormat:@"%@ = %@<br>", argument.controlName, argument.string];
 +          }
 +          for (GCDWebServerMultiPartFile* file in [(GCDWebServerMultiPartFormRequest*)request files]) {
 +            NSDictionary* attributes = [[NSFileManager defaultManager] attributesOfItemAtPath:file.temporaryPath error:NULL];
 +            [string appendFormat:@"%@ = &quot;%@&quot; (%@ | %llu %@)<br>", file.controlName, file.fileName, file.mimeType,
 +                                 attributes.fileSize >= 1000 ? attributes.fileSize / 1000 : attributes.fileSize,
 +                                 attributes.fileSize >= 1000 ? @"KB" : @"Bytes"];
 +          };
 +          NSString* html = [NSString stringWithFormat:@"<html><body><p>%@</p><hr>%@</body></html>", string, formHTML];
 +          return [GCDWebServerDataResponse responseWithHTML:html];
 +          
 +        }];
 +        break;
 +      }
 +      
 +      // Serve home directory through WebDAV
 +      case kMode_WebDAV: {
 +        fprintf(stdout, "Running in WebDAV mode from \"%s\"", [rootDirectory UTF8String]);
 +        webServer = [[GCDWebDAVServer alloc] initWithUploadDirectory:rootDirectory];
 +        break;
 +      }
 +      
 +      // Serve home directory through web uploader
 +      case kMode_WebUploader: {
 +        fprintf(stdout, "Running in Web Uploader mode from \"%s\"", [rootDirectory UTF8String]);
 +        webServer = [[GCDWebUploader alloc] initWithUploadDirectory:rootDirectory];
 +        break;
 +      }
 +      
 +      // Test streaming responses
 +      case kMode_StreamingResponse: {
 +        fprintf(stdout, "Running in Streaming Response mode");
 +        webServer = [[GCDWebServer alloc] init];
 +        [webServer addHandlerForMethod:@"GET"
 +                                  path:@"/sync"
 +                          requestClass:[GCDWebServerRequest class]
 +                          processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) {
 +          
 +          __block int countDown = 10;
 +          return [GCDWebServerStreamedResponse responseWithContentType:@"text/plain" streamBlock:^NSData *(NSError** error) {
 +            
 +            usleep(100 * 1000);
 +            if (countDown) {
 +              return [[NSString stringWithFormat:@"%i\n", countDown--] dataUsingEncoding:NSUTF8StringEncoding];
 +            } else {
 +              return [NSData data];
 +            }
 +            
 +          }];
 +          
 +        }];
 +        [webServer addHandlerForMethod:@"GET"
 +                                  path:@"/async"
 +                          requestClass:[GCDWebServerRequest class]
 +                          processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) {
 +          
 +          __block int countDown = 10;
 +          return [GCDWebServerStreamedResponse responseWithContentType:@"text/plain" asyncStreamBlock:^(GCDWebServerBodyReaderCompletionBlock completionBlock) {
 +            
 +            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
 +              
 +              NSData* data = countDown ? [[NSString stringWithFormat:@"%i\n", countDown--] dataUsingEncoding:NSUTF8StringEncoding] : [NSData data];
 +              completionBlock(data, nil);
 +              
 +            });
 +            
 +          }];
 +          
 +        }];
 +        break;
 +      }
 +      
 +      // Test async responses
 +      case kMode_AsyncResponse: {
 +        fprintf(stdout, "Running in Async Response mode");
 +        webServer = [[GCDWebServer alloc] init];
 +        [webServer addHandlerForMethod:@"GET"
-                                   path:@"/"
++                                  path:@"/async"
 +                          requestClass:[GCDWebServerRequest class]
 +                     asyncProcessBlock:^(GCDWebServerRequest* request, GCDWebServerCompletionBlock completionBlock) {
 +          
 +          dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
 +            GCDWebServerDataResponse* response = [GCDWebServerDataResponse responseWithData:[@"Hello World!" dataUsingEncoding:NSUTF8StringEncoding] contentType:@"text/plain"];
 +            completionBlock(response);
 +          });
 +          
 +        }];
++        [webServer addHandlerForMethod:@"GET"
++                                  path:@"/async2"
++                          requestClass:[GCDWebServerRequest class]
++                     asyncProcessBlock:^(GCDWebServerRequest* request, GCDWebServerCompletionBlock handlerCompletionBlock) {
++          
++          dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
++            
++            __block int countDown = 10;
++            GCDWebServerStreamedResponse* response = [GCDWebServerStreamedResponse responseWithContentType:@"text/plain" asyncStreamBlock:^(GCDWebServerBodyReaderCompletionBlock readerCompletionBlock) {
++              
++              dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
++                
++                NSData* data = countDown ? [[NSString stringWithFormat:@"%i\n", countDown--] dataUsingEncoding:NSUTF8StringEncoding] : [NSData data];
++                readerCompletionBlock(data, nil);
++                
++              });
++              
++            }];
++            handlerCompletionBlock(response);
++            
++          });
++          
++        }];
 +        break;
 +      }
 +      
 +    }
 +    
 +    if (webServer) {
 +      Delegate* delegate = [[Delegate alloc] init];
 +      if (testDirectory) {
 +#if DEBUG
 +        webServer.delegate = delegate;
 +#endif
 +        fprintf(stdout, "<RUNNING TESTS FROM \"%s\">\n\n", [testDirectory UTF8String]);
 +        result = (int)[webServer runTestsWithOptions:@{GCDWebServerOption_Port: @8080} inDirectory:testDirectory];
 +      } else {
 +        webServer.delegate = delegate;
 +        if (recording) {
 +          fprintf(stdout, "<RECORDING ENABLED>\n");
 +          webServer.recordingEnabled = YES;
 +        }
 +        fprintf(stdout, "\n");
 +        NSMutableDictionary* options = [NSMutableDictionary dictionary];
 +        [options setObject:@8080 forKey:GCDWebServerOption_Port];
++        [options setObject:@(requestNATPortMapping) forKey:GCDWebServerOption_RequestNATPortMapping];
++        [options setObject:@(bindToLocalhost) forKey:GCDWebServerOption_BindToLocalhost];
 +        [options setObject:@"" forKey:GCDWebServerOption_BonjourName];
 +        if (authenticationUser && authenticationPassword) {
 +          [options setValue:authenticationRealm forKey:GCDWebServerOption_AuthenticationRealm];
 +          [options setObject:@{authenticationUser: authenticationPassword} forKey:GCDWebServerOption_AuthenticationAccounts];
 +          if ([authenticationMethod isEqualToString:@"Basic"]) {
 +            [options setObject:GCDWebServerAuthenticationMethod_Basic forKey:GCDWebServerOption_AuthenticationMethod];
 +          } else if ([authenticationMethod isEqualToString:@"Digest"]) {
 +            [options setObject:GCDWebServerAuthenticationMethod_DigestAccess forKey:GCDWebServerOption_AuthenticationMethod];
 +          }
 +        }
 +        if ([webServer runWithOptions:options error:NULL]) {
 +          result = 0;
 +        }
 +      }
 +      webServer.delegate = nil;
 +    }
 +  }
 +  return result;
 +}

http://git-wip-us.apache.org/repos/asf/cordova-plugins/blob/36f1a43e/local-webserver/src/ios/GCDWebServer/README.md
----------------------------------------------------------------------
diff --cc local-webserver/src/ios/GCDWebServer/README.md
index 357586a,0000000..acaa870
mode 100644,000000..100644
--- a/local-webserver/src/ios/GCDWebServer/README.md
+++ b/local-webserver/src/ios/GCDWebServer/README.md
@@@ -1,444 -1,0 +1,470 @@@
 +Overview
 +========
 +
 +[![Build Status](https://travis-ci.org/swisspol/GCDWebServer.svg?branch=master)](https://travis-ci.org/swisspol/GCDWebServer)
 +[![Version](http://cocoapod-badges.herokuapp.com/v/GCDWebServer/badge.png)](http://cocoadocs.org/docsets/GCDWebServer)
 +[![Platform](http://cocoapod-badges.herokuapp.com/p/GCDWebServer/badge.png)](https://github.com/swisspol/GCDWebServer)
 +[![License](http://img.shields.io/cocoapods/l/GCDWebServer.svg)](LICENSE)
 +
- *ANNOUNCEMENT: If you like GCDWebServer, check out [XLFacility](https://github.com/swisspol/XLFacility), an elegant and powerful logging facility for OS X & iOS by the same author and also open-source. XLFacility can be used seemlessly to handle logging from GCDWebServer (see "Logging in GCDWebServer" below).*
- 
 +GCDWebServer is a modern and lightweight GCD based HTTP 1.1 server designed to be embedded in OS X & iOS apps. It was written from scratch with the following goals in mind:
 +* Elegant and easy to use architecture with only 4 core classes: server, connection, request and response (see "Understanding GCDWebServer's Architecture" below)
 +* Well designed API with fully documented headers for easy integration and customization
 +* Entirely built with an event-driven design using [Grand Central Dispatch](http://en.wikipedia.org/wiki/Grand_Central_Dispatch) for best performance and concurrency
 +* No dependencies on third-party source code
 +* Available under a friendly [New BSD License](LICENSE)
 +
 +Extra built-in features:
 +* Allow implementation of fully asynchronous handlers of incoming HTTP requests
 +* Minimize memory usage with disk streaming of large HTTP request or response bodies
 +* Parser for [web forms](http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4) submitted using "application/x-www-form-urlencoded" or "multipart/form-data" encodings (including file uploads)
 +* [JSON](http://www.json.org/) parsing and serialization for request and response HTTP bodies
 +* [Chunked transfer encoding](https://en.wikipedia.org/wiki/Chunked_transfer_encoding) for request and response HTTP bodies
 +* [HTTP compression](https://en.wikipedia.org/wiki/HTTP_compression) with gzip for request and response HTTP bodies
 +* [HTTP range](https://en.wikipedia.org/wiki/Byte_serving) support for requests of local files
 +* [Basic](https://en.wikipedia.org/wiki/Basic_access_authentication) and [Digest Access](https://en.wikipedia.org/wiki/Digest_access_authentication) authentications for password protection
 +* Automatically handle transitions between foreground, background and suspended modes in iOS apps
 +* Full support for both IPv4 and IPv6
++* NAT port mapping (IPv4 only)
 +
 +Included extensions:
 +* [GCDWebUploader](GCDWebUploader/GCDWebUploader.h): subclass of ```GCDWebServer``` that implements an interface for uploading and downloading files using a web browser
 +* [GCDWebDAVServer](GCDWebDAVServer/GCDWebDAVServer.h): subclass of ```GCDWebServer``` that implements a class 1 [WebDAV](https://en.wikipedia.org/wiki/WebDAV) server (with partial class 2 support for OS X Finder)
 +
 +What's not supported (but not really required from an embedded HTTP server):
 +* Keep-alive connections
 +* HTTPS
 +
 +Requirements:
 +* OS X 10.7 or later (x86_64)
 +* iOS 5.0 or later (armv7, armv7s or arm64)
 +* ARC memory management only (if you need MRC support use GCDWebServer 3.1 and earlier)
 +
 +Getting Started
 +===============
 +
 +Download or check out the [latest release](https://github.com/swisspol/GCDWebServer/releases) of GCDWebServer then add the entire "GCDWebServer" subfolder to your Xcode project. If you intend to use one of the extensions like GCDWebDAVServer or GCDWebUploader, add these subfolders as well.
 +
- Alternatively, you can install GCDWebServer using [CocoaPods](http://cocoapods.org/) by simply adding this line to your Xcode project's Podfile:
++If you add the files directly then (1) link to `libz` (via Target > Build Phases > Link Binary With Libraries) and (2) add `$(SDKROOT)/usr/include/libxml2` to your header search paths (via Target > Build Settings > HEADER_SEARCH_PATHS).
++
++Alternatively, you can install GCDWebServer using [CocoaPods](http://cocoapods.org/) by simply adding this line to your Podfile:
 +```
 +pod "GCDWebServer", "~> 3.0"
 +```
 +If you want to use GCDWebUploader, use this line instead:
 +```
 +pod "GCDWebServer/WebUploader", "~> 3.0"
 +```
 +Or this line for GCDWebDAVServer:
 +```
 +pod "GCDWebServer/WebDAV", "~> 3.0"
 +```
 +
++And finally run `$ pod install`.
++
++You can also use [Carthage](https://github.com/Carthage/Carthage) by adding this line to your Cartfile (3.2.5 is the first release with Carthage support):
++```
++github "swisspol/GCDWebServer" ~> 3.2.5
++```
++
++Then run `$ carthage update` and add the generated frameworks to your Xcode projects (see [Carthage instructions](https://github.com/Carthage/Carthage#adding-frameworks-to-an-application)).
++
++Help & Support
++==============
++
++For help with using GCDWebServer, it's best to ask your question on Stack Overflow with the [`gcdwebserver`](http://stackoverflow.com/questions/tagged/gcdwebserver) tag.
++
++Be sure to read this entire README first though!
++
 +Hello World
 +===========
 +
 +These code snippets show how to implement a custom HTTP server that runs on port 8080 and returns a "Hello World" HTML page to any request. Since GCDWebServer uses GCD blocks to handle requests, no subclassing or delegates are needed, which results in very clean code.
 +
++**IMPORTANT:** If not using CocoaPods, be sure to add the `libz` shared system library to the Xcode target for your app.
++
 +**OS X version (command line tool):**
 +```objectivec
 +#import "GCDWebServer.h"
 +#import "GCDWebServerDataResponse.h"
 +
 +int main(int argc, const char* argv[]) {
 +  @autoreleasepool {
 +    
 +    // Create server
 +    GCDWebServer* webServer = [[GCDWebServer alloc] init];
 +    
 +    // Add a handler to respond to GET requests on any URL
 +    [webServer addDefaultHandlerForMethod:@"GET"
 +                             requestClass:[GCDWebServerRequest class]
 +                             processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) {
 +      
 +      return [GCDWebServerDataResponse responseWithHTML:@"<html><body><p>Hello World</p></body></html>"];
 +      
 +    }];
 +    
 +    // Use convenience method that runs server on port 8080
 +    // until SIGINT (Ctrl-C in Terminal) or SIGTERM is received
 +    [webServer runWithPort:8080 bonjourName:nil];
 +    NSLog(@"Visit %@ in your web browser", webServer.serverURL);
 +    
 +  }
 +  return 0;
 +}
 +```
 +
 +**iOS version:**
 +```objectivec
 +#import "GCDWebServer.h"
 +#import "GCDWebServerDataResponse.h"
 +
 +@interface AppDelegate : NSObject <UIApplicationDelegate> {
 +  GCDWebServer* _webServer;
 +}
 +@end
 +
 +@implementation AppDelegate
 +
 +- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
 +  
 +  // Create server
 +  _webServer = [[GCDWebServer alloc] init];
 +  
 +  // Add a handler to respond to GET requests on any URL
 +  [_webServer addDefaultHandlerForMethod:@"GET"
 +                            requestClass:[GCDWebServerRequest class]
 +                            processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) {
 +    
 +    return [GCDWebServerDataResponse responseWithHTML:@"<html><body><p>Hello World</p></body></html>"];
 +    
 +  }];
 +  
 +  // Start server on port 8080
 +  [_webServer startWithPort:8080 bonjourName:nil];
 +  NSLog(@"Visit %@ in your web browser", _webServer.serverURL);
 +  
 +  return YES;
 +}
 +
 +@end
 +```
 +
 +**OS X Swift version (command line tool):**
 +
 +***webServer.swift***
 +```swift
 +import Foundation
++import GCDWebServers
++
++func initWebServer() {
 +
- let webServer = GCDWebServer()
++    let webServer = GCDWebServer()
 +
- webServer.addDefaultHandlerForMethod("GET", requestClass: GCDWebServerRequest.self) { request in
++    webServer.addDefaultHandlerForMethod("GET", requestClass: GCDWebServerRequest.self, processBlock: {request in
 +    return GCDWebServerDataResponse(HTML:"<html><body><p>Hello World</p></body></html>")
++        
++    })
++    
++    webServer.runWithPort(8080, bonjourName: "GCD Web Server")
++    
++    print("Visit \(webServer.serverURL) in your web browser")
 +}
- 
- webServer.runWithPort(8080, bonjourName: nil)
- 
- println("Visit \(webServer.serverURL) in your web browser")
 +```
 +
 +***WebServer-Bridging-Header.h***
 +```objectivec
- #import "GCDWebServer.h"
- #import "GCDWebServerDataResponse.h"
- ```
- 
- Asynchronous HTTP Responses
- ===========================
- 
- New in GCDWebServer 3.0 is the ability to process HTTP requests aysnchronously i.e. add handlers to the server which generate their ```GCDWebServerResponse``` asynchronously. This is achieved by adding handlers that use a ```GCDWebServerAsyncProcessBlock``` instead of a ```GCDWebServerProcessBlock```. Here's an example:
- 
- **(Synchronous version)** The handler blocks while generating the HTTP response:
- ```objectivec
- [webServer addDefaultHandlerForMethod:@"GET"
-                          requestClass:[GCDWebServerRequest class]
-                          processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) {
-   
-   GCDWebServerDataResponse* response = [GCDWebServerDataResponse responseWithHTML:@"<html><body><p>Hello World</p></body></html>"];
-   return response;
-   
- }];
- ```
- 
- **(Asynchronous version)** The handler returns immediately and calls back GCDWebServer later with the generated HTTP response:
- ```objectivec
- [webServer addDefaultHandlerForMethod:@"GET"
-                          requestClass:[GCDWebServerRequest class]
-                     asyncProcessBlock:^(GCDWebServerRequest* request, GCDWebServerCompletionBlock completionBlock) {
-   
-   // Do some async operation like network access or file I/O (simulated here using dispatch_after())
-   dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
-     GCDWebServerDataResponse* response = [GCDWebServerDataResponse responseWithHTML:@"<html><body><p>Hello World</p></body></html>"];
-     completionBlock(response);
-   });
- 
- }];
- ```
- 
- **(Advanced asynchronous version)** The handler returns immediately a streamed HTTP response which itself generates its contents asynchronously:
- ```objectivec
- [webServer addDefaultHandlerForMethod:@"GET"
-                          requestClass:[GCDWebServerRequest class]
-                     asyncProcessBlock:^(GCDWebServerRequest* request, GCDWebServerCompletionBlock completionBlock) {
-   
-   GCDWebServerStreamedResponse* response = [GCDWebServerStreamedResponse responseWithContentType:@"text/html" asyncStreamBlock:^(GCDWebServerBodyReaderCompletionBlock completionBlock) {
-     
-     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
-       completionBlock([@"<html><body><p>Hello" dataUsingEncoding:NSUTF8StringEncoding], nil);  // Generate the 1st part of the stream data
-       
-       dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
-         completionBlock([@"World</p></body></html>" dataUsingEncoding:NSUTF8StringEncoding], nil);  // Generate the 2nd part of the stream data
-         
-         completionBlock([NSData data], nil);  // Must pass an empty NSData to signal the end of the stream
-        });
-        
-     });
-     
-   }];
-   return response;
- 
- }];
++#import <GCDWebServers/GCDWebServer.h>
++#import <GCDWebServers/GCDWebServerDataResponse.h>
 +```
 +
- *Note that you can even combine both the asynchronous and advanced asynchronous versions to return asynchronously an asynchronous HTTP response!*
- 
 +Web Based Uploads in iOS Apps
 +=============================
 +
 +GCDWebUploader is a subclass of ```GCDWebServer``` that provides a ready-to-use HTML 5 file uploader & downloader. This lets users upload, download, delete files and create directories from a directory inside your iOS app's sandbox using a clean user interface in their web browser.
 +
 +Simply instantiate and run a ```GCDWebUploader``` instance then visit ```http://{YOUR-IOS-DEVICE-IP-ADDRESS}/``` from your web browser:
 +
 +```objectivec
 +#import "GCDWebUploader.h"
 +
 +@interface AppDelegate : NSObject <UIApplicationDelegate> {
 +  GCDWebUploader* _webUploader;
 +}
 +@end
 +
 +@implementation AppDelegate
 +
 +- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
 +  NSString* documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
 +  _webUploader = [[GCDWebUploader alloc] initWithUploadDirectory:documentsPath];
 +  [_webUploader start];
 +  NSLog(@"Visit %@ in your web browser", _webUploader.serverURL);
 +  return YES;
 +}
 +
 +@end
 +```
 +
 +WebDAV Server in iOS Apps
 +=========================
 +
 +GCDWebDAVServer is a subclass of ```GCDWebServer``` that provides a class 1 compliant [WebDAV](https://en.wikipedia.org/wiki/WebDAV) server. This lets users upload, download, delete files and create directories from a directory inside your iOS app's sandbox using any WebDAV client like [Transmit](https://panic.com/transmit/) (Mac), [ForkLift](http://binarynights.com/forklift/) (Mac) or [CyberDuck](http://cyberduck.io/) (Mac / Windows).
 +
 +GCDWebDAVServer should also work with the [OS X Finder](http://support.apple.com/kb/PH13859) as it is partially class 2 compliant (but only when the client is the OS X WebDAV implementation).
 +
 +Simply instantiate and run a ```GCDWebDAVServer``` instance then connect to ```http://{YOUR-IOS-DEVICE-IP-ADDRESS}/``` using a WebDAV client:
 +
 +```objectivec
 +#import "GCDWebDAVServer.h"
 +
 +@interface AppDelegate : NSObject <UIApplicationDelegate> {
 +  GCDWebDAVServer* _davServer;
 +}
 +@end
 +
 +@implementation AppDelegate
 +
 +- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
 +  NSString* documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
 +  _davServer = [[GCDWebDAVServer alloc] initWithUploadDirectory:documentsPath];
 +  [_davServer start];
 +  NSLog(@"Visit %@ in your WebDAV client", _davServer.serverURL);
 +  return YES;
 +}
 +
 +@end
 +```
 +
 +Serving a Static Website
 +========================
 +
 +GCDWebServer includes a built-in handler that can recursively serve a directory (it also lets you control how the ["Cache-Control"](http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9) header should be set):
 +
++**OS X version (command line tool):**
 +```objectivec
 +#import "GCDWebServer.h"
 +
 +int main(int argc, const char* argv[]) {
 +  @autoreleasepool {
 +    
 +    GCDWebServer* webServer = [[GCDWebServer alloc] init];
 +    [webServer addGETHandlerForBasePath:@"/" directoryPath:NSHomeDirectory() indexFilename:nil cacheAge:3600 allowRangeRequests:YES];
 +    [webServer runWithPort:8080];
 +    
 +  }
 +  return 0;
 +}
 +```
 +
 +Using GCDWebServer
 +==================
 +
 +You start by creating an instance of the ```GCDWebServer``` class. Note that you can have multiple web servers running in the same app as long as they listen on different ports.
 +
 +Then you add one or more "handlers" to the server: each handler gets a chance to handle an incoming web request and provide a response. Handlers are called in a LIFO queue, so the latest added handler overrides any previously added ones.
 +
 +Finally you start the server on a given port.
 +
 +Understanding GCDWebServer's Architecture
 +=========================================
 +
 +GCDWebServer's architecture consists of only 4 core classes:
 +* [GCDWebServer](GCDWebServer/Core/GCDWebServer.h) manages the socket that listens for new HTTP connections and the list of handlers used by the server.
 +* [GCDWebServerConnection](GCDWebServer/Core/GCDWebServerConnection.h) is instantiated by ```GCDWebServer``` to handle each new HTTP connection. Each instance stays alive until the connection is closed. You cannot use this class directly, but it is exposed so you can subclass it to override some hooks.
 +* [GCDWebServerRequest](GCDWebServer/Core/GCDWebServerRequest.h) is created by the ```GCDWebServerConnection``` instance after HTTP headers have been received. It wraps the request and handles the HTTP body if any. GCDWebServer comes with [several subclasses](GCDWebServer/Requests) of ```GCDWebServerRequest``` to handle common cases like storing the body in memory or stream it to a file on disk.
 +* [GCDWebServerResponse](GCDWebServer/Core/GCDWebServerResponse.h) is created by the request handler and wraps the response HTTP headers and optional body. GCDWebServer comes with [several subclasses](GCDWebServer/Responses) of ```GCDWebServerResponse``` to handle common cases like HTML text in memory or streaming a file from disk.
 +
 +Implementing Handlers
 +=====================
 +
 +GCDWebServer relies on "handlers" to process incoming web requests and generating responses. Handlers are implemented with GCD blocks which makes it very easy to provide your owns. However, they are executed on arbitrary threads within GCD so __special attention must be paid to thread-safety and re-entrancy__.
 +
 +Handlers require 2 GCD blocks:
 +* The ```GCDWebServerMatchBlock``` is called on every handler added to the ```GCDWebServer``` instance whenever a web request has started (i.e. HTTP headers have been received). It is passed the basic info for the web request (HTTP method, URL, headers...) and must decide if it wants to handle it or not. If yes, it must return a new ```GCDWebServerRequest``` instance (see above) created with this info. Otherwise, it simply returns nil.
 +* The ```GCDWebServerProcessBlock``` or ```GCDWebServerAsyncProcessBlock``` is called after the web request has been fully received and is passed the ```GCDWebServerRequest``` instance created at the previous step. It must return synchronously (if using ```GCDWebServerProcessBlock```) or asynchronously (if using ```GCDWebServerAsyncProcessBlock```) a ```GCDWebServerResponse``` instance (see above) or nil on error, which will result in a 500 HTTP status code returned to the client. It's however recommended to return an instance of [GCDWebServerErrorResponse](GCDWebServer/Responses/GCDWebServerErrorResponse.h) on error so more useful information can be returned to the client.
 +
 +Note that most methods on ```GCDWebServer``` to add handlers only require the ```GCDWebServerProcessBlock``` or ```GCDWebServerAsyncProcessBlock``` as they already provide a built-in ```GCDWebServerMatchBlock``` e.g. to match a URL path with a Regex.
 +
++Asynchronous HTTP Responses
++===========================
++
++New in GCDWebServer 3.0 is the ability to process HTTP requests aysnchronously i.e. add handlers to the server which generate their ```GCDWebServerResponse``` asynchronously. This is achieved by adding handlers that use a ```GCDWebServerAsyncProcessBlock``` instead of a ```GCDWebServerProcessBlock```. Here's an example:
++
++**(Synchronous version)** The handler blocks while generating the HTTP response:
++```objectivec
++[webServer addDefaultHandlerForMethod:@"GET"
++                         requestClass:[GCDWebServerRequest class]
++                         processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) {
++  
++  GCDWebServerDataResponse* response = [GCDWebServerDataResponse responseWithHTML:@"<html><body><p>Hello World</p></body></html>"];
++  return response;
++  
++}];
++```
++
++**(Asynchronous version)** The handler returns immediately and calls back GCDWebServer later with the generated HTTP response:
++```objectivec
++[webServer addDefaultHandlerForMethod:@"GET"
++                         requestClass:[GCDWebServerRequest class]
++                    asyncProcessBlock:^(GCDWebServerRequest* request, GCDWebServerCompletionBlock completionBlock) {
++  
++  // Do some async operation like network access or file I/O (simulated here using dispatch_after())
++  dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
++    GCDWebServerDataResponse* response = [GCDWebServerDataResponse responseWithHTML:@"<html><body><p>Hello World</p></body></html>"];
++    completionBlock(response);
++  });
++
++}];
++```
++
++**(Advanced asynchronous version)** The handler returns immediately a streamed HTTP response which itself generates its contents asynchronously:
++```objectivec
++[webServer addDefaultHandlerForMethod:@"GET"
++                         requestClass:[GCDWebServerRequest class]
++                         processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) {
++  
++  NSMutableArray* contents = [NSMutableArray arrayWithObjects:@"<html><body><p>\n", @"Hello World!\n", @"</p></body></html>\n", nil];  // Fake data source we are reading from
++  GCDWebServerStreamedResponse* response = [GCDWebServerStreamedResponse responseWithContentType:@"text/html" asyncStreamBlock:^(GCDWebServerBodyReaderCompletionBlock completionBlock) {
++    
++    // Simulate a delay reading from the fake data source
++    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
++      NSString* string = contents.firstObject;
++      if (string) {
++        [contents removeObjectAtIndex:0];
++        completionBlock([string dataUsingEncoding:NSUTF8StringEncoding], nil);  // Generate the 2nd part of the stream data
++      } else {
++        completionBlock([NSData data], nil);  // Must pass an empty NSData to signal the end of the stream
++      }
++    });
++    
++  }];
++  return response;
++  
++}];
++```
++
++*Note that you can even combine both the asynchronous and advanced asynchronous versions to return asynchronously an asynchronous HTTP response!*
++
 +GCDWebServer & Background Mode for iOS Apps
 +===========================================
 +
 +When doing networking operations in iOS apps, you must handle carefully [what happens when iOS puts the app in the background](https://developer.apple.com/library/ios/technotes/tn2277/_index.html). Typically you must stop any network servers while the app is in the background and restart them when the app comes back to the foreground. This can become quite complex considering servers might have ongoing connections when they need to be stopped.
 +
 +Fortunately, GCDWebServer does all of this automatically for you:
 +- GCDWebServer begins a [background task](https://developer.apple.com/library/ios/documentation/iphone/conceptual/iphoneosprogrammingguide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html) whenever the first HTTP connection is opened and ends it only when the last one is closed. This prevents iOS from suspending the app after it goes in the background, which would immediately kill HTTP connections to the client.
 + - While the app is in the background, as long as new HTTP connections keep being initiated, the background task will continue to exist and iOS will not suspend the app (unless under sudden and unexpected memory pressure).
 + - If the app is still in the background when the last HTTP connection is closed, GCDWebServer will suspend itself and stop accepting new connections as if you had called ```-stop``` (this behavior can be disabled with the ```GCDWebServerOption_AutomaticallySuspendInBackground``` option).
 +- If the app goes in the background while no HTTP connections are opened, GCDWebServer will immediately suspend itself and stop accepting new connections as if you had called ```-stop``` (this behavior can be disabled with the ```GCDWebServerOption_AutomaticallySuspendInBackground``` option).
 +- If the app comes back to the foreground and GCDWebServer had been suspended, it will automatically resume itself and start accepting again new HTTP connections as if you had called ```-start```.
 +
 +HTTP connections are often initiated in batches (or bursts), for instance when loading a web page with multiple resources. This makes it difficult to accurately detect when the *very last* HTTP connection has been closed: it's possible 2 consecutive HTTP connections part of the same batch would be separated by a small delay instead of overlapping. It would be bad for the client if GCDWebServer suspended itself right in between. The ```GCDWebServerOption_ConnectedStateCoalescingInterval``` option solves this problem elegantly by forcing GCDWebServer to wait some extra delay before performing any action after the last HTTP connection has been closed, just in case a new HTTP connection is initiated within this delay.
 +
 +Logging in GCDWebServer
 +=======================
 +
 +Both for debugging and informational purpose, GCDWebServer logs messages extensively whenever something happens. Furthermore, when building GCDWebServer in "Debug" mode versus "Release" mode, it logs even more information but also performs a number of internal consistency checks. To enable this behavior, define the preprocessor constant ```DEBUG=1``` when compiling GCDWebServer. In Xcode target settings, this can be done by adding ```DEBUG=1``` to the build setting ```GCC_PREPROCESSOR_DEFINITIONS``` when building in "Debug" configuration. Finally, you can also control the logging verbosity at run time by calling ```+[GCDWebServer setLogLevel:]```.
 +
 +By default, all messages logged by GCDWebServer are sent to its built-in logging facility, which simply outputs to ```stderr``` (assuming a terminal type device is connected). In order to better integrate with the rest of your app or because of the amount of information logged, you might want to use another logging facility.
 +
 +GCDWebServer has automatic support for [XLFacility](https://github.com/swisspol/XLFacility) (by the same author as GCDWebServer and also open-source) and [CocoaLumberjack](https://github.com/CocoaLumberjack/CocoaLumberjack). If either of them is in the same Xcode project, GCDWebServer should use it automatically instead of the built-in logging facility (see [GCDWebServerPrivate.h](GCDWebServer/Core/GCDWebServerPrivate.h) for the implementation details).
 +
 +It's also possible to use a custom logging facility - see [GCDWebServer.h](GCDWebServer/Core/GCDWebServer.h) for more information.
 +
 +Advanced Example 1: Implementing HTTP Redirects
 +===============================================
 +
 +Here's an example handler that redirects "/" to "/index.html" using the convenience method on ```GCDWebServerResponse``` (it sets the HTTP status code and "Location" header automatically):
 +
 +```objectivec
 +[self addHandlerForMethod:@"GET"
 +                     path:@"/"
 +             requestClass:[GCDWebServerRequest class]
 +             processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) {
 +    
 +  return [GCDWebServerResponse responseWithRedirect:[NSURL URLWithString:@"index.html" relativeToURL:request.URL]
 +                                          permanent:NO];
 +    
 +}];
 +```
 +
 +Advanced Example 2: Implementing Forms
 +======================================
 +
 +To implement an HTTP form, you need a pair of handlers:
 +* The GET handler does not expect any body in the HTTP request and therefore uses the ```GCDWebServerRequest``` class. The handler generates a response containing a simple HTML form.
 +* The POST handler expects the form values to be in the body of the HTTP request and percent-encoded. Fortunately, GCDWebServer provides the request class ```GCDWebServerURLEncodedFormRequest``` which can automatically parse such bodies. The handler simply echoes back the value from the user submitted form.
 +
 +```objectivec
 +[webServer addHandlerForMethod:@"GET"
 +                          path:@"/"
 +                  requestClass:[GCDWebServerRequest class]
 +                  processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) {
 +  
 +  NSString* html = @" \
 +    <html><body> \
 +      <form name=\"input\" action=\"/\" method=\"post\" enctype=\"application/x-www-form-urlencoded\"> \
 +      Value: <input type=\"text\" name=\"value\"> \
 +      <input type=\"submit\" value=\"Submit\"> \
 +      </form> \
 +    </body></html> \
 +  ";
 +  return [GCDWebServerDataResponse responseWithHTML:html];
 +  
 +}];
 +
 +[webServer addHandlerForMethod:@"POST"
 +                          path:@"/"
 +                  requestClass:[GCDWebServerURLEncodedFormRequest class]
 +                  processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) {
 +  
 +  NSString* value = [[(GCDWebServerURLEncodedFormRequest*)request arguments] objectForKey:@"value"];
 +  NSString* html = [NSString stringWithFormat:@"<html><body><p>%@</p></body></html>", value];
 +  return [GCDWebServerDataResponse responseWithHTML:html];
 +  
 +}];
 +```
 +
 +Advanced Example 3: Serving a Dynamic Website
 +=============================================
 +
 +GCDWebServer provides an extension to the ```GCDWebServerDataResponse``` class that can return HTML content generated from a template and a set of variables (using the format ```%variable%```). It is a very basic template system and is really intended as a starting point to building more advanced template systems by subclassing ```GCDWebServerResponse```.
 +
 +Assuming you have a website directory in your app containing HTML template files along with the corresponding CSS, scripts and images, it's pretty easy to turn it into a dynamic website:
 +
 +```objectivec
 +// Get the path to the website directory
 +NSString* websitePath = [[NSBundle mainBundle] pathForResource:@"Website" ofType:nil];
 +
 +// Add a default handler to serve static files (i.e. anything other than HTML files)
 +[self addGETHandlerForBasePath:@"/" directoryPath:websitePath indexFilename:nil cacheAge:3600 allowRangeRequests:YES];
 +
 +// Add an override handler for all requests to "*.html" URLs to do the special HTML templatization
 +[self addHandlerForMethod:@"GET"
 +                pathRegex:@"/.*\.html"
 +             requestClass:[GCDWebServerRequest class]
 +             processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) {
 +    
 +    NSDictionary* variables = [NSDictionary dictionaryWithObjectsAndKeys:@"value", @"variable", nil];
 +    return [GCDWebServerDataResponse responseWithHTMLTemplate:[websitePath stringByAppendingPathComponent:request.path]
 +                                                    variables:variables];
 +    
 +}];
 +
 +// Add an override handler to redirect "/" URL to "/index.html"
 +[self addHandlerForMethod:@"GET"
 +                     path:@"/"
 +             requestClass:[GCDWebServerRequest class]
 +             processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) {
 +    
 +    return [GCDWebServerResponse responseWithRedirect:[NSURL URLWithString:@"index.html" relativeToURL:request.URL]
 +                                            permanent:NO];
 +    
 +];
 +
 +```
 +
 +Final Example: File Downloads and Uploads From iOS App
 +======================================================
 +
 +GCDWebServer was originally written for the [ComicFlow](http://itunes.apple.com/us/app/comicflow/id409290355?mt=8) comic reader app for iPad. It allow users to connect to their iPad with their web browser over WiFi and then upload, download and organize comic files inside the app.
 +
 +ComicFlow is [entirely open-source](https://github.com/swisspol/ComicFlow) and you can see how it uses GCDWebServer in the [WebServer.h](https://github.com/swisspol/ComicFlow/blob/master/Classes/WebServer.h) and [WebServer.m](https://github.com/swisspol/ComicFlow/blob/master/Classes/WebServer.m) files.

http://git-wip-us.apache.org/repos/asf/cordova-plugins/blob/36f1a43e/local-webserver/src/ios/GCDWebServer/Run-Tests.sh
----------------------------------------------------------------------
diff --cc local-webserver/src/ios/GCDWebServer/Run-Tests.sh
index 1bfa0af,0000000..0e180fe
mode 100755,000000..100755
--- a/local-webserver/src/ios/GCDWebServer/Run-Tests.sh
+++ b/local-webserver/src/ios/GCDWebServer/Run-Tests.sh
@@@ -1,60 -1,0 +1,72 @@@
 +#!/bin/bash -ex
 +
 +OSX_SDK="macosx"
- if [ -z "$TRAVIS" ]; then
-   IOS_SDK="iphoneos"
- else
-   IOS_SDK="iphonesimulator"
- fi
++IOS_SDK="iphonesimulator"
++TVOS_SDK="appletvsimulator"
++
++OSX_SDK_VERSION=`xcodebuild -version -sdk | grep -A 1 '^MacOSX' | tail -n 1 |  awk '{ print $2 }'`
++IOS_SDK_VERSION=`xcodebuild -version -sdk | grep -A 1 '^iPhoneOS' | tail -n 1 |  awk '{ print $2 }'`
++TVOS_SDK_VERSION=`xcodebuild -version -sdk | grep -A 1 '^AppleTVOS' | tail -n 1 |  awk '{ print $2 }'`
 +
 +OSX_TARGET="GCDWebServer (Mac)"
 +IOS_TARGET="GCDWebServer (iOS)"
++TVOS_TARGET="GCDWebServer (tvOS)"
 +CONFIGURATION="Release"
 +
++OSX_TEST_SCHEME="GCDWebServers (Mac)"
++
 +BUILD_DIR="/tmp/GCDWebServer-Build"
 +PRODUCT="$BUILD_DIR/$CONFIGURATION/GCDWebServer"
 +
 +PAYLOAD_ZIP="Tests/Payload.zip"
 +PAYLOAD_DIR="/tmp/GCDWebServer-Payload"
 +
 +function runTests {
 +  rm -rf "$PAYLOAD_DIR"
 +  ditto -x -k "$PAYLOAD_ZIP" "$PAYLOAD_DIR"
 +  TZ=GMT find "$PAYLOAD_DIR" -type d -exec SetFile -d "1/1/2014 00:00:00" -m "1/1/2014 00:00:00" '{}' \;  # ZIP archives do not preserve directories dates
 +  if [ "$4" != "" ]; then
 +    cp -f "$4" "$PAYLOAD_DIR/Payload"
 +    pushd "$PAYLOAD_DIR/Payload"
-     SetFile -d "1/1/2014 00:00:00" -m "1/1/2014 00:00:00" `basename "$4"`
++    TZ=GMT SetFile -d "1/1/2014 00:00:00" -m "1/1/2014 00:00:00" `basename "$4"`
 +    popd
 +  fi
 +  logLevel=2 $1 -mode "$2" -root "$PAYLOAD_DIR/Payload" -tests "$3"
 +}
 +
- # Build for iOS for oldest deployment target (TODO: run tests on iOS)
- rm -rf "$BUILD_DIR"
- xcodebuild -sdk "$IOS_SDK" -target "$IOS_TARGET" -configuration "$CONFIGURATION" build "SYMROOT=$BUILD_DIR" "IPHONEOS_DEPLOYMENT_TARGET=5.1.1" > /dev/null
- 
- # Build for iOS for default deployment target (TODO: run tests on iOS)
++# Run built-in OS X tests
 +rm -rf "$BUILD_DIR"
- xcodebuild -sdk "$IOS_SDK" -target "$IOS_TARGET" -configuration "$CONFIGURATION" build "SYMROOT=$BUILD_DIR" > /dev/null
++xcodebuild test -scheme "$OSX_TEST_SCHEME" "SYMROOT=$BUILD_DIR"
 +
- # Build for OS X for oldest deployment target
++# Build for OS X for oldest supported deployment target
 +rm -rf "$BUILD_DIR"
- xcodebuild -sdk "$OSX_SDK" -target "$OSX_TARGET" -configuration "$CONFIGURATION" build "SYMROOT=$BUILD_DIR" "MACOSX_DEPLOYMENT_TARGET=10.7" > /dev/null
- 
- # Build for OS X for default deployment target
- rm -rf "$BUILD_DIR"
- xcodebuild -sdk "$OSX_SDK" -target "$OSX_TARGET" -configuration "$CONFIGURATION" build "SYMROOT=$BUILD_DIR" > /dev/null
++xcodebuild build -sdk "$OSX_SDK" -target "$OSX_TARGET" -configuration "$CONFIGURATION" "SYMROOT=$BUILD_DIR" "MACOSX_DEPLOYMENT_TARGET=10.7" > /dev/null
 +
 +# Run tests
 +runTests $PRODUCT "htmlForm" "Tests/HTMLForm"
 +runTests $PRODUCT "htmlFileUpload" "Tests/HTMLFileUpload"
 +runTests $PRODUCT "webServer" "Tests/WebServer"
 +runTests $PRODUCT "webDAV" "Tests/WebDAV-Transmit"
 +runTests $PRODUCT "webDAV" "Tests/WebDAV-Cyberduck"
 +runTests $PRODUCT "webDAV" "Tests/WebDAV-Finder"
 +runTests $PRODUCT "webUploader" "Tests/WebUploader"
 +runTests $PRODUCT "webServer" "Tests/WebServer-Sample-Movie" "Tests/Sample-Movie.mp4"
 +
++# Build for OS X for current deployment target
++rm -rf "$BUILD_DIR"
++xcodebuild build -sdk "$OSX_SDK" -target "$OSX_TARGET" -configuration "$CONFIGURATION" "SYMROOT=$BUILD_DIR" "MACOSX_DEPLOYMENT_TARGET=$OSX_SDK_VERSION" > /dev/null
++
++# Build for iOS for oldest supported deployment target
++rm -rf "$BUILD_DIR"
++xcodebuild build -sdk "$IOS_SDK" -target "$IOS_TARGET" -configuration "$CONFIGURATION" "SYMROOT=$BUILD_DIR" "IPHONEOS_DEPLOYMENT_TARGET=6.0" > /dev/null
++
++# Build for iOS for current deployment target
++rm -rf "$BUILD_DIR"
++xcodebuild build -sdk "$IOS_SDK" -target "$IOS_TARGET" -configuration "$CONFIGURATION" "SYMROOT=$BUILD_DIR" "IPHONEOS_DEPLOYMENT_TARGET=$IOS_SDK_VERSION" > /dev/null
++
++# Build for tvOS for current deployment target
++rm -rf "$BUILD_DIR"
++xcodebuild build -sdk "$TVOS_SDK" -target "$TVOS_TARGET" -configuration "$CONFIGURATION" "SYMROOT=$BUILD_DIR" "TVOS_DEPLOYMENT_TARGET=$TVOS_SDK_VERSION" > /dev/null
++
 +# Done
 +echo "\nAll tests completed successfully!"

http://git-wip-us.apache.org/repos/asf/cordova-plugins/blob/36f1a43e/local-webserver/src/ios/GCDWebServer/Tests/WebDAV-Finder/059-206.response
----------------------------------------------------------------------
diff --cc local-webserver/src/ios/GCDWebServer/Tests/WebDAV-Finder/059-206.response
index 0000000,0000000..a2a7c8c
new file mode 100755
Binary files differ

http://git-wip-us.apache.org/repos/asf/cordova-plugins/blob/36f1a43e/local-webserver/src/ios/GCDWebServer/Tests/WebDAV-Finder/062-206.response
----------------------------------------------------------------------
diff --cc local-webserver/src/ios/GCDWebServer/Tests/WebDAV-Finder/062-206.response
index 0000000,0000000..79f364e
new file mode 100644
Binary files differ

http://git-wip-us.apache.org/repos/asf/cordova-plugins/blob/36f1a43e/local-webserver/src/ios/GCDWebServer/Tests/WebServer-Sample-Movie/001-200.response
----------------------------------------------------------------------
diff --cc local-webserver/src/ios/GCDWebServer/Tests/WebServer-Sample-Movie/001-200.response
index 3344d49,0000000..953d958
mode 100644,000000..100644
Binary files differ

http://git-wip-us.apache.org/repos/asf/cordova-plugins/blob/36f1a43e/local-webserver/src/ios/GCDWebServer/Tests/WebServer-Sample-Movie/002-206.response
----------------------------------------------------------------------
diff --cc local-webserver/src/ios/GCDWebServer/Tests/WebServer-Sample-Movie/002-206.response
index 5296802,0000000..ca8f3b6
mode 100644,000000..100644
Binary files differ

http://git-wip-us.apache.org/repos/asf/cordova-plugins/blob/36f1a43e/local-webserver/src/ios/GCDWebServer/Tests/WebServer-Sample-Movie/003-206.response
----------------------------------------------------------------------
diff --cc local-webserver/src/ios/GCDWebServer/Tests/WebServer-Sample-Movie/003-206.response
index f823c94,0000000..78c6926
mode 100644,000000..100644
Binary files differ

http://git-wip-us.apache.org/repos/asf/cordova-plugins/blob/36f1a43e/local-webserver/src/ios/GCDWebServer/Tests/WebServer-Sample-Movie/004-206.response
----------------------------------------------------------------------
diff --cc local-webserver/src/ios/GCDWebServer/Tests/WebServer-Sample-Movie/004-206.response
index b2d31d6,0000000..d401592
mode 100644,000000..100644
Binary files differ

http://git-wip-us.apache.org/repos/asf/cordova-plugins/blob/36f1a43e/local-webserver/src/ios/GCDWebServer/Tests/WebServer-Sample-Movie/005-206.response
----------------------------------------------------------------------
diff --cc local-webserver/src/ios/GCDWebServer/Tests/WebServer-Sample-Movie/005-206.response
index ed217a4,0000000..39bbfa5
mode 100644,000000..100644
Binary files differ

http://git-wip-us.apache.org/repos/asf/cordova-plugins/blob/36f1a43e/local-webserver/src/ios/GCDWebServer/iOS/AppDelegate.h
----------------------------------------------------------------------
diff --cc local-webserver/src/ios/GCDWebServer/iOS/AppDelegate.h
index eee7618,0000000..8b0876f
mode 100644,000000..100644
--- a/local-webserver/src/ios/GCDWebServer/iOS/AppDelegate.h
+++ b/local-webserver/src/ios/GCDWebServer/iOS/AppDelegate.h
@@@ -1,32 -1,0 +1,32 @@@
 +/*
-  Copyright (c) 2012-2014, Pierre-Olivier Latour
++ Copyright (c) 2012-2015, Pierre-Olivier Latour
 + All rights reserved.
 + 
 + Redistribution and use in source and binary forms, with or without
 + modification, are permitted provided that the following conditions are met:
 + * Redistributions of source code must retain the above copyright
 + notice, this list of conditions and the following disclaimer.
 + * Redistributions in binary form must reproduce the above copyright
 + notice, this list of conditions and the following disclaimer in the
 + documentation and/or other materials provided with the distribution.
 + * The name of Pierre-Olivier Latour may not be used to endorse
 + or promote products derived from this software without specific
 + prior written permission.
 + 
 + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 + DISCLAIMED. IN NO EVENT SHALL PIERRE-OLIVIER LATOUR BE LIABLE FOR ANY
 + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 + */
 +
 +#import <UIKit/UIKit.h>
 +
 +@interface AppDelegate : UIResponder <UIApplicationDelegate>
- @property(retain, nonatomic) UIWindow* window;
++@property(strong, nonatomic) UIWindow* window;
 +@end

http://git-wip-us.apache.org/repos/asf/cordova-plugins/blob/36f1a43e/local-webserver/src/ios/GCDWebServer/iOS/AppDelegate.m
----------------------------------------------------------------------
diff --cc local-webserver/src/ios/GCDWebServer/iOS/AppDelegate.m
index 2058768,0000000..bfd0518
mode 100644,000000..100644
--- a/local-webserver/src/ios/GCDWebServer/iOS/AppDelegate.m
+++ b/local-webserver/src/ios/GCDWebServer/iOS/AppDelegate.m
@@@ -1,70 -1,0 +1,36 @@@
 +/*
-  Copyright (c) 2012-2014, Pierre-Olivier Latour
++ Copyright (c) 2012-2015, Pierre-Olivier Latour
 + All rights reserved.
 + 
 + Redistribution and use in source and binary forms, with or without
 + modification, are permitted provided that the following conditions are met:
 + * Redistributions of source code must retain the above copyright
 + notice, this list of conditions and the following disclaimer.
 + * Redistributions in binary form must reproduce the above copyright
 + notice, this list of conditions and the following disclaimer in the
 + documentation and/or other materials provided with the distribution.
 + * The name of Pierre-Olivier Latour may not be used to endorse
 + or promote products derived from this software without specific
 + prior written permission.
 + 
 + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 + DISCLAIMED. IN NO EVENT SHALL PIERRE-OLIVIER LATOUR BE LIABLE FOR ANY
 + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 + */
 +
 +#import "AppDelegate.h"
- #import "GCDWebUploader.h"
- 
- @interface AppDelegate () <GCDWebUploaderDelegate> {
- @private
-   GCDWebUploader* _webServer;
- }
- @end
 +
 +@implementation AppDelegate
 +
 +- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
-   CGRect bounds = ([UIScreen instancesRespondToSelector:@selector(nativeBounds)] ? [[UIScreen mainScreen] nativeBounds] : [[UIScreen mainScreen] bounds]);
-   _window = [[UIWindow alloc] initWithFrame:bounds];
-   _window.backgroundColor = [UIColor whiteColor];
-   [_window makeKeyAndVisible];
-   
-   NSString* documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
-   _webServer = [[GCDWebUploader alloc] initWithUploadDirectory:documentsPath];
-   _webServer.delegate = self;
-   _webServer.allowHiddenItems = YES;
-   [_webServer start];
-   
 +  return YES;
 +}
 +
- - (void)webUploader:(GCDWebUploader*)uploader didUploadFileAtPath:(NSString*)path {
-   NSLog(@"[UPLOAD] %@", path);
- }
- 
- - (void)webUploader:(GCDWebUploader*)uploader didMoveItemFromPath:(NSString*)fromPath toPath:(NSString*)toPath {
-   NSLog(@"[MOVE] %@ -> %@", fromPath, toPath);
- }
- 
- - (void)webUploader:(GCDWebUploader*)uploader didDeleteItemAtPath:(NSString*)path {
-   NSLog(@"[DELETE] %@", path);
- }
- 
- - (void)webUploader:(GCDWebUploader*)uploader didCreateDirectoryAtPath:(NSString*)path {
-   NSLog(@"[CREATE] %@", path);
- }
- 
 +@end

http://git-wip-us.apache.org/repos/asf/cordova-plugins/blob/36f1a43e/local-webserver/src/ios/GCDWebServer/iOS/Assets.xcassets/AppIcon.appiconset/Contents.json
----------------------------------------------------------------------
diff --cc local-webserver/src/ios/GCDWebServer/iOS/Assets.xcassets/AppIcon.appiconset/Contents.json
index 0000000,0000000..36d2c80
new file mode 100644
--- /dev/null
+++ b/local-webserver/src/ios/GCDWebServer/iOS/Assets.xcassets/AppIcon.appiconset/Contents.json
@@@ -1,0 -1,0 +1,68 @@@
++{
++  "images" : [
++    {
++      "idiom" : "iphone",
++      "size" : "29x29",
++      "scale" : "2x"
++    },
++    {
++      "idiom" : "iphone",
++      "size" : "29x29",
++      "scale" : "3x"
++    },
++    {
++      "idiom" : "iphone",
++      "size" : "40x40",
++      "scale" : "2x"
++    },
++    {
++      "idiom" : "iphone",
++      "size" : "40x40",
++      "scale" : "3x"
++    },
++    {
++      "idiom" : "iphone",
++      "size" : "60x60",
++      "scale" : "2x"
++    },
++    {
++      "idiom" : "iphone",
++      "size" : "60x60",
++      "scale" : "3x"
++    },
++    {
++      "idiom" : "ipad",
++      "size" : "29x29",
++      "scale" : "1x"
++    },
++    {
++      "idiom" : "ipad",
++      "size" : "29x29",
++      "scale" : "2x"
++    },
++    {
++      "idiom" : "ipad",
++      "size" : "40x40",
++      "scale" : "1x"
++    },
++    {
++      "idiom" : "ipad",
++      "size" : "40x40",
++      "scale" : "2x"
++    },
++    {
++      "idiom" : "ipad",
++      "size" : "76x76",
++      "scale" : "1x"
++    },
++    {
++      "idiom" : "ipad",
++      "size" : "76x76",
++      "scale" : "2x"
++    }
++  ],
++  "info" : {
++    "version" : 1,
++    "author" : "xcode"
++  }
++}

http://git-wip-us.apache.org/repos/asf/cordova-plugins/blob/36f1a43e/local-webserver/src/ios/GCDWebServer/iOS/Base.lproj/LaunchScreen.storyboard
----------------------------------------------------------------------
diff --cc local-webserver/src/ios/GCDWebServer/iOS/Base.lproj/LaunchScreen.storyboard
index 0000000,0000000..8158318
new file mode 100644
--- /dev/null
+++ b/local-webserver/src/ios/GCDWebServer/iOS/Base.lproj/LaunchScreen.storyboard
@@@ -1,0 -1,0 +1,28 @@@
++<?xml version="1.0" encoding="UTF-8" standalone="no"?>
++<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="9059" systemVersion="14F1021" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" initialViewController="01J-lp-oVM">
++    <dependencies>
++        <deployment identifier="iOS"/>
++        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9049"/>
++    </dependencies>
++    <scenes>
++        <!--View Controller-->
++        <scene sceneID="EHf-IW-A2E">
++            <objects>
++                <viewController id="01J-lp-oVM" sceneMemberID="viewController">
++                    <layoutGuides>
++                        <viewControllerLayoutGuide type="top" id="Llm-lL-Icb"/>
++                        <viewControllerLayoutGuide type="bottom" id="xb3-aO-Qok"/>
++                    </layoutGuides>
++                    <view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
++                        <rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
++                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
++                        <animations/>
++                        <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
++                    </view>
++                </viewController>
++                <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
++            </objects>
++            <point key="canvasLocation" x="53" y="375"/>
++        </scene>
++    </scenes>
++</document>

http://git-wip-us.apache.org/repos/asf/cordova-plugins/blob/36f1a43e/local-webserver/src/ios/GCDWebServer/iOS/Base.lproj/Main.storyboard
----------------------------------------------------------------------
diff --cc local-webserver/src/ios/GCDWebServer/iOS/Base.lproj/Main.storyboard
index 0000000,0000000..ad3b119
new file mode 100644
--- /dev/null
+++ b/local-webserver/src/ios/GCDWebServer/iOS/Base.lproj/Main.storyboard
@@@ -1,0 -1,0 +1,41 @@@
++<?xml version="1.0" encoding="UTF-8" standalone="no"?>
++<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="9059" systemVersion="14F1021" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BYZ-38-t0r">
++    <dependencies>
++        <deployment identifier="iOS"/>
++        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9049"/>
++    </dependencies>
++    <scenes>
++        <!--View Controller-->
++        <scene sceneID="tne-QT-ifu">
++            <objects>
++                <viewController id="BYZ-38-t0r" customClass="ViewController" sceneMemberID="viewController">
++                    <layoutGuides>
++                        <viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/>
++                        <viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/>
++                    </layoutGuides>
++                    <view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
++                        <rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
++                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
++                        <subviews>
++                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="fqi-2H-Bq5">
++                                <rect key="frame" x="279" y="290" width="42" height="21"/>
++                                <fontDescription key="fontDescription" type="system" pointSize="17"/>
++                                <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
++                                <nil key="highlightedColor"/>
++                            </label>
++                        </subviews>
++                        <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
++                        <constraints>
++                            <constraint firstItem="fqi-2H-Bq5" firstAttribute="centerY" secondItem="8bC-Xf-vdC" secondAttribute="centerY" id="fQm-a5-p9Z"/>
++                            <constraint firstItem="fqi-2H-Bq5" firstAttribute="centerX" secondItem="8bC-Xf-vdC" secondAttribute="centerX" id="vB0-cp-Fhd"/>
++                        </constraints>
++                    </view>
++                    <connections>
++                        <outlet property="label" destination="fqi-2H-Bq5" id="maJ-eb-cCq"/>
++                    </connections>
++                </viewController>
++                <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
++            </objects>
++        </scene>
++    </scenes>
++</document>

http://git-wip-us.apache.org/repos/asf/cordova-plugins/blob/36f1a43e/local-webserver/src/ios/GCDWebServer/iOS/Info.plist
----------------------------------------------------------------------
diff --cc local-webserver/src/ios/GCDWebServer/iOS/Info.plist
index 2645b2c,0000000..1f083fb
mode 100644,000000..100644
--- a/local-webserver/src/ios/GCDWebServer/iOS/Info.plist
+++ b/local-webserver/src/ios/GCDWebServer/iOS/Info.plist
@@@ -1,43 -1,0 +1,45 @@@
 +<?xml version="1.0" encoding="UTF-8"?>
 +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 +<plist version="1.0">
 +<dict>
 +	<key>CFBundleDevelopmentRegion</key>
 +	<string>en</string>
- 	<key>CFBundleDisplayName</key>
- 	<string>${PRODUCT_NAME}</string>
 +	<key>CFBundleExecutable</key>
- 	<string>${EXECUTABLE_NAME}</string>
++	<string>$(EXECUTABLE_NAME)</string>
 +	<key>CFBundleIdentifier</key>
 +	<string>net.pol-online.${PRODUCT_NAME:rfc1034identifier}</string>
 +	<key>CFBundleInfoDictionaryVersion</key>
 +	<string>6.0</string>
 +	<key>CFBundleName</key>
- 	<string>${PRODUCT_NAME}</string>
++	<string>$(PRODUCT_NAME)</string>
 +	<key>CFBundlePackageType</key>
 +	<string>APPL</string>
 +	<key>CFBundleShortVersionString</key>
 +	<string>1.0</string>
 +	<key>CFBundleVersion</key>
- 	<string>1.0</string>
++	<string>1</string>
 +	<key>LSRequiresIPhoneOS</key>
 +	<true/>
++	<key>UILaunchStoryboardName</key>
++	<string>LaunchScreen</string>
++	<key>UIMainStoryboardFile</key>
++	<string>Main</string>
 +	<key>UIRequiredDeviceCapabilities</key>
 +	<array>
 +		<string>armv7</string>
 +	</array>
 +	<key>UISupportedInterfaceOrientations</key>
 +	<array>
 +		<string>UIInterfaceOrientationPortrait</string>
 +		<string>UIInterfaceOrientationLandscapeLeft</string>
 +		<string>UIInterfaceOrientationLandscapeRight</string>
 +	</array>
 +	<key>UISupportedInterfaceOrientations~ipad</key>
 +	<array>
 +		<string>UIInterfaceOrientationPortrait</string>
 +		<string>UIInterfaceOrientationPortraitUpsideDown</string>
 +		<string>UIInterfaceOrientationLandscapeLeft</string>
 +		<string>UIInterfaceOrientationLandscapeRight</string>
 +	</array>
 +</dict>
 +</plist>

http://git-wip-us.apache.org/repos/asf/cordova-plugins/blob/36f1a43e/local-webserver/src/ios/GCDWebServer/iOS/ViewController.h
----------------------------------------------------------------------
diff --cc local-webserver/src/ios/GCDWebServer/iOS/ViewController.h
index 0000000,0000000..5400bd5
new file mode 100644
--- /dev/null
+++ b/local-webserver/src/ios/GCDWebServer/iOS/ViewController.h
@@@ -1,0 -1,0 +1,31 @@@
++/*
++ Copyright (c) 2012-2015, Pierre-Olivier Latour
++ All rights reserved.
++ 
++ Redistribution and use in source and binary forms, with or without
++ modification, are permitted provided that the following conditions are met:
++ * Redistributions of source code must retain the above copyright
++ notice, this list of conditions and the following disclaimer.
++ * Redistributions in binary form must reproduce the above copyright
++ notice, this list of conditions and the following disclaimer in the
++ documentation and/or other materials provided with the distribution.
++ * The name of Pierre-Olivier Latour may not be used to endorse
++ or promote products derived from this software without specific
++ prior written permission.
++ 
++ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
++ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
++ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
++ DISCLAIMED. IN NO EVENT SHALL PIERRE-OLIVIER LATOUR BE LIABLE FOR ANY
++ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
++ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
++ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
++ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
++ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++#import <UIKit/UIKit.h>
++
++@interface ViewController : UIViewController
++@end

http://git-wip-us.apache.org/repos/asf/cordova-plugins/blob/36f1a43e/local-webserver/src/ios/GCDWebServer/iOS/ViewController.m
----------------------------------------------------------------------
diff --cc local-webserver/src/ios/GCDWebServer/iOS/ViewController.m
index 0000000,0000000..2f7d79d
new file mode 100644
--- /dev/null
+++ b/local-webserver/src/ios/GCDWebServer/iOS/ViewController.m
@@@ -1,0 -1,0 +1,77 @@@
++/*
++ Copyright (c) 2012-2015, Pierre-Olivier Latour
++ All rights reserved.
++ 
++ Redistribution and use in source and binary forms, with or without
++ modification, are permitted provided that the following conditions are met:
++ * Redistributions of source code must retain the above copyright
++ notice, this list of conditions and the following disclaimer.
++ * Redistributions in binary form must reproduce the above copyright
++ notice, this list of conditions and the following disclaimer in the
++ documentation and/or other materials provided with the distribution.
++ * The name of Pierre-Olivier Latour may not be used to endorse
++ or promote products derived from this software without specific
++ prior written permission.
++ 
++ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
++ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
++ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
++ DISCLAIMED. IN NO EVENT SHALL PIERRE-OLIVIER LATOUR BE LIABLE FOR ANY
++ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
++ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
++ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
++ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
++ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++#import "ViewController.h"
++#import "GCDWebUploader.h"
++
++@interface ViewController () <GCDWebUploaderDelegate>
++@property(weak, nonatomic) IBOutlet UILabel* label;
++@end
++
++@implementation ViewController {
++@private
++  GCDWebUploader* _webServer;
++}
++
++- (void)viewWillAppear:(BOOL)animated {
++  [super viewWillAppear:animated];
++  
++  NSString* documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
++  _webServer = [[GCDWebUploader alloc] initWithUploadDirectory:documentsPath];
++  _webServer.delegate = self;
++  _webServer.allowHiddenItems = YES;
++  if ([_webServer start]) {
++    _label.text = [NSString stringWithFormat:NSLocalizedString(@"GCDWebServer running locally on port %i", nil), (int)_webServer.port];
++  } else {
++    _label.text = NSLocalizedString(@"GCDWebServer not running!", nil);
++  }
++}
++
++- (void)viewDidDisappear:(BOOL)animated {
++  [super viewDidDisappear:animated];
++  
++  [_webServer stop];
++  _webServer = nil;
++}
++
++- (void)webUploader:(GCDWebUploader*)uploader didUploadFileAtPath:(NSString*)path {
++  NSLog(@"[UPLOAD] %@", path);
++}
++
++- (void)webUploader:(GCDWebUploader*)uploader didMoveItemFromPath:(NSString*)fromPath toPath:(NSString*)toPath {
++  NSLog(@"[MOVE] %@ -> %@", fromPath, toPath);
++}
++
++- (void)webUploader:(GCDWebUploader*)uploader didDeleteItemAtPath:(NSString*)path {
++  NSLog(@"[DELETE] %@", path);
++}
++
++- (void)webUploader:(GCDWebUploader*)uploader didCreateDirectoryAtPath:(NSString*)path {
++  NSLog(@"[CREATE] %@", path);
++}
++
++@end

http://git-wip-us.apache.org/repos/asf/cordova-plugins/blob/36f1a43e/local-webserver/src/ios/GCDWebServer/iOS/main.m
----------------------------------------------------------------------
diff --cc local-webserver/src/ios/GCDWebServer/iOS/main.m
index 21b6aa9,0000000..bd96dd5
mode 100644,000000..100644
--- a/local-webserver/src/ios/GCDWebServer/iOS/main.m
+++ b/local-webserver/src/ios/GCDWebServer/iOS/main.m
@@@ -1,34 -1,0 +1,34 @@@
 +/*
-  Copyright (c) 2012-2014, Pierre-Olivier Latour
++ Copyright (c) 2012-2015, Pierre-Olivier Latour
 + All rights reserved.
 + 
 + Redistribution and use in source and binary forms, with or without
 + modification, are permitted provided that the following conditions are met:
 + * Redistributions of source code must retain the above copyright
 + notice, this list of conditions and the following disclaimer.
 + * Redistributions in binary form must reproduce the above copyright
 + notice, this list of conditions and the following disclaimer in the
 + documentation and/or other materials provided with the distribution.
 + * The name of Pierre-Olivier Latour may not be used to endorse
 + or promote products derived from this software without specific
 + prior written permission.
 + 
 + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 + DISCLAIMED. IN NO EVENT SHALL PIERRE-OLIVIER LATOUR BE LIABLE FOR ANY
 + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 + */
 +
 +#import "AppDelegate.h"
 +
 +int main(int argc, char* argv[]) {
 +  @autoreleasepool {
 +    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
 +  }
 +}

http://git-wip-us.apache.org/repos/asf/cordova-plugins/blob/36f1a43e/local-webserver/src/ios/GCDWebServer/tvOS/AppDelegate.h
----------------------------------------------------------------------
diff --cc local-webserver/src/ios/GCDWebServer/tvOS/AppDelegate.h
index 0000000,0000000..8b0876f
new file mode 100644
--- /dev/null
+++ b/local-webserver/src/ios/GCDWebServer/tvOS/AppDelegate.h
@@@ -1,0 -1,0 +1,32 @@@
++/*
++ Copyright (c) 2012-2015, Pierre-Olivier Latour
++ All rights reserved.
++ 
++ Redistribution and use in source and binary forms, with or without
++ modification, are permitted provided that the following conditions are met:
++ * Redistributions of source code must retain the above copyright
++ notice, this list of conditions and the following disclaimer.
++ * Redistributions in binary form must reproduce the above copyright
++ notice, this list of conditions and the following disclaimer in the
++ documentation and/or other materials provided with the distribution.
++ * The name of Pierre-Olivier Latour may not be used to endorse
++ or promote products derived from this software without specific
++ prior written permission.
++ 
++ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
++ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
++ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
++ DISCLAIMED. IN NO EVENT SHALL PIERRE-OLIVIER LATOUR BE LIABLE FOR ANY
++ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
++ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
++ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
++ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
++ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++#import <UIKit/UIKit.h>
++
++@interface AppDelegate : UIResponder <UIApplicationDelegate>
++@property(strong, nonatomic) UIWindow* window;
++@end

http://git-wip-us.apache.org/repos/asf/cordova-plugins/blob/36f1a43e/local-webserver/src/ios/GCDWebServer/tvOS/AppDelegate.m
----------------------------------------------------------------------
diff --cc local-webserver/src/ios/GCDWebServer/tvOS/AppDelegate.m
index 0000000,0000000..bfd0518
new file mode 100644
--- /dev/null
+++ b/local-webserver/src/ios/GCDWebServer/tvOS/AppDelegate.m
@@@ -1,0 -1,0 +1,36 @@@
++/*
++ Copyright (c) 2012-2015, Pierre-Olivier Latour
++ All rights reserved.
++ 
++ Redistribution and use in source and binary forms, with or without
++ modification, are permitted provided that the following conditions are met:
++ * Redistributions of source code must retain the above copyright
++ notice, this list of conditions and the following disclaimer.
++ * Redistributions in binary form must reproduce the above copyright
++ notice, this list of conditions and the following disclaimer in the
++ documentation and/or other materials provided with the distribution.
++ * The name of Pierre-Olivier Latour may not be used to endorse
++ or promote products derived from this software without specific
++ prior written permission.
++ 
++ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
++ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
++ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
++ DISCLAIMED. IN NO EVENT SHALL PIERRE-OLIVIER LATOUR BE LIABLE FOR ANY
++ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
++ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
++ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
++ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
++ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++#import "AppDelegate.h"
++
++@implementation AppDelegate
++
++- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
++  return YES;
++}
++
++@end

http://git-wip-us.apache.org/repos/asf/cordova-plugins/blob/36f1a43e/local-webserver/src/ios/GCDWebServer/tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/Contents.json
----------------------------------------------------------------------
diff --cc local-webserver/src/ios/GCDWebServer/tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/Contents.json
index 0000000,0000000..0564959
new file mode 100644
--- /dev/null
+++ b/local-webserver/src/ios/GCDWebServer/tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/Contents.json
@@@ -1,0 -1,0 +1,12 @@@
++{
++  "images" : [
++    {
++      "idiom" : "tv",
++      "scale" : "1x"
++    }
++  ],
++  "info" : {
++    "version" : 1,
++    "author" : "xcode"
++  }
++}

http://git-wip-us.apache.org/repos/asf/cordova-plugins/blob/36f1a43e/local-webserver/src/ios/GCDWebServer/tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Contents.json
----------------------------------------------------------------------
diff --cc local-webserver/src/ios/GCDWebServer/tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Contents.json
index 0000000,0000000..da4a164
new file mode 100644
--- /dev/null
+++ b/local-webserver/src/ios/GCDWebServer/tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Contents.json
@@@ -1,0 -1,0 +1,6 @@@
++{
++  "info" : {
++    "version" : 1,
++    "author" : "xcode"
++  }
++}


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cordova.apache.org
For additional commands, e-mail: commits-help@cordova.apache.org