CB-12489 - Delete root plugins and update root README in cordova-plugins for plugins in branches
diff --git a/create-test-files/create-test-files.js b/create-test-files/create-test-files.js
deleted file mode 100755
index eafe668..0000000
--- a/create-test-files/create-test-files.js
+++ /dev/null
@@ -1,155 +0,0 @@
-#!/usr/bin/env node
-
-/*
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
-*/
-
-var shell = require('shelljs');
-var path = require('path');
-var argv = require('nopt')({
- 'help' : Boolean,
- 'template-path' : String
-});
-
-var projectName = argv.argv.remain[0];
-var repoName = argv.argv.remain[1];
-
-if (argv.help || !projectName || !repoName) {
- console.log('Usage: $0 [--template-path] <project_name> <repo_name>');
- console.log(' <project_name>: Plugin name, i.e. CDVFoo');
- console.log(' <repo_name>: Repo name');
- console.log(' [--template-path]: Path to test template (override).');
- process.exit(0);
-}
-
-var tests_template_folder = argv.template-path || path.join(__dirname, "tests-template");
-
-processTemplateFiles(projectName, repoName);
-
-function processTemplateFiles(project_name, repo_name) {
-
- var project_name_esc = project_name.replace(/&/g, '\\&');
- var repo_name_esc = repo_name.replace(/&/g, '\\&');
-
- /*
- tests-template/ios/__PROJECT_NAME__Test/__PROJECT_NAME__LibTests/__PROJECT_NAME__Test.m
- tests-template/ios/__PROJECT_NAME__Test/__PROJECT_NAME__LibTests/Info.plist
- tests-template/ios/__PROJECT_NAME__Test/__PROJECT_NAME__Test.xcodeproj/project.pbxproj
- tests-template/ios/__PROJECT_NAME__Test/__PROJECT_NAME__Test.xcodeproj/project.xcworkspace/contents.xcworkspacedata
- tests-template/ios/__PROJECT_NAME__Test/__PROJECT_NAME__Test.xcodeproj/project.xcworkspace/xcshareddata/__PROJECT_NAME__Test.xccheckout
- tests-template/ios/__PROJECT_NAME__Test/__PROJECT_NAME__Test.xcodeproj/xcshareddata/xcschemes/__PROJECT_NAME__Lib.xcscheme
- tests-template/ios/__PROJECT_NAME__Test/__PROJECT_NAME__Test.xcodeproj/xcshareddata/xcschemes/__PROJECT_NAME__LibTests.xcscheme
- tests-template/ios/__PROJECT_NAME__Test.xcworkspace/xcshareddata/__PROJECT_NAME__Test.xccheckout
- tests-template/ios/__PROJECT_NAME__Test.xcworkspace/contents.xcworkspacedata
- tests-template/ios/package.json
- tests-template/ios/README.md
- tests-template/plugin.xml
- tests-template/tests.js
- */
-
- // substitute token __PROJECT_NAME__ in files
- var r = tests_template_folder;
-
- shell.sed('-i', /__PROJECT_NAME__/g, project_name_esc, path.join(r, 'plugin.xml'));
- shell.sed('-i', /__PROJECT_NAME__/g, project_name_esc, path.join(r, 'tests.js'));
- shell.sed('-i', /__PROJECT_NAME__/g, project_name_esc, path.join(r, 'ios', 'README.md'));
- shell.sed('-i', /__PROJECT_NAME__/g, project_name_esc, path.join(r, 'ios', 'package.json'));
- shell.sed('-i', /__PROJECT_NAME__/g, project_name_esc, path.join(r, 'ios', '__PROJECT_NAME__Test.xcworkspace', 'contents.xcworkspacedata'));
- shell.sed('-i', /__PROJECT_NAME__/g, project_name_esc, path.join(r, 'ios', '__PROJECT_NAME__Test.xcworkspace', 'xcshareddata', '__PROJECT_NAME__Test.xccheckout'));
-
- var x = path.join(r, 'ios', '__PROJECT_NAME__Test', '__PROJECT_NAME__Test.xcodeproj');
-
- shell.sed('-i', /__PROJECT_NAME__/g, project_name_esc, path.join(x, 'xcshareddata', 'xcschemes', '__PROJECT_NAME__LibTests.xcscheme'));
- shell.sed('-i', /__PROJECT_NAME__/g, project_name_esc, path.join(x, 'xcshareddata', 'xcschemes', '__PROJECT_NAME__Lib.xcscheme'));
- shell.sed('-i', /__PROJECT_NAME__/g, project_name_esc, path.join(x, 'project.xcworkspace', 'xcshareddata','__PROJECT_NAME__Test.xccheckout'));
- shell.sed('-i', /__PROJECT_NAME__/g, project_name_esc, path.join(x, 'project.xcworkspace', 'contents.xcworkspacedata'));
- shell.sed('-i', /__PROJECT_NAME__/g, project_name_esc, path.join(x, 'project.pbxproj'));
-
- var l = path.join(r, 'ios', '__PROJECT_NAME__Test', '__PROJECT_NAME__LibTests');
-
- shell.sed('-i', /__PROJECT_NAME__/g, project_name_esc, path.join(l, 'Info.plist'));
- shell.sed('-i', /__PROJECT_NAME__/g, project_name_esc, path.join(l, '__PROJECT_NAME__Test.m'));
-
- // substitute token __REPO_NAME__ in files
-
- shell.sed('-i', /__REPO_NAME__/g, repo_name_esc, path.join(r, 'plugin.xml'));
- shell.sed('-i', /__REPO_NAME__/g, repo_name_esc, path.join(r, 'tests.js'));
- shell.sed('-i', /__REPO_NAME__/g, repo_name_esc, path.join(r, 'ios', 'README.md'));
- shell.sed('-i', /__REPO_NAME__/g, repo_name_esc, path.join(r, 'ios', 'package.json'));
- shell.sed('-i', /__REPO_NAME__/g, repo_name_esc, path.join(r, 'ios', '__PROJECT_NAME__Test.xcworkspace', 'contents.xcworkspacedata'));
- shell.sed('-i', /__REPO_NAME__/g, repo_name_esc, path.join(r, 'ios', '__PROJECT_NAME__Test.xcworkspace', 'xcshareddata', '__PROJECT_NAME__Test.xccheckout'));
-
- shell.sed('-i', /__REPO_NAME__/g, repo_name_esc, path.join(x, 'xcshareddata', 'xcschemes', '__PROJECT_NAME__LibTests.xcscheme'));
- shell.sed('-i', /__REPO_NAME__/g, repo_name_esc, path.join(x, 'xcshareddata', 'xcschemes', '__PROJECT_NAME__Lib.xcscheme'));
- shell.sed('-i', /__REPO_NAME__/g, repo_name_esc, path.join(x, 'project.xcworkspace', 'xcshareddata','__PROJECT_NAME__Test.xccheckout'));
- shell.sed('-i', /__REPO_NAME__/g, repo_name_esc, path.join(x, 'project.xcworkspace', 'contents.xcworkspacedata'));
- shell.sed('-i', /__REPO_NAME__/g, repo_name_esc, path.join(x, 'project.pbxproj'));
-
- shell.sed('-i', /__REPO_NAME__/g, repo_name_esc, path.join(l, 'Info.plist'));
- shell.sed('-i', /__REPO_NAME__/g, repo_name_esc, path.join(l, '__PROJECT_NAME__Test.m'));
-
- /*
- tests-template/ios/__PROJECT_NAME__/__PROJECT_NAME__Test.xcodeproj/project.xcworkspace/xcshareddata/__PROJECT_NAME__Test.xccheckout
- tests-template/ios/__PROJECT_NAME__/__PROJECT_NAME__Test.xcodeproj/xcshareddata/xcschemes/__PROJECT_NAME__Lib.xcscheme
- tests-template/ios/__PROJECT_NAME__/__PROJECT_NAME__Test.xcodeproj/xcshareddata/xcschemes/__PROJECT_NAME__LibTests.xcscheme
- tests-template/ios/__PROJECT_NAME__/__PROJECT_NAME__Test.xcodeproj
- tests-template/ios/__PROJECT_NAME__Test.xcworkspace/xcshareddata/__PROJECT_NAME__Test.xccheckout
- tests-template/ios/__PROJECT_NAME__Test.xcworkspace
- tests-template/ios/__PROJECT_NAME__/__PROJECT_NAME__LibTests/__PROJECT_NAME__Test.m
- tests-template/ios/__PROJECT_NAME__/__PROJECT_NAME__LibTests
- tests-template/ios/__PROJECT_NAME__
- */
-
- // rename folders
-
- shell.mv('-f',
- path.join(x, 'project.xcworkspace', 'xcshareddata', '__PROJECT_NAME__Test.xccheckout'),
- path.join(x, 'project.xcworkspace', 'xcshareddata', project_name_esc + 'Test.xccheckout')
- );
- shell.mv('-f',
- path.join(x, 'xcshareddata', 'xcschemes', '__PROJECT_NAME__Lib.xcscheme'),
- path.join(x, 'xcshareddata', 'xcschemes', project_name_esc + 'Lib.xcscheme')
- );
- shell.mv('-f',
- path.join(x, 'xcshareddata', 'xcschemes', '__PROJECT_NAME__LibTests.xcscheme'),
- path.join(x, 'xcshareddata', 'xcschemes', project_name_esc + 'LibTests.xcscheme')
- );
- shell.mv('-f',
- path.join(r, 'ios', '__PROJECT_NAME__Test', '__PROJECT_NAME__Test.xcodeproj'),
- path.join(r, 'ios', '__PROJECT_NAME__Test', project_name_esc + 'Test.xcodeproj')
- );
- shell.mv('-f',
- path.join(r, 'ios', '__PROJECT_NAME__Test.xcworkspace', 'xcshareddata', '__PROJECT_NAME__Test.xccheckout'),
- path.join(r, 'ios', '__PROJECT_NAME__Test.xcworkspace', 'xcshareddata', project_name_esc + 'Test.xccheckout')
- );
- shell.mv('-f',
- path.join(r, 'ios', '__PROJECT_NAME__Test.xcworkspace'),
- path.join(r, 'ios', project_name_esc + 'Test.xcworkspace')
- );
- shell.mv('-f',
- path.join(r, 'ios', '__PROJECT_NAME__Test', '__PROJECT_NAME__LibTests', '__PROJECT_NAME__Test.m'),
- path.join(r, 'ios', '__PROJECT_NAME__Test', '__PROJECT_NAME__LibTests', project_name_esc + 'Test.m')
- );
- shell.mv('-f',
- path.join(r, 'ios', '__PROJECT_NAME__Test', '__PROJECT_NAME__LibTests'),
- path.join(r, 'ios', '__PROJECT_NAME__Test', project_name_esc + 'LibTests')
- );
- shell.mv('-f',
- path.join(r, 'ios', '__PROJECT_NAME__Test'),
- path.join(r, 'ios', project_name_esc + "Test")
- );
-}
-
diff --git a/create-test-files/package.json b/create-test-files/package.json
deleted file mode 100644
index 5e0e81d..0000000
--- a/create-test-files/package.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
- "name": "create-test-files",
- "version": "1.0.0",
- "description": "Create Obj-C test files and js test stub for a plugin.",
- "main": "create-test-files.js",
- "scripts": {
- "test": "echo \"Error: no test specified\" && exit 1"
- },
- "author": "",
- "license": "Apache-2.0",
- "dependencies": {
- "nopt": "^3.0.6",
- "shelljs": "^0.7.0"
- }
-}
diff --git a/create-test-files/tests-template/ios/README.md b/create-test-files/tests-template/ios/README.md
deleted file mode 100644
index 0949a43..0000000
--- a/create-test-files/tests-template/ios/README.md
+++ /dev/null
@@ -1,40 +0,0 @@
-<!--
-# license: Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
--->
-
-# iOS Tests for __PROJECT_NAME__
-
-You need to install `node.js` to pull in `cordova-ios`.
-
-First install cordova-ios:
-
- npm install
-
-... in the current folder.
-
-
-# Testing from Xcode
-
-1. Launch the `__PROJECT_NAME__Test.xcworkspace` file.
-2. Choose "__PROJECT_NAME__LibTests" from the scheme drop-down menu
-3. Click and hold on the `Play` button, and choose the `Wrench` icon to run the tests
-
-
-# Testing from the command line
-
- npm test
diff --git a/create-test-files/tests-template/ios/__PROJECT_NAME__Test.xcworkspace/contents.xcworkspacedata b/create-test-files/tests-template/ios/__PROJECT_NAME__Test.xcworkspace/contents.xcworkspacedata
deleted file mode 100644
index 6e3ea30..0000000
--- a/create-test-files/tests-template/ios/__PROJECT_NAME__Test.xcworkspace/contents.xcworkspacedata
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<Workspace
- version = "1.0">
- <FileRef
- location = "container:__PROJECT_NAME__Test/__PROJECT_NAME__Test.xcodeproj">
- </FileRef>
-</Workspace>
diff --git a/create-test-files/tests-template/ios/__PROJECT_NAME__Test.xcworkspace/xcshareddata/__PROJECT_NAME__Test.xccheckout b/create-test-files/tests-template/ios/__PROJECT_NAME__Test.xcworkspace/xcshareddata/__PROJECT_NAME__Test.xccheckout
deleted file mode 100644
index b923e92..0000000
--- a/create-test-files/tests-template/ios/__PROJECT_NAME__Test.xcworkspace/xcshareddata/__PROJECT_NAME__Test.xccheckout
+++ /dev/null
@@ -1,41 +0,0 @@
-<?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>IDESourceControlProjectFavoriteDictionaryKey</key>
- <false/>
- <key>IDESourceControlProjectIdentifier</key>
- <string>6BE9AD73-1B9F-4362-98D7-DC631BEC6185</string>
- <key>IDESourceControlProjectName</key>
- <string>__PROJECT_NAME__Test</string>
- <key>IDESourceControlProjectOriginsDictionary</key>
- <dict>
- <key>BEF5A5D0FF64801E558286389440357A9233D7DB</key>
- <string>https://git-wip-us.apache.org/repos/asf/__REPO_NAME__.git</string>
- </dict>
- <key>IDESourceControlProjectPath</key>
- <string>tests/ios/__PROJECT_NAME__Test/__PROJECT_NAME__Test.xcodeproj</string>
- <key>IDESourceControlProjectRelativeInstallPathDictionary</key>
- <dict>
- <key>BEF5A5D0FF64801E558286389440357A9233D7DB</key>
- <string>../../../../..</string>
- </dict>
- <key>IDESourceControlProjectURL</key>
- <string>https://git-wip-us.apache.org/repos/asf/__REPO_NAME__.git</string>
- <key>IDESourceControlProjectVersion</key>
- <integer>111</integer>
- <key>IDESourceControlProjectWCCIdentifier</key>
- <string>BEF5A5D0FF64801E558286389440357A9233D7DB</string>
- <key>IDESourceControlProjectWCConfigurations</key>
- <array>
- <dict>
- <key>IDESourceControlRepositoryExtensionIdentifierKey</key>
- <string>public.vcs.git</string>
- <key>IDESourceControlWCCIdentifierKey</key>
- <string>BEF5A5D0FF64801E558286389440357A9233D7DB</string>
- <key>IDESourceControlWCCName</key>
- <string>__REPO_NAME__</string>
- </dict>
- </array>
-</dict>
-</plist>
diff --git a/create-test-files/tests-template/ios/__PROJECT_NAME__Test.xcworkspace/xcshareddata/xcschemes/CordovaLib.xcscheme b/create-test-files/tests-template/ios/__PROJECT_NAME__Test.xcworkspace/xcshareddata/xcschemes/CordovaLib.xcscheme
deleted file mode 100644
index 13f9a15..0000000
--- a/create-test-files/tests-template/ios/__PROJECT_NAME__Test.xcworkspace/xcshareddata/xcschemes/CordovaLib.xcscheme
+++ /dev/null
@@ -1,77 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<Scheme
- LastUpgradeVersion = "0600"
- version = "1.3">
- <BuildAction
- parallelizeBuildables = "YES"
- buildImplicitDependencies = "YES">
- <BuildActionEntries>
- <BuildActionEntry
- buildForTesting = "YES"
- buildForRunning = "YES"
- buildForProfiling = "YES"
- buildForArchiving = "YES"
- buildForAnalyzing = "YES">
- <BuildableReference
- BuildableIdentifier = "primary"
- BlueprintIdentifier = "D2AAC07D0554694100DB518D"
- BuildableName = "libCordova.a"
- BlueprintName = "CordovaLib"
- ReferencedContainer = "container:node_modules/cordova-ios/CordovaLib/CordovaLib.xcodeproj">
- </BuildableReference>
- </BuildActionEntry>
- </BuildActionEntries>
- </BuildAction>
- <TestAction
- selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
- selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
- shouldUseLaunchSchemeArgsEnv = "YES"
- buildConfiguration = "Debug">
- <Testables>
- </Testables>
- </TestAction>
- <LaunchAction
- selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
- selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
- launchStyle = "0"
- useCustomWorkingDirectory = "NO"
- buildConfiguration = "Debug"
- ignoresPersistentStateOnLaunch = "NO"
- debugDocumentVersioning = "YES"
- allowLocationSimulation = "YES">
- <MacroExpansion>
- <BuildableReference
- BuildableIdentifier = "primary"
- BlueprintIdentifier = "D2AAC07D0554694100DB518D"
- BuildableName = "libCordova.a"
- BlueprintName = "CordovaLib"
- ReferencedContainer = "container:node_modules/cordova-ios/CordovaLib/CordovaLib.xcodeproj">
- </BuildableReference>
- </MacroExpansion>
- <AdditionalOptions>
- </AdditionalOptions>
- </LaunchAction>
- <ProfileAction
- shouldUseLaunchSchemeArgsEnv = "YES"
- savedToolIdentifier = ""
- useCustomWorkingDirectory = "NO"
- buildConfiguration = "Release"
- debugDocumentVersioning = "YES">
- <MacroExpansion>
- <BuildableReference
- BuildableIdentifier = "primary"
- BlueprintIdentifier = "D2AAC07D0554694100DB518D"
- BuildableName = "libCordova.a"
- BlueprintName = "CordovaLib"
- ReferencedContainer = "container:node_modules/cordova-ios/CordovaLib/CordovaLib.xcodeproj">
- </BuildableReference>
- </MacroExpansion>
- </ProfileAction>
- <AnalyzeAction
- buildConfiguration = "Debug">
- </AnalyzeAction>
- <ArchiveAction
- buildConfiguration = "Release"
- revealArchiveInOrganizer = "YES">
- </ArchiveAction>
-</Scheme>
diff --git a/create-test-files/tests-template/ios/__PROJECT_NAME__Test/.gitignore b/create-test-files/tests-template/ios/__PROJECT_NAME__Test/.gitignore
deleted file mode 100644
index c795b05..0000000
--- a/create-test-files/tests-template/ios/__PROJECT_NAME__Test/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-build
\ No newline at end of file
diff --git a/create-test-files/tests-template/ios/__PROJECT_NAME__Test/__PROJECT_NAME__LibTests/Info.plist b/create-test-files/tests-template/ios/__PROJECT_NAME__Test/__PROJECT_NAME__LibTests/Info.plist
deleted file mode 100644
index 95c8add..0000000
--- a/create-test-files/tests-template/ios/__PROJECT_NAME__Test/__PROJECT_NAME__LibTests/Info.plist
+++ /dev/null
@@ -1,44 +0,0 @@
-<?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">
-<!--
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
--->
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>en</string>
- <key>CFBundleExecutable</key>
- <string>$(EXECUTABLE_NAME)</string>
- <key>CFBundleIdentifier</key>
- <string>org.apache.cordova.$(PRODUCT_NAME:rfc1034identifier)</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundleName</key>
- <string>$(PRODUCT_NAME)</string>
- <key>CFBundlePackageType</key>
- <string>BNDL</string>
- <key>CFBundleShortVersionString</key>
- <string>1.0</string>
- <key>CFBundleSignature</key>
- <string>????</string>
- <key>CFBundleVersion</key>
- <string>1</string>
-</dict>
-</plist>
diff --git a/create-test-files/tests-template/ios/__PROJECT_NAME__Test/__PROJECT_NAME__LibTests/__PROJECT_NAME__Test.m b/create-test-files/tests-template/ios/__PROJECT_NAME__Test/__PROJECT_NAME__LibTests/__PROJECT_NAME__Test.m
deleted file mode 100644
index eb2a80c..0000000
--- a/create-test-files/tests-template/ios/__PROJECT_NAME__Test/__PROJECT_NAME__LibTests/__PROJECT_NAME__Test.m
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
- */
-
-#import <UIKit/UIKit.h>
-#import <XCTest/XCTest.h>
-#import "__PROJECT_NAME__.h"
-
-@interface __PROJECT_NAME__Test : XCTestCase
-
-@property (nonatomic, strong) __PROJECT_NAME__* plugin;
-
-@end
-
-@interface __PROJECT_NAME__ ()
-
-// TODO: expose private interface, if needed
-
-@end
-
-@implementation __PROJECT_NAME__Test
-
-- (void)setUp {
- [super setUp];
- // Put setup code here. This method is called before the invocation of each test method in the class.
-
- self.plugin = [[__PROJECT_NAME__ alloc] init];
-}
-
-- (void)tearDown {
- // Put teardown code here. This method is called after the invocation of each test method in the class.
- [super tearDown];
-}
-
-- (void) test__PROJECT_NAME__ {
-
- // Failing tests
- XCTAssertTrue(NO);
- XCTAssertFalse(YES);
-}
-
-@end
diff --git a/create-test-files/tests-template/ios/__PROJECT_NAME__Test/__PROJECT_NAME__Test.xcodeproj/project.pbxproj b/create-test-files/tests-template/ios/__PROJECT_NAME__Test/__PROJECT_NAME__Test.xcodeproj/project.pbxproj
deleted file mode 100644
index e3dc61d..0000000
--- a/create-test-files/tests-template/ios/__PROJECT_NAME__Test/__PROJECT_NAME__Test.xcodeproj/project.pbxproj
+++ /dev/null
@@ -1,499 +0,0 @@
-// !$*UTF8*$!
-{
- archiveVersion = 1;
- classes = {
- };
- objectVersion = 46;
- objects = {
-
-/* Begin PBXBuildFile section */
- 7E9F51AB19DA10AE00DA31AC /* __PROJECT_NAME__.m in Sources */ = {isa = PBXBuildFile; fileRef = 7E9F51A919DA10AE00DA31AC /* __PROJECT_NAME__.m */; };
- 7E9F51B119DA114400DA31AC /* __PROJECT_NAME__Test.m in Sources */ = {isa = PBXBuildFile; fileRef = 7E9F51B019DA114400DA31AC /* __PROJECT_NAME__Test.m */; };
- 7E9F51B319DA116500DA31AC /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7E9F51B219DA116500DA31AC /* Foundation.framework */; };
- 7E9F51B519DA127E00DA31AC /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7E9F51B419DA127E00DA31AC /* UIKit.framework */; };
- 7E9F51B919DA1B1600DA31AC /* lib__PROJECT_NAME__Lib.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7E9F519519DA102000DA31AC /* lib__PROJECT_NAME__Lib.a */; };
- 7E9F51BA19DA1B2000DA31AC /* libCordova.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7E9F519019DA0F8300DA31AC /* libCordova.a */; };
-/* End PBXBuildFile section */
-
-/* Begin PBXContainerItemProxy section */
- 7E9F518F19DA0F8300DA31AC /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 7E9F518B19DA0F8300DA31AC /* CordovaLib.xcodeproj */;
- proxyType = 2;
- remoteGlobalIDString = 68A32D7114102E1C006B237C;
- remoteInfo = CordovaLib;
- };
- 7E9F51AC19DA10DE00DA31AC /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 7E9F517219DA09CE00DA31AC /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 7E9F519419DA102000DA31AC;
- remoteInfo = __PROJECT_NAME__Lib;
- };
- 7E9F51AE19DA10E100DA31AC /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 7E9F518B19DA0F8300DA31AC /* CordovaLib.xcodeproj */;
- proxyType = 1;
- remoteGlobalIDString = D2AAC07D0554694100DB518D;
- remoteInfo = CordovaLib;
- };
-/* End PBXContainerItemProxy section */
-
-/* Begin PBXCopyFilesBuildPhase section */
- 7E9F519319DA102000DA31AC /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "include/$(PRODUCT_NAME)";
- dstSubfolderSpec = 16;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXCopyFilesBuildPhase section */
-
-/* Begin PBXFileReference section */
- 7E9F518B19DA0F8300DA31AC /* CordovaLib.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = CordovaLib.xcodeproj; path = "../node_modules/cordova-ios/CordovaLib/CordovaLib.xcodeproj"; sourceTree = "<group>"; };
- 7E9F519519DA102000DA31AC /* lib__PROJECT_NAME__Lib.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = lib__PROJECT_NAME__Lib.a; sourceTree = BUILT_PRODUCTS_DIR; };
- 7E9F519F19DA102000DA31AC /* __PROJECT_NAME__LibTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = __PROJECT_NAME__LibTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
- 7E9F51A219DA102000DA31AC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
- 7E9F51A919DA10AE00DA31AC /* __PROJECT_NAME__.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = __PROJECT_NAME__.m; path = ../../../src/ios/__PROJECT_NAME__.m; sourceTree = SOURCE_ROOT; };
- 7E9F51AA19DA10AE00DA31AC /* __PROJECT_NAME__.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = __PROJECT_NAME__.h; path = ../../../src/ios/__PROJECT_NAME__.h; sourceTree = SOURCE_ROOT; };
- 7E9F51B019DA114400DA31AC /* __PROJECT_NAME__Test.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = __PROJECT_NAME__Test.m; sourceTree = "<group>"; };
- 7E9F51B219DA116500DA31AC /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; };
- 7E9F51B419DA127E00DA31AC /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.0.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; };
-/* End PBXFileReference section */
-
-/* Begin PBXFrameworksBuildPhase section */
- 7E9F519219DA102000DA31AC /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 7E9F519C19DA102000DA31AC /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 7E9F51BA19DA1B2000DA31AC /* libCordova.a in Frameworks */,
- 7E9F51B919DA1B1600DA31AC /* lib__PROJECT_NAME__Lib.a in Frameworks */,
- 7E9F51B519DA127E00DA31AC /* UIKit.framework in Frameworks */,
- 7E9F51B319DA116500DA31AC /* Foundation.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXFrameworksBuildPhase section */
-
-/* Begin PBXGroup section */
- 7E9F517119DA09CE00DA31AC = {
- isa = PBXGroup;
- children = (
- 7E9F51B419DA127E00DA31AC /* UIKit.framework */,
- 7E9F51B219DA116500DA31AC /* Foundation.framework */,
- 7E9F518B19DA0F8300DA31AC /* CordovaLib.xcodeproj */,
- 7E9F519619DA102000DA31AC /* __PROJECT_NAME__Lib */,
- 7E9F51A019DA102000DA31AC /* __PROJECT_NAME__LibTests */,
- 7E9F517D19DA0A0A00DA31AC /* Products */,
- );
- sourceTree = "<group>";
- };
- 7E9F517D19DA0A0A00DA31AC /* Products */ = {
- isa = PBXGroup;
- children = (
- 7E9F519519DA102000DA31AC /* lib__PROJECT_NAME__Lib.a */,
- 7E9F519F19DA102000DA31AC /* __PROJECT_NAME__LibTests.xctest */,
- );
- name = Products;
- sourceTree = "<group>";
- };
- 7E9F518C19DA0F8300DA31AC /* Products */ = {
- isa = PBXGroup;
- children = (
- 7E9F519019DA0F8300DA31AC /* libCordova.a */,
- );
- name = Products;
- sourceTree = "<group>";
- };
- 7E9F519619DA102000DA31AC /* __PROJECT_NAME__Lib */ = {
- isa = PBXGroup;
- children = (
- 7E9F51A919DA10AE00DA31AC /* __PROJECT_NAME__.m */,
- 7E9F51AA19DA10AE00DA31AC /* __PROJECT_NAME__.h */,
- );
- path = __PROJECT_NAME__Lib;
- sourceTree = SOURCE_ROOT;
- };
- 7E9F51A019DA102000DA31AC /* __PROJECT_NAME__LibTests */ = {
- isa = PBXGroup;
- children = (
- 7E9F51A119DA102000DA31AC /* Supporting Files */,
- 7E9F51B019DA114400DA31AC /* __PROJECT_NAME__Test.m */,
- );
- path = __PROJECT_NAME__LibTests;
- sourceTree = "<group>";
- };
- 7E9F51A119DA102000DA31AC /* Supporting Files */ = {
- isa = PBXGroup;
- children = (
- 7E9F51A219DA102000DA31AC /* Info.plist */,
- );
- name = "Supporting Files";
- sourceTree = "<group>";
- };
-/* End PBXGroup section */
-
-/* Begin PBXNativeTarget section */
- 7E9F519419DA102000DA31AC /* __PROJECT_NAME__Lib */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 7E9F51A319DA102000DA31AC /* Build configuration list for PBXNativeTarget "__PROJECT_NAME__Lib" */;
- buildPhases = (
- 7E9F519119DA102000DA31AC /* Sources */,
- 7E9F519219DA102000DA31AC /* Frameworks */,
- 7E9F519319DA102000DA31AC /* CopyFiles */,
- );
- buildRules = (
- );
- dependencies = (
- );
- name = __PROJECT_NAME__Lib;
- productName = __PROJECT_NAME__Lib;
- productReference = 7E9F519519DA102000DA31AC /* lib__PROJECT_NAME__Lib.a */;
- productType = "com.apple.product-type.library.static";
- };
- 7E9F519E19DA102000DA31AC /* __PROJECT_NAME__LibTests */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 7E9F51A619DA102000DA31AC /* Build configuration list for PBXNativeTarget "__PROJECT_NAME__LibTests" */;
- buildPhases = (
- 7E9F519B19DA102000DA31AC /* Sources */,
- 7E9F519C19DA102000DA31AC /* Frameworks */,
- 7E9F519D19DA102000DA31AC /* Resources */,
- );
- buildRules = (
- );
- dependencies = (
- 7E9F51AF19DA10E100DA31AC /* PBXTargetDependency */,
- 7E9F51AD19DA10DE00DA31AC /* PBXTargetDependency */,
- );
- name = __PROJECT_NAME__LibTests;
- productName = __PROJECT_NAME__LibTests;
- productReference = 7E9F519F19DA102000DA31AC /* __PROJECT_NAME__LibTests.xctest */;
- productType = "com.apple.product-type.bundle.unit-test";
- };
-/* End PBXNativeTarget section */
-
-/* Begin PBXProject section */
- 7E9F517219DA09CE00DA31AC /* Project object */ = {
- isa = PBXProject;
- attributes = {
- LastUpgradeCheck = 0600;
- TargetAttributes = {
- 7E9F519419DA102000DA31AC = {
- CreatedOnToolsVersion = 6.0;
- };
- 7E9F519E19DA102000DA31AC = {
- CreatedOnToolsVersion = 6.0;
- };
- };
- };
- buildConfigurationList = 7E9F517519DA09CE00DA31AC /* Build configuration list for PBXProject "__PROJECT_NAME__Test" */;
- compatibilityVersion = "Xcode 3.2";
- developmentRegion = English;
- hasScannedForEncodings = 0;
- knownRegions = (
- en,
- );
- mainGroup = 7E9F517119DA09CE00DA31AC;
- productRefGroup = 7E9F517D19DA0A0A00DA31AC /* Products */;
- projectDirPath = "";
- projectReferences = (
- {
- ProductGroup = 7E9F518C19DA0F8300DA31AC /* Products */;
- ProjectRef = 7E9F518B19DA0F8300DA31AC /* CordovaLib.xcodeproj */;
- },
- );
- projectRoot = "";
- targets = (
- 7E9F519419DA102000DA31AC /* __PROJECT_NAME__Lib */,
- 7E9F519E19DA102000DA31AC /* __PROJECT_NAME__LibTests */,
- );
- };
-/* End PBXProject section */
-
-/* Begin PBXReferenceProxy section */
- 7E9F519019DA0F8300DA31AC /* libCordova.a */ = {
- isa = PBXReferenceProxy;
- fileType = archive.ar;
- path = libCordova.a;
- remoteRef = 7E9F518F19DA0F8300DA31AC /* PBXContainerItemProxy */;
- sourceTree = BUILT_PRODUCTS_DIR;
- };
-/* End PBXReferenceProxy section */
-
-/* Begin PBXResourcesBuildPhase section */
- 7E9F519D19DA102000DA31AC /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXResourcesBuildPhase section */
-
-/* Begin PBXSourcesBuildPhase section */
- 7E9F519119DA102000DA31AC /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 7E9F51AB19DA10AE00DA31AC /* __PROJECT_NAME__.m in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 7E9F519B19DA102000DA31AC /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 7E9F51B119DA114400DA31AC /* __PROJECT_NAME__Test.m in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXSourcesBuildPhase section */
-
-/* Begin PBXTargetDependency section */
- 7E9F51AD19DA10DE00DA31AC /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 7E9F519419DA102000DA31AC /* __PROJECT_NAME__Lib */;
- targetProxy = 7E9F51AC19DA10DE00DA31AC /* PBXContainerItemProxy */;
- };
- 7E9F51AF19DA10E100DA31AC /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- name = CordovaLib;
- targetProxy = 7E9F51AE19DA10E100DA31AC /* PBXContainerItemProxy */;
- };
-/* End PBXTargetDependency section */
-
-/* Begin XCBuildConfiguration section */
- 7E9F517619DA09CE00DA31AC /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- };
- name = Debug;
- };
- 7E9F517719DA09CE00DA31AC /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- };
- name = Release;
- };
- 7E9F51A419DA102000DA31AC /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
- CLANG_CXX_LIBRARY = "libc++";
- CLANG_ENABLE_MODULES = YES;
- CLANG_ENABLE_OBJC_ARC = YES;
- CLANG_WARN_BOOL_CONVERSION = YES;
- CLANG_WARN_CONSTANT_CONVERSION = YES;
- CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
- CLANG_WARN_EMPTY_BODY = YES;
- CLANG_WARN_ENUM_CONVERSION = YES;
- CLANG_WARN_INT_CONVERSION = YES;
- CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
- CLANG_WARN_UNREACHABLE_CODE = YES;
- CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
- COPY_PHASE_STRIP = NO;
- ENABLE_STRICT_OBJC_MSGSEND = YES;
- GCC_C_LANGUAGE_STANDARD = gnu99;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PREPROCESSOR_DEFINITIONS = (
- "DEBUG=1",
- "$(inherited)",
- );
- GCC_SYMBOLS_PRIVATE_EXTERN = NO;
- GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
- GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
- GCC_WARN_UNDECLARED_SELECTOR = YES;
- GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
- GCC_WARN_UNUSED_FUNCTION = YES;
- GCC_WARN_UNUSED_VARIABLE = YES;
- HEADER_SEARCH_PATHS = (
- "$(inherited)",
- "\"$(TARGET_BUILD_DIR)/usr/local/lib/include\"",
- "\"$(OBJROOT)/UninstalledProducts/include\"",
- "\"$(BUILT_PRODUCTS_DIR)\"",
- );
- IPHONEOS_DEPLOYMENT_TARGET = 8.0;
- MTL_ENABLE_DEBUG_INFO = YES;
- ONLY_ACTIVE_ARCH = YES;
- OTHER_LDFLAGS = "-ObjC";
- PRODUCT_NAME = "$(TARGET_NAME)";
- SDKROOT = iphoneos;
- SKIP_INSTALL = YES;
- };
- name = Debug;
- };
- 7E9F51A519DA102000DA31AC /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
- CLANG_CXX_LIBRARY = "libc++";
- CLANG_ENABLE_MODULES = YES;
- CLANG_ENABLE_OBJC_ARC = YES;
- CLANG_WARN_BOOL_CONVERSION = YES;
- CLANG_WARN_CONSTANT_CONVERSION = YES;
- CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
- CLANG_WARN_EMPTY_BODY = YES;
- CLANG_WARN_ENUM_CONVERSION = YES;
- CLANG_WARN_INT_CONVERSION = YES;
- CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
- CLANG_WARN_UNREACHABLE_CODE = YES;
- CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
- COPY_PHASE_STRIP = YES;
- ENABLE_NS_ASSERTIONS = NO;
- ENABLE_STRICT_OBJC_MSGSEND = YES;
- GCC_C_LANGUAGE_STANDARD = gnu99;
- GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
- GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
- GCC_WARN_UNDECLARED_SELECTOR = YES;
- GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
- GCC_WARN_UNUSED_FUNCTION = YES;
- GCC_WARN_UNUSED_VARIABLE = YES;
- HEADER_SEARCH_PATHS = (
- "$(inherited)",
- "\"$(TARGET_BUILD_DIR)/usr/local/lib/include\"",
- "\n\"$(OBJROOT)/UninstalledProducts/include\"\n\"$(BUILT_PRODUCTS_DIR)\"",
- );
- IPHONEOS_DEPLOYMENT_TARGET = 8.0;
- MTL_ENABLE_DEBUG_INFO = NO;
- OTHER_LDFLAGS = "-ObjC";
- PRODUCT_NAME = "$(TARGET_NAME)";
- SDKROOT = iphoneos;
- SKIP_INSTALL = YES;
- VALIDATE_PRODUCT = YES;
- };
- name = Release;
- };
- 7E9F51A719DA102000DA31AC /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
- CLANG_CXX_LIBRARY = "libc++";
- CLANG_ENABLE_MODULES = YES;
- CLANG_ENABLE_OBJC_ARC = YES;
- CLANG_WARN_BOOL_CONVERSION = YES;
- CLANG_WARN_CONSTANT_CONVERSION = YES;
- CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
- CLANG_WARN_EMPTY_BODY = YES;
- CLANG_WARN_ENUM_CONVERSION = YES;
- CLANG_WARN_INT_CONVERSION = YES;
- CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
- CLANG_WARN_UNREACHABLE_CODE = YES;
- CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
- COPY_PHASE_STRIP = NO;
- ENABLE_STRICT_OBJC_MSGSEND = YES;
- FRAMEWORK_SEARCH_PATHS = (
- "$(SDKROOT)/Developer/Library/Frameworks",
- "$(inherited)",
- );
- GCC_C_LANGUAGE_STANDARD = gnu99;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PREPROCESSOR_DEFINITIONS = (
- "DEBUG=1",
- "$(inherited)",
- );
- GCC_SYMBOLS_PRIVATE_EXTERN = NO;
- GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
- GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
- GCC_WARN_UNDECLARED_SELECTOR = YES;
- GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
- GCC_WARN_UNUSED_FUNCTION = YES;
- GCC_WARN_UNUSED_VARIABLE = YES;
- INFOPLIST_FILE = __PROJECT_NAME__LibTests/Info.plist;
- IPHONEOS_DEPLOYMENT_TARGET = 8.0;
- LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
- MTL_ENABLE_DEBUG_INFO = YES;
- ONLY_ACTIVE_ARCH = YES;
- PRODUCT_NAME = "$(TARGET_NAME)";
- SDKROOT = iphoneos;
- };
- name = Debug;
- };
- 7E9F51A819DA102000DA31AC /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
- CLANG_CXX_LIBRARY = "libc++";
- CLANG_ENABLE_MODULES = YES;
- CLANG_ENABLE_OBJC_ARC = YES;
- CLANG_WARN_BOOL_CONVERSION = YES;
- CLANG_WARN_CONSTANT_CONVERSION = YES;
- CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
- CLANG_WARN_EMPTY_BODY = YES;
- CLANG_WARN_ENUM_CONVERSION = YES;
- CLANG_WARN_INT_CONVERSION = YES;
- CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
- CLANG_WARN_UNREACHABLE_CODE = YES;
- CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
- COPY_PHASE_STRIP = YES;
- ENABLE_NS_ASSERTIONS = NO;
- ENABLE_STRICT_OBJC_MSGSEND = YES;
- FRAMEWORK_SEARCH_PATHS = (
- "$(SDKROOT)/Developer/Library/Frameworks",
- "$(inherited)",
- );
- GCC_C_LANGUAGE_STANDARD = gnu99;
- GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
- GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
- GCC_WARN_UNDECLARED_SELECTOR = YES;
- GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
- GCC_WARN_UNUSED_FUNCTION = YES;
- GCC_WARN_UNUSED_VARIABLE = YES;
- INFOPLIST_FILE = __PROJECT_NAME__LibTests/Info.plist;
- IPHONEOS_DEPLOYMENT_TARGET = 8.0;
- LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
- MTL_ENABLE_DEBUG_INFO = NO;
- PRODUCT_NAME = "$(TARGET_NAME)";
- SDKROOT = iphoneos;
- VALIDATE_PRODUCT = YES;
- };
- name = Release;
- };
-/* End XCBuildConfiguration section */
-
-/* Begin XCConfigurationList section */
- 7E9F517519DA09CE00DA31AC /* Build configuration list for PBXProject "__PROJECT_NAME__Test" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 7E9F517619DA09CE00DA31AC /* Debug */,
- 7E9F517719DA09CE00DA31AC /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
- 7E9F51A319DA102000DA31AC /* Build configuration list for PBXNativeTarget "__PROJECT_NAME__Lib" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 7E9F51A419DA102000DA31AC /* Debug */,
- 7E9F51A519DA102000DA31AC /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
- 7E9F51A619DA102000DA31AC /* Build configuration list for PBXNativeTarget "__PROJECT_NAME__LibTests" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 7E9F51A719DA102000DA31AC /* Debug */,
- 7E9F51A819DA102000DA31AC /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
-/* End XCConfigurationList section */
- };
- rootObject = 7E9F517219DA09CE00DA31AC /* Project object */;
-}
diff --git a/create-test-files/tests-template/ios/__PROJECT_NAME__Test/__PROJECT_NAME__Test.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/create-test-files/tests-template/ios/__PROJECT_NAME__Test/__PROJECT_NAME__Test.xcodeproj/project.xcworkspace/contents.xcworkspacedata
deleted file mode 100644
index 9856853..0000000
--- a/create-test-files/tests-template/ios/__PROJECT_NAME__Test/__PROJECT_NAME__Test.xcodeproj/project.xcworkspace/contents.xcworkspacedata
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<Workspace
- version = "1.0">
- <FileRef
- location = "self:__PROJECT_NAME__Test.xcodeproj">
- </FileRef>
-</Workspace>
diff --git a/create-test-files/tests-template/ios/__PROJECT_NAME__Test/__PROJECT_NAME__Test.xcodeproj/project.xcworkspace/xcshareddata/__PROJECT_NAME__Test.xccheckout b/create-test-files/tests-template/ios/__PROJECT_NAME__Test/__PROJECT_NAME__Test.xcodeproj/project.xcworkspace/xcshareddata/__PROJECT_NAME__Test.xccheckout
deleted file mode 100644
index b923e92..0000000
--- a/create-test-files/tests-template/ios/__PROJECT_NAME__Test/__PROJECT_NAME__Test.xcodeproj/project.xcworkspace/xcshareddata/__PROJECT_NAME__Test.xccheckout
+++ /dev/null
@@ -1,41 +0,0 @@
-<?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>IDESourceControlProjectFavoriteDictionaryKey</key>
- <false/>
- <key>IDESourceControlProjectIdentifier</key>
- <string>6BE9AD73-1B9F-4362-98D7-DC631BEC6185</string>
- <key>IDESourceControlProjectName</key>
- <string>__PROJECT_NAME__Test</string>
- <key>IDESourceControlProjectOriginsDictionary</key>
- <dict>
- <key>BEF5A5D0FF64801E558286389440357A9233D7DB</key>
- <string>https://git-wip-us.apache.org/repos/asf/__REPO_NAME__.git</string>
- </dict>
- <key>IDESourceControlProjectPath</key>
- <string>tests/ios/__PROJECT_NAME__Test/__PROJECT_NAME__Test.xcodeproj</string>
- <key>IDESourceControlProjectRelativeInstallPathDictionary</key>
- <dict>
- <key>BEF5A5D0FF64801E558286389440357A9233D7DB</key>
- <string>../../../../..</string>
- </dict>
- <key>IDESourceControlProjectURL</key>
- <string>https://git-wip-us.apache.org/repos/asf/__REPO_NAME__.git</string>
- <key>IDESourceControlProjectVersion</key>
- <integer>111</integer>
- <key>IDESourceControlProjectWCCIdentifier</key>
- <string>BEF5A5D0FF64801E558286389440357A9233D7DB</string>
- <key>IDESourceControlProjectWCConfigurations</key>
- <array>
- <dict>
- <key>IDESourceControlRepositoryExtensionIdentifierKey</key>
- <string>public.vcs.git</string>
- <key>IDESourceControlWCCIdentifierKey</key>
- <string>BEF5A5D0FF64801E558286389440357A9233D7DB</string>
- <key>IDESourceControlWCCName</key>
- <string>__REPO_NAME__</string>
- </dict>
- </array>
-</dict>
-</plist>
diff --git a/create-test-files/tests-template/ios/__PROJECT_NAME__Test/__PROJECT_NAME__Test.xcodeproj/xcshareddata/xcschemes/__PROJECT_NAME__Lib.xcscheme b/create-test-files/tests-template/ios/__PROJECT_NAME__Test/__PROJECT_NAME__Test.xcodeproj/xcshareddata/xcschemes/__PROJECT_NAME__Lib.xcscheme
deleted file mode 100644
index 666abac..0000000
--- a/create-test-files/tests-template/ios/__PROJECT_NAME__Test/__PROJECT_NAME__Test.xcodeproj/xcshareddata/xcschemes/__PROJECT_NAME__Lib.xcscheme
+++ /dev/null
@@ -1,77 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<Scheme
- LastUpgradeVersion = "0600"
- version = "1.3">
- <BuildAction
- parallelizeBuildables = "YES"
- buildImplicitDependencies = "YES">
- <BuildActionEntries>
- <BuildActionEntry
- buildForTesting = "YES"
- buildForRunning = "YES"
- buildForProfiling = "YES"
- buildForArchiving = "YES"
- buildForAnalyzing = "YES">
- <BuildableReference
- BuildableIdentifier = "primary"
- BlueprintIdentifier = "7E9F519419DA102000DA31AC"
- BuildableName = "lib__PROJECT_NAME__Lib.a"
- BlueprintName = "__PROJECT_NAME__Lib"
- ReferencedContainer = "container:__PROJECT_NAME__Test.xcodeproj">
- </BuildableReference>
- </BuildActionEntry>
- </BuildActionEntries>
- </BuildAction>
- <TestAction
- selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
- selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
- shouldUseLaunchSchemeArgsEnv = "YES"
- buildConfiguration = "Debug">
- <Testables>
- </Testables>
- </TestAction>
- <LaunchAction
- selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
- selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
- launchStyle = "0"
- useCustomWorkingDirectory = "NO"
- buildConfiguration = "Debug"
- ignoresPersistentStateOnLaunch = "NO"
- debugDocumentVersioning = "YES"
- allowLocationSimulation = "YES">
- <MacroExpansion>
- <BuildableReference
- BuildableIdentifier = "primary"
- BlueprintIdentifier = "7E9F519419DA102000DA31AC"
- BuildableName = "lib__PROJECT_NAME__Lib.a"
- BlueprintName = "__PROJECT_NAME__Lib"
- ReferencedContainer = "container:__PROJECT_NAME__Test.xcodeproj">
- </BuildableReference>
- </MacroExpansion>
- <AdditionalOptions>
- </AdditionalOptions>
- </LaunchAction>
- <ProfileAction
- shouldUseLaunchSchemeArgsEnv = "YES"
- savedToolIdentifier = ""
- useCustomWorkingDirectory = "NO"
- buildConfiguration = "Release"
- debugDocumentVersioning = "YES">
- <MacroExpansion>
- <BuildableReference
- BuildableIdentifier = "primary"
- BlueprintIdentifier = "7E9F519419DA102000DA31AC"
- BuildableName = "lib__PROJECT_NAME__Lib.a"
- BlueprintName = "__PROJECT_NAME__Lib"
- ReferencedContainer = "container:__PROJECT_NAME__Test.xcodeproj">
- </BuildableReference>
- </MacroExpansion>
- </ProfileAction>
- <AnalyzeAction
- buildConfiguration = "Debug">
- </AnalyzeAction>
- <ArchiveAction
- buildConfiguration = "Release"
- revealArchiveInOrganizer = "YES">
- </ArchiveAction>
-</Scheme>
diff --git a/create-test-files/tests-template/ios/__PROJECT_NAME__Test/__PROJECT_NAME__Test.xcodeproj/xcshareddata/xcschemes/__PROJECT_NAME__LibTests.xcscheme b/create-test-files/tests-template/ios/__PROJECT_NAME__Test/__PROJECT_NAME__Test.xcodeproj/xcshareddata/xcschemes/__PROJECT_NAME__LibTests.xcscheme
deleted file mode 100644
index c83241a..0000000
--- a/create-test-files/tests-template/ios/__PROJECT_NAME__Test/__PROJECT_NAME__Test.xcodeproj/xcshareddata/xcschemes/__PROJECT_NAME__LibTests.xcscheme
+++ /dev/null
@@ -1,96 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<Scheme
- LastUpgradeVersion = "0600"
- version = "1.3">
- <BuildAction
- parallelizeBuildables = "YES"
- buildImplicitDependencies = "YES">
- <BuildActionEntries>
- <BuildActionEntry
- buildForTesting = "YES"
- buildForRunning = "YES"
- buildForProfiling = "NO"
- buildForArchiving = "NO"
- buildForAnalyzing = "YES">
- <BuildableReference
- BuildableIdentifier = "primary"
- BlueprintIdentifier = "7E9F519E19DA102000DA31AC"
- BuildableName = "__PROJECT_NAME__LibTests.xctest"
- BlueprintName = "__PROJECT_NAME__LibTests"
- ReferencedContainer = "container:__PROJECT_NAME__Test.xcodeproj">
- </BuildableReference>
- </BuildActionEntry>
- </BuildActionEntries>
- </BuildAction>
- <TestAction
- selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
- selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
- shouldUseLaunchSchemeArgsEnv = "YES"
- buildConfiguration = "Debug">
- <Testables>
- <TestableReference
- skipped = "NO">
- <BuildableReference
- BuildableIdentifier = "primary"
- BlueprintIdentifier = "7E9F519E19DA102000DA31AC"
- BuildableName = "__PROJECT_NAME__LibTests.xctest"
- BlueprintName = "__PROJECT_NAME__LibTests"
- ReferencedContainer = "container:__PROJECT_NAME__Test.xcodeproj">
- </BuildableReference>
- </TestableReference>
- </Testables>
- <MacroExpansion>
- <BuildableReference
- BuildableIdentifier = "primary"
- BlueprintIdentifier = "7E9F519E19DA102000DA31AC"
- BuildableName = "__PROJECT_NAME__LibTests.xctest"
- BlueprintName = "__PROJECT_NAME__LibTests"
- ReferencedContainer = "container:__PROJECT_NAME__Test.xcodeproj">
- </BuildableReference>
- </MacroExpansion>
- </TestAction>
- <LaunchAction
- selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
- selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
- launchStyle = "0"
- useCustomWorkingDirectory = "NO"
- buildConfiguration = "Debug"
- ignoresPersistentStateOnLaunch = "NO"
- debugDocumentVersioning = "YES"
- allowLocationSimulation = "YES">
- <MacroExpansion>
- <BuildableReference
- BuildableIdentifier = "primary"
- BlueprintIdentifier = "7E9F519E19DA102000DA31AC"
- BuildableName = "__PROJECT_NAME__LibTests.xctest"
- BlueprintName = "__PROJECT_NAME__LibTests"
- ReferencedContainer = "container:__PROJECT_NAME__Test.xcodeproj">
- </BuildableReference>
- </MacroExpansion>
- <AdditionalOptions>
- </AdditionalOptions>
- </LaunchAction>
- <ProfileAction
- shouldUseLaunchSchemeArgsEnv = "YES"
- savedToolIdentifier = ""
- useCustomWorkingDirectory = "NO"
- buildConfiguration = "Release"
- debugDocumentVersioning = "YES">
- <MacroExpansion>
- <BuildableReference
- BuildableIdentifier = "primary"
- BlueprintIdentifier = "7E9F519E19DA102000DA31AC"
- BuildableName = "__PROJECT_NAME__LibTests.xctest"
- BlueprintName = "__PROJECT_NAME__LibTests"
- ReferencedContainer = "container:__PROJECT_NAME__Test.xcodeproj">
- </BuildableReference>
- </MacroExpansion>
- </ProfileAction>
- <AnalyzeAction
- buildConfiguration = "Debug">
- </AnalyzeAction>
- <ArchiveAction
- buildConfiguration = "Release"
- revealArchiveInOrganizer = "YES">
- </ArchiveAction>
-</Scheme>
diff --git a/create-test-files/tests-template/ios/package.json b/create-test-files/tests-template/ios/package.json
deleted file mode 100644
index d05fd19..0000000
--- a/create-test-files/tests-template/ios/package.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "name": "__REPO_NAME__-test-ios",
- "version": "1.0.0",
- "description": "iOS Unit Tests for __REPO_NAME__ Plugin",
- "author": "Apache Software Foundation",
- "license": "Apache Version 2.0",
- "dependencies": {
- "cordova-ios": "*"
- },
- "scripts": {
- "test": "xcodebuild test -workspace __PROJECT_NAME__Test.xcworkspace -scheme __PROJECT_NAME__LibTests -destination 'platform=iOS Simulator,name=iPhone 5' CONFIGURATION_BUILD_DIR='/tmp' HEADER_SEARCH_PATHS='$(OBJROOT)/UninstalledProducts/$(PLATFORM_NAME)/include'"
- }
-}
diff --git a/create-test-files/tests-template/plugin.xml b/create-test-files/tests-template/plugin.xml
deleted file mode 100644
index 52fc2ba..0000000
--- a/create-test-files/tests-template/plugin.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
--->
-
-<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
- id="__REPO_NAME__-tests"
- version="1.0.0-dev">
- <name>__REPO_NAME__ Tests</name>
- <license>Apache 2.0</license>
-
- <js-module src="tests.js" name="tests">
- </js-module>
-</plugin>
diff --git a/create-test-files/tests-template/tests.js b/create-test-files/tests-template/tests.js
deleted file mode 100644
index b94d56c..0000000
--- a/create-test-files/tests-template/tests.js
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
-*/
-
-/* jshint jasmine: true */
-
-exports.defineAutoTests = function () {
- describe('__REPO_NAME__ (cordova)', function () {
- it("__REPO_NAME__.spec.1 should exist", function () {
- //expect(window).toBeDefined();
- });
- });
-};
-
-exports.defineManualTests = function (contentEl, createActionButton) {
-
- contentEl.innerHTML = 'Your HTML instructions here';
-
- createActionButton('Do something 1', function () {
- // do something 1;
- }, 'do-something-1');
-
- createActionButton('Do something 2', function () {
- // do something 2;
- }, 'do-something-2');
-
-};
diff --git a/keyboard/README.md b/keyboard/README.md
deleted file mode 100644
index 76d8426..0000000
--- a/keyboard/README.md
+++ /dev/null
@@ -1,235 +0,0 @@
-Keyboard
-======
-
-> The `Keyboard` object provides some functions to customize the iOS keyboard.
-
-This plugin has only been tested in Cordova 3.2 or greater, and its use in previous Cordova versions is not recommended (potential conflict with keyboard customization code present in the core in previous Cordova versions).
-
-If you do use this plugin in an older Cordova version (again, not recommended), you have to make sure the HideKeyboardFormAccessoryBar and KeyboardShrinksView preference values are *always* false, and only use the API functions to turn things on/off.
-
-This plugin supports the __HideKeyboardFormAccessoryBar__ (boolean) and __KeyboardShrinksView__ (boolean) preferences in config.xml.
-
-Methods
--------
-
-- Keyboard.shrinkView
-- Keyboard.hideFormAccessoryBar
-- Keyboard.disableScrollingInShrinkView
-
-Properties
---------
-
-- Keyboard.isVisible
-
-Events
---------
-
-- Keyboard.onshow
-- Keyboard.onhide
-- Keyboard.onshowing
-- Keyboard.onhiding
-
-
-Permissions
------------
-
-#### config.xml
-
- <feature name="Keyboard">
- <param name="ios-package" value="CDVKeyboard" onload="true" />
- </feature>
-
-Keyboard.shrinkView
-=================
-
-Shrink the WebView when the keyboard comes up.
-
- Keyboard.shrinkView(true);
-
-Description
------------
-
-Set to true to shrink the WebView when the keyboard comes up. The WebView shrinks instead of the viewport shrinking and the page scrollable. This applies to apps that position their elements relative to the bottom of the WebView. This is the default behaviour on Android, and makes a lot of sense when building apps as opposed to webpages.
-
-
-Supported Platforms
--------------------
-
-- iOS
-
-Quick Example
--------------
-
- Keyboard.shrinkView(true);
- Keyboard.shrinkView(false);
-
-Keyboard.hideFormAccessoryBar
-=================
-
-Hide the keyboard toolbar.
-
- Keyboard.hideFormAccessoryBar(true);
-
-Description
------------
-
-Set to true to hide the additional toolbar that is on top of the keyboard. This toolbar features the Prev, Next, and Done buttons.
-
-
-Supported Platforms
--------------------
-
-- iOS
-
-Quick Example
--------------
-
- Keyboard.hideFormAccessoryBar(true);
- Keyboard.hideFormAccessoryBar(false);
-
-
-Keyboard.disableScrollingInShrinkView
-=================
-
-Disable scrolling when the the WebView is shrunk.
-
- Keyboard.disableScrollingInShrinkView(true);
-
-Description
------------
-
-Set to true to disable scrolling when the WebView is shrunk.
-
-
-Supported Platforms
--------------------
-
-- iOS
-
-Quick Example
--------------
-
- Keyboard.disableScrollingInShrinkView(true);
- Keyboard.disableScrollingInShrinkView(false);
-
-Keyboard.isVisible
-=================
-
-Determine if the keyboard is visible.
-
- if (Keyboard.isVisible) {
- // do something
- }
-
-Description
------------
-
-Read this property to determine if the keyboard is visible.
-
-
-Supported Platforms
--------------------
-
-- iOS
-
-Keyboard.automaticScrollToTopOnHiding
-=================
-
-Specifies whenether content of page would be autoamtically scrolled to the top of the page
-when keyboard is hiding.
-
- Keyboard.automaticScrollToTopOnHiding = true;
-
-Description
------------
-
-Set this to true if you need that page scroll to beginning when keyboard is hiding.
-This is allows to fix issue with elements declared with position: fixed,
-after keyboard is hiding.
-
-
-Supported Platforms
--------------------
-
-- iOS
-
-Keyboard.onshow
-=================
-
-If defined, this function fired when keyboard fully shown.
-
- Keyboard.onshow = function () {
- // Describe your logic which will be run each time keyboard is shown.
- }
-
-Description
------------
-
-Attach handler to this event to be able to receive notification when keyboard is shown.
-
-
-Supported Platforms
--------------------
-
-- iOS
-
-Keyboard.onhide
-=================
-
-If defined, this function fired when keyboard fully closed.
-
- Keyboard.onhide = function () {
- // Describe your logic which will be run each time keyboard is closed.
- }
-
-Description
------------
-
-Attach handler to this event to be able to receive notification when keyboard is closed.
-
-
-Supported Platforms
--------------------
-
-- iOS
-
-Keyboard.onshowing
-=================
-
-If defined, this function fired before keyboard will be shown.
-
- Keyboard.onshowing = function () {
- // Describe your logic which will be run each time when keyboard is about to be shown.
- }
-
-Description
------------
-
-Attach handler to this event to be able to receive notification when keyboard is about to be shown on the screen.
-
-
-Supported Platforms
--------------------
-
-- iOS
-
-Keyboard.onhiding
-=================
-
-If defined, this function fired when keyboard fully closed.
-
- Keyboard.onhiding = function () {
- // Describe your logic which will be run each time when keyboard is about to be closed.
- }
-
-Description
------------
-
-Attach handler to this event to be able to receive notification when keyboard is about to be closed.
-
-
-Supported Platforms
--------------------
-
-- iOS
-
diff --git a/keyboard/plugin.xml b/keyboard/plugin.xml
deleted file mode 100644
index 1eb1c29..0000000
--- a/keyboard/plugin.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
- xmlns:rim="http://www.blackberry.com/ns/widgets"
- xmlns:android="http://schemas.android.com/apk/res/android"
- id="org.apache.cordova.labs.keyboard"
- version="0.1.2">
- <name>Keyboard</name>
- <description>Cordova Keyboard Plugin</description>
- <license>Apache 2.0</license>
- <keywords>cordova,keyboard</keywords>
-
- <engines>
- <engine name="cordova" version=">=3.2.0" />
- </engines>
-
- <js-module src="www/keyboard.js" name="keyboard">
- <clobbers target="window.Keyboard" />
- </js-module>
-
- <!-- ios -->
- <platform name="ios">
- <config-file target="config.xml" parent="/*">
- <feature name="Keyboard">
- <param name="ios-package" value="CDVKeyboard" onload="true" />
- </feature>
- </config-file>
-
- <header-file src="src/ios/CDVKeyboard.h" />
- <source-file src="src/ios/CDVKeyboard.m" />
- </platform>
-
-</plugin>
diff --git a/keyboard/src/ios/CDVKeyboard.h b/keyboard/src/ios/CDVKeyboard.h
deleted file mode 100644
index 0b243ad..0000000
--- a/keyboard/src/ios/CDVKeyboard.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
- */
-
-#import <Cordova/CDVPlugin.h>
-
-@interface CDVKeyboard : CDVPlugin {
- @protected
- BOOL _shrinkView;
- @protected
- BOOL _hideFormAccessoryBar;
- @protected
- id _keyboardShowObserver, _keyboardHideObserver, _keyboardWillShowObserver, _keyboardWillHideObserver;
- @protected
- id _hideFormAccessoryBarKeyboardShowObserver, _hideFormAccessoryBarKeyboardHideObserver;
- @protected
- id _shrinkViewKeyboardWillChangeFrameObserver;
- @protected
- CGFloat _accessoryBarHeight;
-}
-
-@property (readwrite, assign) BOOL shrinkView;
-@property (readwrite, assign) BOOL disableScrollingInShrinkView;
-@property (readwrite, assign) BOOL hideFormAccessoryBar;
-@property (readonly, assign) BOOL keyboardIsVisible;
-
-
-- (void) shrinkView:(CDVInvokedUrlCommand*)command;
-- (void) disableScrollingInShrinkView:(CDVInvokedUrlCommand*)command;
-- (void) hideFormAccessoryBar:(CDVInvokedUrlCommand*)command;
-
-
-@end
diff --git a/keyboard/src/ios/CDVKeyboard.m b/keyboard/src/ios/CDVKeyboard.m
deleted file mode 100644
index f25e24a..0000000
--- a/keyboard/src/ios/CDVKeyboard.m
+++ /dev/null
@@ -1,330 +0,0 @@
-/*
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
- */
-
-#import "CDVKeyboard.h"
-#import <Cordova/CDVAvailability.h>
-
-#ifndef __CORDOVA_3_2_0
-#warning "The keyboard plugin is only supported in Cordova 3.2 or greater, it may not work properly in an older version. If you do use this plugin in an older version, make sure the HideKeyboardFormAccessoryBar and KeyboardShrinksView preference values are false."
-#endif
-
-@interface CDVKeyboard () <UIScrollViewDelegate>
-
-@property (nonatomic, readwrite, assign) BOOL keyboardIsVisible;
-
-@end
-
-@implementation CDVKeyboard
-
-@dynamic hideFormAccessoryBar;
-
-- (id)settingForKey:(NSString*)key
-{
- return [self.commandDelegate.settings objectForKey:[key lowercaseString]];
-}
-
-- (void)pluginInitialize
-{
- // SETTINGS ////////////////////////
-
- NSString* setting = nil;
-
- setting = @"HideKeyboardFormAccessoryBar";
- if ([self settingForKey:setting]) {
- self.hideFormAccessoryBar = [(NSNumber*)[self settingForKey:setting] boolValue];
- }
-
- setting = @"KeyboardShrinksView";
- if ([self settingForKey:setting]) {
- self.shrinkView = [(NSNumber*)[self settingForKey:setting] boolValue];
- }
-
- setting = @"DisableScrollingWhenKeyboardShrinksView";
- if ([self settingForKey:setting]) {
- self.disableScrollingInShrinkView = [(NSNumber*)[self settingForKey:setting] boolValue];
- }
-
- //////////////////////////
-
- NSNotificationCenter* nc = [NSNotificationCenter defaultCenter];
- __weak CDVKeyboard* weakSelf = self;
-
- _keyboardShowObserver = [nc addObserverForName:UIKeyboardDidShowNotification
- object:nil
- queue:[NSOperationQueue mainQueue]
- usingBlock:^(NSNotification* notification) {
- [weakSelf.commandDelegate evalJs:@"Keyboard.fireOnShow();"];
- }];
- _keyboardHideObserver = [nc addObserverForName:UIKeyboardDidHideNotification
- object:nil
- queue:[NSOperationQueue mainQueue]
- usingBlock:^(NSNotification* notification) {
- [weakSelf.commandDelegate evalJs:@"Keyboard.fireOnHide();"];
- }];
-
- _keyboardWillShowObserver = [nc addObserverForName:UIKeyboardWillShowNotification
- object:nil
- queue:[NSOperationQueue mainQueue]
- usingBlock:^(NSNotification* notification) {
- [weakSelf.commandDelegate evalJs:@"Keyboard.fireOnShowing();"];
- weakSelf.keyboardIsVisible = YES;
- }];
- _keyboardWillHideObserver = [nc addObserverForName:UIKeyboardWillHideNotification
- object:nil
- queue:[NSOperationQueue mainQueue]
- usingBlock:^(NSNotification* notification) {
- [weakSelf.commandDelegate evalJs:@"Keyboard.fireOnHiding();"];
- weakSelf.keyboardIsVisible = NO;
- }];
-
- _shrinkViewKeyboardWillChangeFrameObserver = [nc addObserverForName:UIKeyboardWillChangeFrameNotification
- object:nil
- queue:[NSOperationQueue mainQueue]
- usingBlock:^(NSNotification* notification) {
- [weakSelf performSelector:@selector(shrinkViewKeyboardWillChangeFrame:) withObject:notification afterDelay:0];
- }];
-
- self.webView.scrollView.delegate = self;
-
- _accessoryBarHeight = 44;
-}
-
-// //////////////////////////////////////////////////
-
-- (BOOL)hideFormAccessoryBar
-{
- return _hideFormAccessoryBar;
-}
-
-- (void)setHideFormAccessoryBar:(BOOL)ahideFormAccessoryBar
-{
- NSNotificationCenter* nc = [NSNotificationCenter defaultCenter];
- __weak CDVKeyboard* weakSelf = self;
-
- if (ahideFormAccessoryBar == _hideFormAccessoryBar) {
- return;
- }
-
- if (ahideFormAccessoryBar) {
- [nc removeObserver:_hideFormAccessoryBarKeyboardShowObserver];
- _hideFormAccessoryBarKeyboardShowObserver = [nc addObserverForName:UIKeyboardWillShowNotification
- object:nil
- queue:[NSOperationQueue mainQueue]
- usingBlock:^(NSNotification* notification) {
- // we can't hide it here because the accessory bar hasn't been created yet, so we delay on the queue
- [weakSelf performSelector:@selector(formAccessoryBarKeyboardWillShow:) withObject:notification afterDelay:0];
- }];
-
- [nc removeObserver:_hideFormAccessoryBarKeyboardHideObserver];
- _hideFormAccessoryBarKeyboardHideObserver = [nc addObserverForName:UIKeyboardWillHideNotification
- object:nil
- queue:[NSOperationQueue mainQueue]
- usingBlock:^(NSNotification* notification) {
- [weakSelf formAccessoryBarKeyboardWillHide:notification];
- }];
- } else {
- [nc removeObserver:_hideFormAccessoryBarKeyboardShowObserver];
- [nc removeObserver:_hideFormAccessoryBarKeyboardHideObserver];
-
- // if a keyboard is already visible (and the accessorybar was hidden), hide observer will NOT be called, so we observe it once
- if (self.keyboardIsVisible && _hideFormAccessoryBar) {
- _hideFormAccessoryBarKeyboardHideObserver = [nc addObserverForName:UIKeyboardWillHideNotification
- object:nil
- queue:[NSOperationQueue mainQueue]
- usingBlock:^(NSNotification* notification) {
- [weakSelf formAccessoryBarKeyboardWillHide:notification];
- [[NSNotificationCenter defaultCenter] removeObserver:_hideFormAccessoryBarKeyboardHideObserver];
- }];
- }
- }
-
- _hideFormAccessoryBar = ahideFormAccessoryBar;
-}
-
-// //////////////////////////////////////////////////
-
-- (NSArray*)getKeyboardViews:(UIView*)viewToSearch{
- NSArray *subViews;
-
- for (UIView *possibleFormView in viewToSearch.subviews) {
- if ([[possibleFormView description] hasPrefix: self.getKeyboardFirstLevelIdentifier]) {
- if(IsAtLeastiOSVersion(@"8.0")){
- for (UIView* subView in possibleFormView.subviews) {
- return subView.subviews;
- }
- }else{
- return possibleFormView.subviews;
- }
- }
-
- }
- return subViews;
-}
-
-- (NSString*)getKeyboardFirstLevelIdentifier{
- if(!IsAtLeastiOSVersion(@"8.0")){
- return @"<UIPeripheralHostView";
- }else{
- return @"<UIInputSetContainerView";
- }
-}
-
-
-- (void)formAccessoryBarKeyboardWillShow:(NSNotification*)notif
-{
- if (!_hideFormAccessoryBar) {
- return;
- }
-
- UIWindow *keyboardWindow = nil;
- for (UIWindow *windows in [[UIApplication sharedApplication] windows]) {
- if (![[windows class] isEqual:[UIWindow class]]) {
- keyboardWindow = windows;
- break;
- }
- }
-
- for (UIView* peripheralView in [self getKeyboardViews:keyboardWindow]) {
-
- // hides the backdrop (iOS 7)
- if ([[peripheralView description] hasPrefix:@"<UIKBInputBackdropView"]) {
- // check that this backdrop is for the accessory bar (at the top),
- // sparing the backdrop behind the main keyboard
- CGRect rect = peripheralView.frame;
- if (rect.origin.y == 0) {
- [[peripheralView layer] setOpacity:0.0];
- }
- }
-
- // hides the accessory bar
- if ([[peripheralView description] hasPrefix:@"<UIWebFormAccessory"]) {
- //remove the extra scroll space for the form accessory bar
- CGRect newFrame = self.webView.scrollView.frame;
- newFrame.size.height += peripheralView.frame.size.height;
- self.webView.scrollView.frame = newFrame;
-
- _accessoryBarHeight = peripheralView.frame.size.height;
-
- // remove the form accessory bar
- if(IsAtLeastiOSVersion(@"8.0")){
- [[peripheralView layer] setOpacity:0.0];
- }else{
- [peripheralView removeFromSuperview];
- }
-
- }
- // hides the thin grey line used to adorn the bar (iOS 6)
- if ([[peripheralView description] hasPrefix:@"<UIImageView"]) {
- [[peripheralView layer] setOpacity:0.0];
- }
- }
-}
-
-- (void)formAccessoryBarKeyboardWillHide:(NSNotification*)notif
-{
- // restore the scrollview frame
- self.webView.scrollView.frame = CGRectMake(0, 0, self.webView.frame.size.width, self.webView.frame.size.height);
-}
-
-// //////////////////////////////////////////////////
-
-- (void)shrinkViewKeyboardWillChangeFrame:(NSNotification*)notif
-{
- // No-op on iOS7.0. It already resizes webview by default, and this plugin is causing layout issues
- // with fixed position elements. We possibly should attempt to implement shringview = false on iOS7.0.
- // iOS 7.1+ behave the same way as iOS 6
- if (NSFoundationVersionNumber == NSFoundationVersionNumber_iOS_7_0){
- return;
- }
-
- self.webView.scrollView.scrollEnabled = YES;
-
- CGRect screen = self.webView.frame.origin.y > 0 ?
- [self.viewController.view convertRect:[[UIScreen mainScreen] applicationFrame] fromView:nil]:
- [self.viewController.view convertRect:[[UIScreen mainScreen] bounds] fromView:nil];
-
- CGRect keyboard = [self.viewController.view convertRect: ((NSValue*)notif.userInfo[@"UIKeyboardFrameEndUserInfoKey"]).CGRectValue fromView: nil];
- CGRect keyboardIntersection = CGRectIntersection(screen, keyboard);
-
- if(CGRectContainsRect(screen, keyboardIntersection) && !CGRectIsEmpty(keyboardIntersection) && _shrinkView && self.keyboardIsVisible){
- screen.size.height -= MIN(keyboardIntersection.size.height, keyboardIntersection.size.width);
-
- if (_hideFormAccessoryBar){
- screen.size.height += _accessoryBarHeight;
- }
-
- self.webView.scrollView.scrollEnabled = !self.disableScrollingInShrinkView;
- }
-
- self.webView.frame = screen;
-}
-
-// //////////////////////////////////////////////////
-
-- (void)dealloc
-{
- // since this is ARC, remove observers only
-
- NSNotificationCenter* nc = [NSNotificationCenter defaultCenter];
-
- [nc removeObserver:self name:UIKeyboardWillShowNotification object:nil];
- [nc removeObserver:self name:UIKeyboardWillHideNotification object:nil];
-}
-
-// //////////////////////////////////////////////////
-
-#pragma mark Plugin interface
-
-- (void) shrinkView:(CDVInvokedUrlCommand*)command
-{
- id value = [command.arguments objectAtIndex:0];
- if (!([value isKindOfClass:[NSNumber class]])) {
- value = [NSNumber numberWithBool:NO];
- }
-
- self.shrinkView = [value boolValue];
-}
-
-- (void) disableScrollingInShrinkView:(CDVInvokedUrlCommand*)command
-{
- id value = [command.arguments objectAtIndex:0];
- if (!([value isKindOfClass:[NSNumber class]])) {
- value = [NSNumber numberWithBool:NO];
- }
-
- self.disableScrollingInShrinkView = [value boolValue];
-}
-
-- (void) hideFormAccessoryBar:(CDVInvokedUrlCommand*)command
-{
- id value = [command.arguments objectAtIndex:0];
- if (!([value isKindOfClass:[NSNumber class]])) {
- value = [NSNumber numberWithBool:NO];
- }
-
- self.hideFormAccessoryBar = [value boolValue];
-}
-
-#pragma mark UIScrollViewDelegate
-- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
- if(_shrinkView){
- scrollView.bounds = self.webView.bounds;
- }
-}
-@end
diff --git a/keyboard/www/keyboard.js b/keyboard/www/keyboard.js
deleted file mode 100644
index b9bbae7..0000000
--- a/keyboard/www/keyboard.js
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
-*/
-
-var argscheck = require('cordova/argscheck'),
- utils = require('cordova/utils'),
- exec = require('cordova/exec');
-
-var Keyboard = function() {
-};
-
-Keyboard.shrinkView = function(shrink) {
- exec(null, null, "Keyboard", "shrinkView", [shrink]);
-};
-
-Keyboard.hideFormAccessoryBar = function(hide) {
- exec(null, null, "Keyboard", "hideFormAccessoryBar", [hide]);
-};
-
-Keyboard.disableScrollingInShrinkView = function(disable) {
- exec(null, null, "Keyboard", "disableScrollingInShrinkView", [disable]);
-};
-
-Keyboard.fireOnShow = function() {
- Keyboard.isVisible = true;
- if (Keyboard.onshow) {
- Keyboard.onshow();
- }
-};
-Keyboard.fireOnHide = function() {
- Keyboard.isVisible = false;
- if (Keyboard.onhide) {
- Keyboard.onhide();
- }
-};
-Keyboard.fireOnHiding = function() {
- // Automatic scroll to the top of the page
- // to prevent quirks when using position:fixed elements
- // inside WebKit browsers (iOS specifically).
- // See CB-6444 for context.
- if (Keyboard.automaticScrollToTopOnHiding) {
- document.body.scrollLeft = 0;
- }
-
- if (Keyboard.onhiding) {
- Keyboard.onhiding();
- }
-};
-Keyboard.fireOnShowing = function() {
- if (Keyboard.onshowing) {
- Keyboard.onshowing();
- }
-};
-
-Keyboard.isVisible = false;
-Keyboard.automaticScrollToTopOnHiding = false;
-
-module.exports = Keyboard;
diff --git a/local-webserver/README.md b/local-webserver/README.md
deleted file mode 100644
index ba6afb4..0000000
--- a/local-webserver/README.md
+++ /dev/null
@@ -1,40 +0,0 @@
-# Cordova Local WebServer
-
-This Apache Cordova plugin will install a local web server in your iOS app, and will serve the contents of your `www` directory, looking for an index page of `index.html`.
-
-After the plugin is installed, it changes the `config.xml` in your project root by modifying this tag to:
-
- <content src="http://localhost:0" />
-
-For the local web server to start, the url **must** be http://localhost, and you can set the port to whatever you want in the url, the local web server will use this as the port automatically. `If you set the port to "0", it will select a randomized and free port.`
-
-Check your console log for errors in configuration.
-
-### localStorage, IndexedDB persistence
-
-If you plan on using HTML5 localStorage and/or IndexedDB, you must choose a fixed port in the `content` tag specified above. This is because of the HTML5 Origin policy (scheme, domain and port must be the same).
-
-In the `config.xml` in your project root, change the '0' port to a number between 1 and 49152 (avoiding the ephemeral port range of 49152 to 65535 on iOS). For example:
-
- <content src="http://localhost:49000" />
-
-
-This port number must be consistent across all app launches for saved data to be accessed.
-
-
-## Security Caveats
-
- In order to limit access to your app, requests are restricted to localhost and are protected with an auth token.
- This should effectively restrict access to the server to your app.
-
-This plugin is only compatible with the 3.7.0 release of cordova-ios, or greater.
-
-
-## Credits
-
-The local web server implementation is from https://github.com/swisspol/GCDWebServer
-
-To update with the latest from that repo execute in the top-level directory:
-
- git remote add GCDWebServer https://github.com/swisspol/GCDWebServer.git
- git subtree pull --prefix=local-webserver/src/ios/GCDWebServer --squash GCDWebServer master
diff --git a/local-webserver/package.json b/local-webserver/package.json
deleted file mode 100644
index 9c99957..0000000
--- a/local-webserver/package.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
- "name": "cordova-labs-local-webserver",
- "version": "2.3.1",
- "description": "Cordova Local Web Server Plugin",
- "cordova": {
- "id": "cordova-labs-local-webserver",
- "platforms": [
- "ios"
- ]
- },
- "repository": {
- "type": "git",
- "url": "git+https://github.com/Collaborne/cordova-plugins.git"
- },
- "keywords": [
- "cordova",
- "local web server",
- "ecosystem:cordova",
- "cordova-ios"
- ],
- "engines": [
- {
- "name": "cordova-ios",
- "version": ">=4.0.0-dev"
- }
- ],
- "author": "",
- "license": "Apache-2.0",
- "bugs": {
- "url": "https://github.com/Collaborne/cordova-plugins/issues"
- },
- "homepage": "https://github.com/Collaborne/cordova-plugins#readme",
- "dependencies": {
- "urijs": "^1.17.1"
- }
-}
diff --git a/local-webserver/plugin.xml b/local-webserver/plugin.xml
deleted file mode 100644
index 42b3f9f..0000000
--- a/local-webserver/plugin.xml
+++ /dev/null
@@ -1,94 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
--->
-<plugin id="cordova-labs-local-webserver" version="2.4.0" xmlns="http://apache.org/cordova/ns/plugins/1.0" xmlns:android="http://schemas.android.com/apk/res/android">
- <name>CordovaLocalWebServer</name>
- <description>Cordova Local Web Server Plugin</description>
- <keywords>cordova,local web server</keywords>
- <repo>https://git-wip-us.apache.org/repos/asf/cordova-plugins.git</repo>
-
- <hook type="after_plugin_install" src="scripts/after_install.js" />
- <hook type="before_plugin_uninstall" src="scripts/before_uninstall.js" />
-
- <dependency id="cordova-plugin-file" url="https://git-wip-us.apache.org/repos/asf/cordova-plugin-file.git" version=">=1.3.4" />
-
- <engines>
- <engine name="cordova-ios" version=">=4.1.0" />
- </engines>
-
- <!-- ios -->
- <platform name="ios">
-
- <config-file target="config.xml" parent="/*">
- <feature name="CordovaLocalWebServer">
- <param name="ios-package" value="CDVLocalWebServer"/>
- <param name="onload" value="true"/>
- </feature>
- <preference name="CordovaLocalWebServerStartOnSimulator" value="true" />
- <access origin="http://localhost" />
- <allow-navigation href="http://localhost:*/*" />
- </config-file>
-
-
- <header-file src="src/ios/CDVLocalWebServer.h" />
- <source-file src="src/ios/CDVLocalWebServer.m" />
-
- <header-file src="src/ios/GCDWebServer/GCDWebServer/Core/GCDWebServer.h" />
- <header-file src="src/ios/GCDWebServer/GCDWebServer/Core/GCDWebServerConnection.h" />
- <header-file src="src/ios/GCDWebServer/GCDWebServer/Core/GCDWebServerFunctions.h" />
- <header-file src="src/ios/GCDWebServer/GCDWebServer/Core/GCDWebServerHTTPStatusCodes.h" />
- <header-file src="src/ios/GCDWebServer/GCDWebServer/Core/GCDWebServerPrivate.h" />
- <header-file src="src/ios/GCDWebServer/GCDWebServer/Core/GCDWebServerRequest.h" />
- <header-file src="src/ios/GCDWebServer/GCDWebServer/Core/GCDWebServerResponse.h" />
- <source-file src="src/ios/GCDWebServer/GCDWebServer/Core/GCDWebServer.m" />
- <source-file src="src/ios/GCDWebServer/GCDWebServer/Core/GCDWebServerConnection.m" />
- <source-file src="src/ios/GCDWebServer/GCDWebServer/Core/GCDWebServerFunctions.m" />
- <source-file src="src/ios/GCDWebServer/GCDWebServer/Core/GCDWebServerRequest.m" />
- <source-file src="src/ios/GCDWebServer/GCDWebServer/Core/GCDWebServerResponse.m" />
-
- <header-file src="src/ios/GCDWebServer/GCDWebServer/Requests/GCDWebServerDataRequest.h" />
- <header-file src="src/ios/GCDWebServer/GCDWebServer/Requests/GCDWebServerFileRequest.h" />
- <header-file src="src/ios/GCDWebServer/GCDWebServer/Requests/GCDWebServerMultiPartFormRequest.h" />
- <header-file src="src/ios/GCDWebServer/GCDWebServer/Requests/GCDWebServerURLEncodedFormRequest.h" />
- <source-file src="src/ios/GCDWebServer/GCDWebServer/Requests/GCDWebServerDataRequest.m" />
- <source-file src="src/ios/GCDWebServer/GCDWebServer/Requests/GCDWebServerFileRequest.m" />
- <source-file src="src/ios/GCDWebServer/GCDWebServer/Requests/GCDWebServerMultiPartFormRequest.m" />
- <source-file src="src/ios/GCDWebServer/GCDWebServer/Requests/GCDWebServerURLEncodedFormRequest.m" />
-
- <header-file src="src/ios/GCDWebServer/GCDWebServer/Responses/GCDWebServerDataResponse.h" />
- <header-file src="src/ios/GCDWebServer/GCDWebServer/Responses/GCDWebServerErrorResponse.h" />
- <header-file src="src/ios/GCDWebServer/GCDWebServer/Responses/GCDWebServerFileResponse.h" />
- <header-file src="src/ios/GCDWebServer/GCDWebServer/Responses/GCDWebServerStreamedResponse.h" />
- <source-file src="src/ios/GCDWebServer/GCDWebServer/Responses/GCDWebServerDataResponse.m" />
- <source-file src="src/ios/GCDWebServer/GCDWebServer/Responses/GCDWebServerErrorResponse.m" />
- <source-file src="src/ios/GCDWebServer/GCDWebServer/Responses/GCDWebServerFileResponse.m" />
- <source-file src="src/ios/GCDWebServer/GCDWebServer/Responses/GCDWebServerStreamedResponse.m" />
-
- <framework src="AssetsLibrary.framework" />
- <framework src="MobileCoreServices.framework" />
- <framework src="CFNetwork.framework" />
- <framework src="libz.dylib" />
-
- <info>
- If your <content> element did not already point to 'http://localhost[:port]', it will now point to a http://localhost:0 location (randomized port), e.g. <content src="http://localhost:0" />
- WARNING: For localStorage and IndexedDB persistence, you must choose a non-randomized port (between 1 and 49152, to avoid the ephemeral port range 49152 to 65535 on iOS).
- </info>
-
- </platform>
-</plugin>
diff --git a/local-webserver/scripts/after_install.js b/local-webserver/scripts/after_install.js
deleted file mode 100644
index 90768d8..0000000
--- a/local-webserver/scripts/after_install.js
+++ /dev/null
@@ -1,61 +0,0 @@
-#!/usr/bin/env node
-
-/*
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
- */
-
-// This script modifies the project root's config.xml
-// The <content> tag "src" attribute is modified to point to http://localhost:0
-
-var fs = require('fs');
-var path = require('path');
-var URI = require('url');
-var old_content_src_value;
-
-module.exports = function(context) {
- var config_xml = path.join(context.opts.projectRoot, 'config.xml');
- var et = context.requireCordovaModule('elementtree');
-
- var data = fs.readFileSync(config_xml).toString();
- var etree = et.parse(data);
-
- var content_tags = etree.findall('./content[@src]');
- if (content_tags.length > 0) {
- old_content_src_value = content_tags[0].get('src');
- var content_src = URI.parse(old_content_src_value);
- if (content_src.hostname !== 'localhost') {
- var backup_json = path.join(context.opts.plugin.dir, 'backup.json');
- var backup_value = { content_src : old_content_src_value };
- fs.writeFileSync(backup_json, JSON.stringify(backup_value));
-
- // XXX: Should we retain the name of the index file here?
- content_tags[0].set('src', 'http://localhost:0');
- }
- }
-
- var altcontentsrcTag = etree.findall("./preference[@name='AlternateContentSrc']");
- if (altcontentsrcTag.length > 0) {
- altcontentsrcTag[0].set('value', old_content_src_value);
- } else {
- var pref = et.Element('preference', { name: 'AlternateContentSrc', value: old_content_src_value });
- etree.getroot().append(pref);
- }
-
- data = etree.write({'indent': 4});
- fs.writeFileSync(config_xml, data);
-}
diff --git a/local-webserver/scripts/before_uninstall.js b/local-webserver/scripts/before_uninstall.js
deleted file mode 100644
index ee3bb25..0000000
--- a/local-webserver/scripts/before_uninstall.js
+++ /dev/null
@@ -1,62 +0,0 @@
-#!/usr/bin/env node
-
-/*
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
- */
-
-// This script modifies the project root's config.xml
-// This restores the content tag's src attribute to its original value.
-
-var content_src_value = "http://localhost:0";
-var fs = require('fs');
-var path = require('path');
-var old_content_src_value;
-
-module.exports = function(context) {
- var config_xml = path.join(context.opts.projectRoot, 'config.xml');
- var et = context.requireCordovaModule('elementtree');
-
- var data = fs.readFileSync(config_xml).toString();
- var etree = et.parse(data);
-
- var content_tags = etree.findall('./content[@src]');
- if (content_tags.length > 0) {
- var backup_json = path.join(context.opts.plugin.dir, 'backup.json');
- var backup_data = JSON.parse(fs.readFileSync(backup_json).toString());
-
- var config_content_src_value = content_tags[0].get('src');
- // it's our value, we can restore old value
- if (config_content_src_value === content_src_value) {
- content_tags[0].set('src', backup_data.content_src);
- }
- }
-
- var altcontentsrcTag = etree.findall("./preference[@name='AlternateContentSrc']");
- if (altcontentsrcTag.length > 0) {
- try {
- // elementtree 0.1.6
- etree.getroot().remove(altcontentsrcTag[0]);
- } catch (e) {
- // elementtree 0.1.5
- etree.getroot().remove(0, altcontentsrcTag[0]);
- }
- }
-
- data = etree.write({'indent': 4});
- fs.writeFileSync(config_xml, data);
-}
diff --git a/local-webserver/src/ios/CDVLocalWebServer.h b/local-webserver/src/ios/CDVLocalWebServer.h
deleted file mode 100644
index e5be9f6..0000000
--- a/local-webserver/src/ios/CDVLocalWebServer.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
- */
-
-#import <Cordova/CDVPlugin.h>
-#import "GCDWebServer.h"
-
-@interface CDVLocalWebServer : CDVPlugin
-
-@property (nonatomic, strong) GCDWebServer* server;
-@end
diff --git a/local-webserver/src/ios/CDVLocalWebServer.m b/local-webserver/src/ios/CDVLocalWebServer.m
deleted file mode 100644
index 91e977f..0000000
--- a/local-webserver/src/ios/CDVLocalWebServer.m
+++ /dev/null
@@ -1,368 +0,0 @@
-/*
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
- */
-
-#import "CDVLocalWebServer.h"
-#import "GCDWebServerPrivate.h"
-#import <Cordova/CDVViewController.h>
-#import <Cordova/NSDictionary+CordovaPreferences.h>
-#import <AssetsLibrary/AssetsLibrary.h>
-#import <MobileCoreServices/MobileCoreServices.h>
-#import <objc/message.h>
-#import <netinet/in.h>
-
-
-#define LOCAL_FILESYSTEM_PATH @"local-filesystem"
-#define ASSETS_LIBRARY_PATH @"assets-library"
-#define ERROR_PATH @"error"
-
-@interface GCDWebServer()
-- (GCDWebServerResponse*)_responseWithContentsOfDirectory:(NSString*)path;
-@end
-
-
-@implementation CDVLocalWebServer
-
-- (void) pluginInitialize {
-
- BOOL useLocalWebServer = NO;
- BOOL requirementsOK = NO;
- NSString* indexPage = @"index.html";
- NSString* appBasePath = @"www";
- NSUInteger port = 80;
-
- // check the content tag src
- CDVViewController* vc = (CDVViewController*)self.viewController;
- NSURL* startPageUrl = [NSURL URLWithString:vc.startPage];
- if (startPageUrl != nil) {
- if ([[startPageUrl scheme] isEqualToString:@"http"] && [[startPageUrl host] isEqualToString:@"localhost"]) {
- port = [[startPageUrl port] unsignedIntegerValue];
- useLocalWebServer = YES;
- }
- }
-
- requirementsOK = [self checkRequirements];
- if (!requirementsOK) {
- useLocalWebServer = NO;
- NSString* alternateContentSrc = [self.commandDelegate.settings cordovaSettingForKey:@"AlternateContentSrc"];
- vc.startPage = alternateContentSrc? alternateContentSrc : indexPage;
- }
-
- // check setting
-#if TARGET_IPHONE_SIMULATOR
- if (useLocalWebServer) {
- NSNumber* startOnSimulatorSetting = [[self.commandDelegate settings] objectForKey:[@"CordovaLocalWebServerStartOnSimulator" lowercaseString]];
- if (startOnSimulatorSetting) {
- useLocalWebServer = [startOnSimulatorSetting boolValue];
- }
- }
-#endif
-
- if (port == 0) {
- // CB-9096 - actually test for an available port, and set it explicitly
- port = [self _availablePort];
- }
-
- NSString* authToken = [NSString stringWithFormat:@"cdvToken=%@", [[NSProcessInfo processInfo] globallyUniqueString]];
-
- self.server = [[GCDWebServer alloc] init];
- [GCDWebServer setLogLevel:kGCDWebServerLoggingLevel_Error];
-
- if (useLocalWebServer) {
- [self addAppFileSystemHandler:authToken basePath:[NSString stringWithFormat:@"/%@/", appBasePath] indexPage:indexPage];
-
- // add after server is started to get the true port
- [self addFileSystemHandlers:authToken];
- [self addErrorSystemHandler:authToken];
-
- // handlers must be added before server starts
- [self.server startWithPort:port bonjourName:nil];
-
- // Update the startPage (supported in cordova-ios 3.7.0, see https://issues.apache.org/jira/browse/CB-7857)
- vc.startPage = [NSString stringWithFormat:@"http://localhost:%lu/%@/%@?%@", (unsigned long)self.server.port, appBasePath, indexPage, authToken];
-
- } else {
- if (requirementsOK) {
- NSString* error = [NSString stringWithFormat:@"WARNING: CordovaLocalWebServer: <content> tag src is not http://localhost[:port] (is %@).", vc.startPage];
- NSLog(@"%@", error);
-
- [self addErrorSystemHandler:authToken];
-
- // handlers must be added before server starts
- [self.server startWithPort:port bonjourName:nil];
-
- vc.startPage = [self createErrorUrl:error authToken:authToken];
- } else {
- GWS_LOG_ERROR(@"%@ stopped, failed requirements check.", [self.server class]);
- }
- }
-}
-
-- (NSUInteger) _availablePort
-{
- struct sockaddr_in addr4;
- bzero(&addr4, sizeof(addr4));
- addr4.sin_len = sizeof(addr4);
- addr4.sin_family = AF_INET;
- addr4.sin_port = 0; // set to 0 and bind to find available port
- addr4.sin_addr.s_addr = htonl(INADDR_ANY);
-
- int listeningSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
- if (bind(listeningSocket, (const void*)&addr4, sizeof(addr4)) == 0) {
- struct sockaddr addr;
- socklen_t addrlen = sizeof(addr);
- if (getsockname(listeningSocket, &addr, &addrlen) == 0) {
- struct sockaddr_in* sockaddr = (struct sockaddr_in*)&addr;
- close(listeningSocket);
- return ntohs(sockaddr->sin_port);
- }
- }
-
- return 0;
-}
-
-- (BOOL) checkRequirements
-{
- NSString* pluginName = @"CDVWKWebViewEngine";
-
- BOOL hasWkWebView = NSClassFromString(@"WKWebView") != nil;
- BOOL wkEnginePlugin = [[self.commandDelegate.settings cordovaSettingForKey:@"CordovaWebViewEngine"] isEqualToString:pluginName];
-
- if (!hasWkWebView) {
- NSLog(@"[ERROR] %@: WKWebView class not found in the current runtime version.", [self class]);
- }
-
- if (!wkEnginePlugin) {
- NSLog(@"[ERROR] %@: CordovaWebViewEngine preference must be %@", [self class], pluginName);
- }
-
- return hasWkWebView && wkEnginePlugin;
-}
-
-- (NSString*) createErrorUrl:(NSString*)error authToken:(NSString*)authToken
-{
- return [NSString stringWithFormat:@"http://localhost:%lu/%@/%@?%@", (unsigned long)self.server.port, ERROR_PATH, [error stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding], authToken];
-}
-
-- (void) addFileSystemHandlers:(NSString*)authToken
-{
- [self addLocalFileSystemHandler:authToken];
- [self addAssetLibraryFileSystemHandler:authToken];
-
- SEL sel = NSSelectorFromString(@"setUrlTransformer:");
- __weak __typeof(self) weakSelf = self;
-
- if ([self.commandDelegate respondsToSelector:sel]) {
- NSURL* (^urlTransformer)(NSURL*) = ^NSURL* (NSURL* urlToTransform) {
- NSURL* localServerURL = [NSURL URLWithString:[NSString stringWithFormat:@"http://localhost:%lu", (unsigned long)weakSelf.server.port]];
-
- NSURL* transformedUrl = urlToTransform;
-
- NSString* localhostUrlString = [NSString stringWithFormat:@"http://localhost:%lu", (unsigned long)[localServerURL.port unsignedIntegerValue]];
-
- if ([[urlToTransform scheme] isEqualToString:ASSETS_LIBRARY_PATH]) {
- transformedUrl = [NSURL URLWithString:[NSString stringWithFormat:@"%@/%@/%@%@",
- localhostUrlString,
- ASSETS_LIBRARY_PATH,
- urlToTransform.host,
- urlToTransform.path
- ]];
-
- } else if ([[urlToTransform scheme] isEqualToString:@"file"]) {
- transformedUrl = [NSURL URLWithString:[NSString stringWithFormat:@"%@/%@%@",
- localhostUrlString,
- LOCAL_FILESYSTEM_PATH,
- urlToTransform.path
- ]];
- }
-
- return transformedUrl;
- };
-
- ((void (*)(id, SEL, id))objc_msgSend)(self.commandDelegate, sel, urlTransformer);
-
- } else {
- NSLog(@"WARNING: CDVPlugin's commandDelegate is missing a urlTransformer property. The local web server can't set it to transform file and asset-library urls");
- }
-}
-
-- (void) addFileSystemHandler:(GCDWebServerAsyncProcessBlock)processRequestForResponseBlock basePath:(NSString*)basePath authToken:(NSString*)authToken cacheAge:(NSUInteger)cacheAge
-{
- GCDWebServerMatchBlock matchBlock = ^GCDWebServerRequest *(NSString* requestMethod, NSURL* requestURL, NSDictionary* requestHeaders, NSString* urlPath, NSDictionary* urlQuery) {
-
- if (![requestMethod isEqualToString:@"GET"]) {
- return nil;
- }
- if (![urlPath hasPrefix:basePath]) {
- return nil;
- }
- return [[GCDWebServerRequest alloc] initWithMethod:requestMethod url:requestURL headers:requestHeaders path:urlPath query:urlQuery];
- };
-
- GCDWebServerAsyncProcessBlock asyncProcessBlock = ^void (GCDWebServerRequest* request, GCDWebServerCompletionBlock complete) {
-
- //check if it is a request from localhost
- NSString *host = [request.headers objectForKey:@"Host"];
- if (host==nil || [host hasPrefix:@"localhost"] == NO ) {
- complete([GCDWebServerErrorResponse responseWithClientError:kGCDWebServerHTTPStatusCode_Forbidden message:@"FORBIDDEN"]);
- return;
- }
-
- //check if the querystring or the cookie has the token
- BOOL hasToken = (request.URL.query && [request.URL.query containsString:authToken]);
- NSString *cookie = [request.headers objectForKey:@"Cookie"];
- BOOL hasCookie = (cookie && [cookie containsString:authToken]);
- if (!hasToken && !hasCookie) {
- complete([GCDWebServerErrorResponse responseWithClientError:kGCDWebServerHTTPStatusCode_Forbidden message:@"FORBIDDEN"]);
- return;
- }
-
- processRequestForResponseBlock(request, ^void(GCDWebServerResponse* response){
- if (response) {
- response.cacheControlMaxAge = cacheAge;
- } else {
- response = [GCDWebServerResponse responseWithStatusCode:kGCDWebServerHTTPStatusCode_NotFound];
- }
-
- if (hasToken && !hasCookie) {
- //set cookie
- [response setValue:[NSString stringWithFormat:@"%@;path=/", authToken] forAdditionalHeader:@"Set-Cookie"];
- }
- complete(response);
- });
- };
-
- [self.server addHandlerWithMatchBlock:matchBlock asyncProcessBlock:asyncProcessBlock];
-}
-
-- (void) addAppFileSystemHandler:(NSString*)authToken basePath:(NSString*)basePath indexPage:(NSString*)indexPage
-{
- BOOL allowRangeRequests = YES;
-
- NSString* directoryPath = [[self.commandDelegate pathForResource:indexPage] stringByDeletingLastPathComponent];
-;
-
- GCDWebServerAsyncProcessBlock processRequestBlock = ^void (GCDWebServerRequest* request, GCDWebServerCompletionBlock complete) {
-
- NSString* filePath = [directoryPath stringByAppendingPathComponent:[request.path substringFromIndex:basePath.length]];
- NSString* fileType = [[[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:NULL] fileType];
- GCDWebServerResponse* response = nil;
-
- if (fileType) {
- if ([fileType isEqualToString:NSFileTypeDirectory]) {
- if (indexPage) {
- NSString* indexPath = [filePath stringByAppendingPathComponent:indexPage];
- NSString* indexType = [[[NSFileManager defaultManager] attributesOfItemAtPath:indexPath error:NULL] fileType];
- if ([indexType isEqualToString:NSFileTypeRegular]) {
- complete([GCDWebServerFileResponse responseWithFile:indexPath]);
- }
- }
- response = [self.server _responseWithContentsOfDirectory:filePath];
- } else if ([fileType isEqualToString:NSFileTypeRegular]) {
- if (allowRangeRequests) {
- response = [GCDWebServerFileResponse responseWithFile:filePath byteRange:request.byteRange];
- [response setValue:@"bytes" forAdditionalHeader:@"Accept-Ranges"];
- } else {
- response = [GCDWebServerFileResponse responseWithFile:filePath];
- }
- }
- }
-
- complete(response);
- };
-
- [self addFileSystemHandler:processRequestBlock basePath:basePath authToken:authToken cacheAge:0];
-}
-
-- (void) addLocalFileSystemHandler:(NSString*)authToken
-{
- NSString* basePath = [NSString stringWithFormat:@"/%@/", LOCAL_FILESYSTEM_PATH];
- BOOL allowRangeRequests = YES;
-
- GCDWebServerAsyncProcessBlock processRequestBlock = ^void (GCDWebServerRequest* request, GCDWebServerCompletionBlock complete) {
-
- NSString* filePath = [request.path substringFromIndex:basePath.length];
- NSString* fileType = [[[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:NULL] fileType];
- GCDWebServerResponse* response = nil;
-
- if (fileType && [fileType isEqualToString:NSFileTypeRegular]) {
- if (allowRangeRequests) {
- response = [GCDWebServerFileResponse responseWithFile:filePath byteRange:request.byteRange];
- [response setValue:@"bytes" forAdditionalHeader:@"Accept-Ranges"];
- } else {
- response = [GCDWebServerFileResponse responseWithFile:filePath];
- }
- }
-
- complete(response);
- };
-
- [self addFileSystemHandler:processRequestBlock basePath:basePath authToken:authToken cacheAge:0];
-}
-
-- (void) addAssetLibraryFileSystemHandler:(NSString*)authToken
-{
- NSString* basePath = [NSString stringWithFormat:@"/%@/", ASSETS_LIBRARY_PATH];
-
- GCDWebServerAsyncProcessBlock processRequestBlock = ^void (GCDWebServerRequest* request, GCDWebServerCompletionBlock complete) {
-
- NSURL* assetUrl = [NSURL URLWithString:[NSString stringWithFormat:@"assets-library:/%@", [request.path substringFromIndex:basePath.length]]];
-
- ALAssetsLibrary* assetsLibrary = [[ALAssetsLibrary alloc] init];
- [assetsLibrary assetForURL:assetUrl
- resultBlock:^(ALAsset* asset) {
- if (asset) {
- // We have the asset! Get the data and send it off.
- ALAssetRepresentation* assetRepresentation = [asset defaultRepresentation];
- Byte* buffer = (Byte*)malloc([assetRepresentation size]);
- NSUInteger bufferSize = [assetRepresentation getBytes:buffer fromOffset:0.0 length:[assetRepresentation size] error:nil];
- NSData* data = [NSData dataWithBytesNoCopy:buffer length:bufferSize freeWhenDone:YES];
- NSString* MIMEType = (__bridge_transfer NSString*)UTTypeCopyPreferredTagWithClass((__bridge CFStringRef)[assetRepresentation UTI], kUTTagClassMIMEType);
-
- complete([GCDWebServerDataResponse responseWithData:data contentType:MIMEType]);
- } else {
- complete(nil);
- }
- }
- failureBlock:^(NSError* error) {
- NSLog(@"Error: %@", error);
- complete(nil);
- }
- ];
- };
-
- [self addFileSystemHandler:processRequestBlock basePath:basePath authToken:authToken cacheAge:0];
-}
-
-- (void) addErrorSystemHandler:(NSString*)authToken
-{
- NSString* basePath = [NSString stringWithFormat:@"/%@/", ERROR_PATH];
-
- GCDWebServerAsyncProcessBlock processRequestBlock = ^void (GCDWebServerRequest* request, GCDWebServerCompletionBlock complete) {
-
- NSString* errorString = [request.path substringFromIndex:basePath.length]; // error string is from the url path
- NSString* html = [NSString stringWithFormat:@"<h1 style='margin-top:40px; font-size:6vw'>ERROR</h1><h2 style='font-size:3vw'>%@</h2>", errorString];
- GCDWebServerResponse* response = [GCDWebServerDataResponse responseWithHTML:html];
- complete(response);
- };
-
- [self addFileSystemHandler:processRequestBlock basePath:basePath authToken:authToken cacheAge:0];
-}
-
-
-@end
diff --git a/local-webserver/src/ios/GCDWebServer/.gitignore b/local-webserver/src/ios/GCDWebServer/.gitignore
deleted file mode 100644
index d7d4abb..0000000
--- a/local-webserver/src/ios/GCDWebServer/.gitignore
+++ /dev/null
@@ -1,6 +0,0 @@
-.DS_Store
-xcuserdata
-project.xcworkspace
-
-Tests/Payload
-Carthage/Build
diff --git a/local-webserver/src/ios/GCDWebServer/.travis.yml b/local-webserver/src/ios/GCDWebServer/.travis.yml
deleted file mode 100644
index 05cfcb6..0000000
--- a/local-webserver/src/ios/GCDWebServer/.travis.yml
+++ /dev/null
@@ -1,3 +0,0 @@
-language: objective-c
-script: ./Run-Tests.sh
-osx_image: xcode7.1
diff --git a/local-webserver/src/ios/GCDWebServer/Frameworks/GCDWebServers.h b/local-webserver/src/ios/GCDWebServer/Frameworks/GCDWebServers.h
deleted file mode 100644
index 60f42da..0000000
--- a/local-webserver/src/ios/GCDWebServer/Frameworks/GCDWebServers.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- 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.
- */
-
-// GCDWebServer Core
-#import <GCDWebServers/GCDWebServer.h>
-#import <GCDWebServers/GCDWebServerConnection.h>
-#import <GCDWebServers/GCDWebServerFunctions.h>
-#import <GCDWebServers/GCDWebServerHTTPStatusCodes.h>
-#import <GCDWebServers/GCDWebServerResponse.h>
-#import <GCDWebServers/GCDWebServerRequest.h>
-
-// GCDWebServer Requests
-#import <GCDWebServers/GCDWebServerDataRequest.h>
-#import <GCDWebServers/GCDWebServerFileRequest.h>
-#import <GCDWebServers/GCDWebServerMultiPartFormRequest.h>
-#import <GCDWebServers/GCDWebServerURLEncodedFormRequest.h>
-
-// GCDWebServer Responses
-#import <GCDWebServers/GCDWebServerDataResponse.h>
-#import <GCDWebServers/GCDWebServerErrorResponse.h>
-#import <GCDWebServers/GCDWebServerFileResponse.h>
-#import <GCDWebServers/GCDWebServerStreamedResponse.h>
-
-// GCDWebUploader
-#import <GCDWebServers/GCDWebUploader.h>
-
-// GCDWebDAVServer
-#import <GCDWebServers/GCDWebDAVServer.h>
diff --git a/local-webserver/src/ios/GCDWebServer/Frameworks/Info.plist b/local-webserver/src/ios/GCDWebServer/Frameworks/Info.plist
deleted file mode 100644
index 537b5cb..0000000
--- a/local-webserver/src/ios/GCDWebServer/Frameworks/Info.plist
+++ /dev/null
@@ -1,22 +0,0 @@
-<?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>CFBundleExecutable</key>
- <string>$(EXECUTABLE_NAME)</string>
- <key>CFBundleIdentifier</key>
- <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundleName</key>
- <string>$(PRODUCT_NAME)</string>
- <key>CFBundlePackageType</key>
- <string>FMWK</string>
- <key>CFBundleVersion</key>
- <string>${BUNDLE_VERSION_STRING}</string>
- <key>CFBundleShortVersionString</key>
- <string>${BUNDLE_VERSION_STRING}</string>
-</dict>
-</plist>
diff --git a/local-webserver/src/ios/GCDWebServer/Frameworks/Tests.m b/local-webserver/src/ios/GCDWebServer/Frameworks/Tests.m
deleted file mode 100644
index b1d69e7..0000000
--- a/local-webserver/src/ios/GCDWebServer/Frameworks/Tests.m
+++ /dev/null
@@ -1,24 +0,0 @@
-#import <GCDWebServers/GCDWebServers.h>
-#import <XCTest/XCTest.h>
-
-@interface Tests : XCTestCase
-@end
-
-@implementation Tests
-
-- (void)testWebServer {
- GCDWebServer* server = [[GCDWebServer alloc] init];
- XCTAssertNotNil(server);
-}
-
-- (void)testDAVServer {
- GCDWebDAVServer* server = [[GCDWebDAVServer alloc] init];
- XCTAssertNotNil(server);
-}
-
-- (void)testWebUploader {
- GCDWebUploader* server = [[GCDWebUploader alloc] init];
- XCTAssertNotNil(server);
-}
-
-@end
diff --git a/local-webserver/src/ios/GCDWebServer/GCDWebDAVServer/GCDWebDAVServer.h b/local-webserver/src/ios/GCDWebServer/GCDWebDAVServer/GCDWebDAVServer.h
deleted file mode 100644
index 84914db..0000000
--- a/local-webserver/src/ios/GCDWebServer/GCDWebDAVServer/GCDWebDAVServer.h
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- 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 "GCDWebServer.h"
-
-@class GCDWebDAVServer;
-
-/**
- * Delegate methods for GCDWebDAVServer.
- *
- * @warning These methods are always called on the main thread in a serialized way.
- */
-@protocol GCDWebDAVServerDelegate <GCDWebServerDelegate>
-@optional
-
-/**
- * This method is called whenever a file has been downloaded.
- */
-- (void)davServer:(GCDWebDAVServer*)server didDownloadFileAtPath:(NSString*)path;
-
-/**
- * This method is called whenever a file has been uploaded.
- */
-- (void)davServer:(GCDWebDAVServer*)server didUploadFileAtPath:(NSString*)path;
-
-/**
- * This method is called whenever a file or directory has been moved.
- */
-- (void)davServer:(GCDWebDAVServer*)server didMoveItemFromPath:(NSString*)fromPath toPath:(NSString*)toPath;
-
-/**
- * This method is called whenever a file or directory has been copied.
- */
-- (void)davServer:(GCDWebDAVServer*)server didCopyItemFromPath:(NSString*)fromPath toPath:(NSString*)toPath;
-
-/**
- * This method is called whenever a file or directory has been deleted.
- */
-- (void)davServer:(GCDWebDAVServer*)server didDeleteItemAtPath:(NSString*)path;
-
-/**
- * This method is called whenever a directory has been created.
- */
-- (void)davServer:(GCDWebDAVServer*)server didCreateDirectoryAtPath:(NSString*)path;
-
-@end
-
-/**
- * The GCDWebDAVServer subclass of GCDWebServer implements a class 1 compliant
- * WebDAV server. It is also partially class 2 compliant but only when the
- * client is the OS X WebDAV implementation (so it can work with the OS X Finder).
- *
- * See the README.md file for more information about the features of GCDWebDAVServer.
- */
-@interface GCDWebDAVServer : GCDWebServer
-
-/**
- * Returns the upload directory as specified when the server was initialized.
- */
-@property(nonatomic, readonly) NSString* uploadDirectory;
-
-/**
- * Sets the delegate for the server.
- */
-@property(nonatomic, assign) id<GCDWebDAVServerDelegate> delegate;
-
-/**
- * Sets which files are allowed to be operated on depending on their extension.
- *
- * The default value is nil i.e. all file extensions are allowed.
- */
-@property(nonatomic, copy) NSArray* allowedFileExtensions;
-
-/**
- * Sets if files and directories whose name start with a period are allowed to
- * be operated on.
- *
- * The default value is NO.
- */
-@property(nonatomic) BOOL allowHiddenItems;
-
-/**
- * This method is the designated initializer for the class.
- */
-- (instancetype)initWithUploadDirectory:(NSString*)path;
-
-@end
-
-/**
- * Hooks to customize the behavior of GCDWebDAVServer.
- *
- * @warning These methods can be called on any GCD thread.
- */
-@interface GCDWebDAVServer (Subclassing)
-
-/**
- * This method is called to check if a file upload is allowed to complete.
- * The uploaded file is available for inspection at "tempPath".
- *
- * The default implementation returns YES.
- */
-- (BOOL)shouldUploadFileAtPath:(NSString*)path withTemporaryFile:(NSString*)tempPath;
-
-/**
- * This method is called to check if a file or directory is allowed to be moved.
- *
- * The default implementation returns YES.
- */
-- (BOOL)shouldMoveItemFromPath:(NSString*)fromPath toPath:(NSString*)toPath;
-
-/**
- * This method is called to check if a file or directory is allowed to be copied.
- *
- * The default implementation returns YES.
- */
-- (BOOL)shouldCopyItemFromPath:(NSString*)fromPath toPath:(NSString*)toPath;
-
-/**
- * This method is called to check if a file or directory is allowed to be deleted.
- *
- * The default implementation returns YES.
- */
-- (BOOL)shouldDeleteItemAtPath:(NSString*)path;
-
-/**
- * This method is called to check if a directory is allowed to be created.
- *
- * The default implementation returns YES.
- */
-- (BOOL)shouldCreateDirectoryAtPath:(NSString*)path;
-
-@end
diff --git a/local-webserver/src/ios/GCDWebServer/GCDWebDAVServer/GCDWebDAVServer.m b/local-webserver/src/ios/GCDWebServer/GCDWebDAVServer/GCDWebDAVServer.m
deleted file mode 100644
index 33025d4..0000000
--- a/local-webserver/src/ios/GCDWebServer/GCDWebDAVServer/GCDWebDAVServer.m
+++ /dev/null
@@ -1,701 +0,0 @@
-/*
- 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.
- */
-
-#if !__has_feature(objc_arc)
-#error GCDWebDAVServer requires ARC
-#endif
-
-// WebDAV specifications: http://webdav.org/specs/rfc4918.html
-
-// Requires "HEADER_SEARCH_PATHS = $(SDKROOT)/usr/include/libxml2" in Xcode build settings
-#import <libxml/parser.h>
-
-#import "GCDWebDAVServer.h"
-
-#import "GCDWebServerFunctions.h"
-
-#import "GCDWebServerDataRequest.h"
-#import "GCDWebServerFileRequest.h"
-
-#import "GCDWebServerDataResponse.h"
-#import "GCDWebServerErrorResponse.h"
-#import "GCDWebServerFileResponse.h"
-
-#define kXMLParseOptions (XML_PARSE_NONET | XML_PARSE_RECOVER | XML_PARSE_NOBLANKS | XML_PARSE_COMPACT | XML_PARSE_NOWARNING | XML_PARSE_NOERROR)
-
-typedef NS_ENUM(NSInteger, DAVProperties) {
- kDAVProperty_ResourceType = (1 << 0),
- kDAVProperty_CreationDate = (1 << 1),
- kDAVProperty_LastModified = (1 << 2),
- kDAVProperty_ContentLength = (1 << 3),
- kDAVAllProperties = kDAVProperty_ResourceType | kDAVProperty_CreationDate | kDAVProperty_LastModified | kDAVProperty_ContentLength
-};
-
-@interface GCDWebDAVServer () {
-@private
- NSString* _uploadDirectory;
- NSArray* _allowedExtensions;
- BOOL _allowHidden;
-}
-@end
-
-@implementation GCDWebDAVServer (Methods)
-
-// Must match implementation in GCDWebUploader
-- (BOOL)_checkSandboxedPath:(NSString*)path {
- return [[path stringByStandardizingPath] hasPrefix:_uploadDirectory];
-}
-
-- (BOOL)_checkFileExtension:(NSString*)fileName {
- if (_allowedExtensions && ![_allowedExtensions containsObject:[[fileName pathExtension] lowercaseString]]) {
- return NO;
- }
- return YES;
-}
-
-static inline BOOL _IsMacFinder(GCDWebServerRequest* request) {
- NSString* userAgentHeader = [request.headers objectForKey:@"User-Agent"];
- return ([userAgentHeader hasPrefix:@"WebDAVFS/"] || [userAgentHeader hasPrefix:@"WebDAVLib/"]); // OS X WebDAV client
-}
-
-- (GCDWebServerResponse*)performOPTIONS:(GCDWebServerRequest*)request {
- GCDWebServerResponse* response = [GCDWebServerResponse response];
- if (_IsMacFinder(request)) {
- [response setValue:@"1, 2" forAdditionalHeader:@"DAV"]; // Classes 1 and 2
- } else {
- [response setValue:@"1" forAdditionalHeader:@"DAV"]; // Class 1
- }
- return response;
-}
-
-- (GCDWebServerResponse*)performGET:(GCDWebServerRequest*)request {
- NSString* relativePath = request.path;
- NSString* absolutePath = [_uploadDirectory stringByAppendingPathComponent:relativePath];
- BOOL isDirectory = NO;
- if (![self _checkSandboxedPath:absolutePath] || ![[NSFileManager defaultManager] fileExistsAtPath:absolutePath isDirectory:&isDirectory]) {
- return [GCDWebServerErrorResponse responseWithClientError:kGCDWebServerHTTPStatusCode_NotFound message:@"\"%@\" does not exist", relativePath];
- }
-
- NSString* itemName = [absolutePath lastPathComponent];
- if (([itemName hasPrefix:@"."] && !_allowHidden) || (!isDirectory && ![self _checkFileExtension:itemName])) {
- return [GCDWebServerErrorResponse responseWithClientError:kGCDWebServerHTTPStatusCode_Forbidden message:@"Downlading item name \"%@\" is not allowed", itemName];
- }
-
- // Because HEAD requests are mapped to GET ones, we need to handle directories but it's OK to return nothing per http://webdav.org/specs/rfc4918.html#rfc.section.9.4
- if (isDirectory) {
- return [GCDWebServerResponse response];
- }
-
- if ([self.delegate respondsToSelector:@selector(davServer:didDownloadFileAtPath:)]) {
- dispatch_async(dispatch_get_main_queue(), ^{
- [self.delegate davServer:self didDownloadFileAtPath:absolutePath];
- });
- }
-
- if ([request hasByteRange]) {
- return [GCDWebServerFileResponse responseWithFile:absolutePath byteRange:request.byteRange];
- }
-
- return [GCDWebServerFileResponse responseWithFile:absolutePath];
-}
-
-- (GCDWebServerResponse*)performPUT:(GCDWebServerFileRequest*)request {
- if ([request hasByteRange]) {
- return [GCDWebServerErrorResponse responseWithClientError:kGCDWebServerHTTPStatusCode_BadRequest message:@"Range uploads not supported"];
- }
-
- NSString* relativePath = request.path;
- NSString* absolutePath = [_uploadDirectory stringByAppendingPathComponent:relativePath];
- if (![self _checkSandboxedPath:absolutePath]) {
- return [GCDWebServerErrorResponse responseWithClientError:kGCDWebServerHTTPStatusCode_NotFound message:@"\"%@\" does not exist", relativePath];
- }
- BOOL isDirectory;
- if (![[NSFileManager defaultManager] fileExistsAtPath:[absolutePath stringByDeletingLastPathComponent] isDirectory:&isDirectory] || !isDirectory) {
- return [GCDWebServerErrorResponse responseWithClientError:kGCDWebServerHTTPStatusCode_Conflict message:@"Missing intermediate collection(s) for \"%@\"", relativePath];
- }
-
- BOOL existing = [[NSFileManager defaultManager] fileExistsAtPath:absolutePath isDirectory:&isDirectory];
- if (existing && isDirectory) {
- return [GCDWebServerErrorResponse responseWithClientError:kGCDWebServerHTTPStatusCode_MethodNotAllowed message:@"PUT not allowed on existing collection \"%@\"", relativePath];
- }
-
- NSString* fileName = [absolutePath lastPathComponent];
- if (([fileName hasPrefix:@"."] && !_allowHidden) || ![self _checkFileExtension:fileName]) {
- return [GCDWebServerErrorResponse responseWithClientError:kGCDWebServerHTTPStatusCode_Forbidden message:@"Uploading file name \"%@\" is not allowed", fileName];
- }
-
- if (![self shouldUploadFileAtPath:absolutePath withTemporaryFile:request.temporaryPath]) {
- return [GCDWebServerErrorResponse responseWithClientError:kGCDWebServerHTTPStatusCode_Forbidden message:@"Uploading file to \"%@\" is not permitted", relativePath];
- }
-
- [[NSFileManager defaultManager] removeItemAtPath:absolutePath error:NULL];
- NSError* error = nil;
- if (![[NSFileManager defaultManager] moveItemAtPath:request.temporaryPath toPath:absolutePath error:&error]) {
- return [GCDWebServerErrorResponse responseWithServerError:kGCDWebServerHTTPStatusCode_InternalServerError underlyingError:error message:@"Failed moving uploaded file to \"%@\"", relativePath];
- }
-
- if ([self.delegate respondsToSelector:@selector(davServer:didUploadFileAtPath:)]) {
- dispatch_async(dispatch_get_main_queue(), ^{
- [self.delegate davServer:self didUploadFileAtPath:absolutePath];
- });
- }
- return [GCDWebServerResponse responseWithStatusCode:(existing ? kGCDWebServerHTTPStatusCode_NoContent : kGCDWebServerHTTPStatusCode_Created)];
-}
-
-- (GCDWebServerResponse*)performDELETE:(GCDWebServerRequest*)request {
- NSString* depthHeader = [request.headers objectForKey:@"Depth"];
- if (depthHeader && ![depthHeader isEqualToString:@"infinity"]) {
- return [GCDWebServerErrorResponse responseWithClientError:kGCDWebServerHTTPStatusCode_BadRequest message:@"Unsupported 'Depth' header: %@", depthHeader];
- }
-
- NSString* relativePath = request.path;
- NSString* absolutePath = [_uploadDirectory stringByAppendingPathComponent:relativePath];
- BOOL isDirectory = NO;
- if (![self _checkSandboxedPath:absolutePath] || ![[NSFileManager defaultManager] fileExistsAtPath:absolutePath isDirectory:&isDirectory]) {
- return [GCDWebServerErrorResponse responseWithClientError:kGCDWebServerHTTPStatusCode_NotFound message:@"\"%@\" does not exist", relativePath];
- }
-
- NSString* itemName = [absolutePath lastPathComponent];
- if (([itemName hasPrefix:@"."] && !_allowHidden) || (!isDirectory && ![self _checkFileExtension:itemName])) {
- return [GCDWebServerErrorResponse responseWithClientError:kGCDWebServerHTTPStatusCode_Forbidden message:@"Deleting item name \"%@\" is not allowed", itemName];
- }
-
- if (![self shouldDeleteItemAtPath:absolutePath]) {
- return [GCDWebServerErrorResponse responseWithClientError:kGCDWebServerHTTPStatusCode_Forbidden message:@"Deleting \"%@\" is not permitted", relativePath];
- }
-
- NSError* error = nil;
- if (![[NSFileManager defaultManager] removeItemAtPath:absolutePath error:&error]) {
- return [GCDWebServerErrorResponse responseWithServerError:kGCDWebServerHTTPStatusCode_InternalServerError underlyingError:error message:@"Failed deleting \"%@\"", relativePath];
- }
-
- if ([self.delegate respondsToSelector:@selector(davServer:didDeleteItemAtPath:)]) {
- dispatch_async(dispatch_get_main_queue(), ^{
- [self.delegate davServer:self didDeleteItemAtPath:absolutePath];
- });
- }
- return [GCDWebServerResponse responseWithStatusCode:kGCDWebServerHTTPStatusCode_NoContent];
-}
-
-- (GCDWebServerResponse*)performMKCOL:(GCDWebServerDataRequest*)request {
- if ([request hasBody] && (request.contentLength > 0)) {
- return [GCDWebServerErrorResponse responseWithClientError:kGCDWebServerHTTPStatusCode_UnsupportedMediaType message:@"Unexpected request body for MKCOL method"];
- }
-
- NSString* relativePath = request.path;
- NSString* absolutePath = [_uploadDirectory stringByAppendingPathComponent:relativePath];
- if (![self _checkSandboxedPath:absolutePath]) {
- return [GCDWebServerErrorResponse responseWithClientError:kGCDWebServerHTTPStatusCode_NotFound message:@"\"%@\" does not exist", relativePath];
- }
- BOOL isDirectory;
- if (![[NSFileManager defaultManager] fileExistsAtPath:[absolutePath stringByDeletingLastPathComponent] isDirectory:&isDirectory] || !isDirectory) {
- return [GCDWebServerErrorResponse responseWithClientError:kGCDWebServerHTTPStatusCode_Conflict message:@"Missing intermediate collection(s) for \"%@\"", relativePath];
- }
-
- NSString* directoryName = [absolutePath lastPathComponent];
- if (!_allowHidden && [directoryName hasPrefix:@"."]) {
- return [GCDWebServerErrorResponse responseWithClientError:kGCDWebServerHTTPStatusCode_Forbidden message:@"Creating directory name \"%@\" is not allowed", directoryName];
- }
-
- if (![self shouldCreateDirectoryAtPath:absolutePath]) {
- return [GCDWebServerErrorResponse responseWithClientError:kGCDWebServerHTTPStatusCode_Forbidden message:@"Creating directory \"%@\" is not permitted", relativePath];
- }
-
- NSError* error = nil;
- if (![[NSFileManager defaultManager] createDirectoryAtPath:absolutePath withIntermediateDirectories:NO attributes:nil error:&error]) {
- return [GCDWebServerErrorResponse responseWithServerError:kGCDWebServerHTTPStatusCode_InternalServerError underlyingError:error message:@"Failed creating directory \"%@\"", relativePath];
- }
-#ifdef __GCDWEBSERVER_ENABLE_TESTING__
- NSString* creationDateHeader = [request.headers objectForKey:@"X-GCDWebServer-CreationDate"];
- if (creationDateHeader) {
- NSDate* date = GCDWebServerParseISO8601(creationDateHeader);
- if (!date || ![[NSFileManager defaultManager] setAttributes:@{NSFileCreationDate: date} ofItemAtPath:absolutePath error:&error]) {
- return [GCDWebServerErrorResponse responseWithServerError:kGCDWebServerHTTPStatusCode_InternalServerError underlyingError:error message:@"Failed setting creation date for directory \"%@\"", relativePath];
- }
- }
-#endif
-
- if ([self.delegate respondsToSelector:@selector(davServer:didCreateDirectoryAtPath:)]) {
- dispatch_async(dispatch_get_main_queue(), ^{
- [self.delegate davServer:self didCreateDirectoryAtPath:absolutePath];
- });
- }
- return [GCDWebServerResponse responseWithStatusCode:kGCDWebServerHTTPStatusCode_Created];
-}
-
-- (GCDWebServerResponse*)performCOPY:(GCDWebServerRequest*)request isMove:(BOOL)isMove {
- if (!isMove) {
- NSString* depthHeader = [request.headers objectForKey:@"Depth"]; // TODO: Support "Depth: 0"
- if (depthHeader && ![depthHeader isEqualToString:@"infinity"]) {
- return [GCDWebServerErrorResponse responseWithClientError:kGCDWebServerHTTPStatusCode_BadRequest message:@"Unsupported 'Depth' header: %@", depthHeader];
- }
- }
-
- NSString* srcRelativePath = request.path;
- NSString* srcAbsolutePath = [_uploadDirectory stringByAppendingPathComponent:srcRelativePath];
- if (![self _checkSandboxedPath:srcAbsolutePath]) {
- return [GCDWebServerErrorResponse responseWithClientError:kGCDWebServerHTTPStatusCode_NotFound message:@"\"%@\" does not exist", srcRelativePath];
- }
-
- NSString* dstRelativePath = [request.headers objectForKey:@"Destination"];
- NSRange range = [dstRelativePath rangeOfString:[request.headers objectForKey:@"Host"]];
- if ((dstRelativePath == nil) || (range.location == NSNotFound)) {
- return [GCDWebServerErrorResponse responseWithClientError:kGCDWebServerHTTPStatusCode_BadRequest message:@"Malformed 'Destination' header: %@", dstRelativePath];
- }
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- dstRelativePath = [[dstRelativePath substringFromIndex:(range.location + range.length)] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
-#pragma clang diagnostic pop
- NSString* dstAbsolutePath = [_uploadDirectory stringByAppendingPathComponent:dstRelativePath];
- if (![self _checkSandboxedPath:dstAbsolutePath]) {
- return [GCDWebServerErrorResponse responseWithClientError:kGCDWebServerHTTPStatusCode_NotFound message:@"\"%@\" does not exist", srcRelativePath];
- }
-
- BOOL isDirectory;
- if (![[NSFileManager defaultManager] fileExistsAtPath:[dstAbsolutePath stringByDeletingLastPathComponent] isDirectory:&isDirectory] || !isDirectory) {
- return [GCDWebServerErrorResponse responseWithClientError:kGCDWebServerHTTPStatusCode_Conflict message:@"Invalid destination \"%@\"", dstRelativePath];
- }
-
- NSString* itemName = [dstAbsolutePath lastPathComponent];
- if ((!_allowHidden && [itemName hasPrefix:@"."]) || (!isDirectory && ![self _checkFileExtension:itemName])) {
- return [GCDWebServerErrorResponse responseWithClientError:kGCDWebServerHTTPStatusCode_Forbidden message:@"%@ to item name \"%@\" is not allowed", isMove ? @"Moving" : @"Copying", itemName];
- }
-
- NSString* overwriteHeader = [request.headers objectForKey:@"Overwrite"];
- BOOL existing = [[NSFileManager defaultManager] fileExistsAtPath:dstAbsolutePath];
- if (existing && ((isMove && ![overwriteHeader isEqualToString:@"T"]) || (!isMove && [overwriteHeader isEqualToString:@"F"]))) {
- return [GCDWebServerErrorResponse responseWithClientError:kGCDWebServerHTTPStatusCode_PreconditionFailed message:@"Destination \"%@\" already exists", dstRelativePath];
- }
-
- if (isMove) {
- if (![self shouldMoveItemFromPath:srcAbsolutePath toPath:dstAbsolutePath]) {
- return [GCDWebServerErrorResponse responseWithClientError:kGCDWebServerHTTPStatusCode_Forbidden message:@"Moving \"%@\" to \"%@\" is not permitted", srcRelativePath, dstRelativePath];
- }
- } else {
- if (![self shouldCopyItemFromPath:srcAbsolutePath toPath:dstAbsolutePath]) {
- return [GCDWebServerErrorResponse responseWithClientError:kGCDWebServerHTTPStatusCode_Forbidden message:@"Copying \"%@\" to \"%@\" is not permitted", srcRelativePath, dstRelativePath];
- }
- }
-
- NSError* error = nil;
- if (isMove) {
- [[NSFileManager defaultManager] removeItemAtPath:dstAbsolutePath error:NULL];
- if (![[NSFileManager defaultManager] moveItemAtPath:srcAbsolutePath toPath:dstAbsolutePath error:&error]) {
- return [GCDWebServerErrorResponse responseWithClientError:kGCDWebServerHTTPStatusCode_Forbidden underlyingError:error message:@"Failed copying \"%@\" to \"%@\"", srcRelativePath, dstRelativePath];
- }
- } else {
- if (![[NSFileManager defaultManager] copyItemAtPath:srcAbsolutePath toPath:dstAbsolutePath error:&error]) {
- return [GCDWebServerErrorResponse responseWithClientError:kGCDWebServerHTTPStatusCode_Forbidden underlyingError:error message:@"Failed copying \"%@\" to \"%@\"", srcRelativePath, dstRelativePath];
- }
- }
-
- if (isMove) {
- if ([self.delegate respondsToSelector:@selector(davServer:didMoveItemFromPath:toPath:)]) {
- dispatch_async(dispatch_get_main_queue(), ^{
- [self.delegate davServer:self didMoveItemFromPath:srcAbsolutePath toPath:dstAbsolutePath];
- });
- }
- } else {
- if ([self.delegate respondsToSelector:@selector(davServer:didCopyItemFromPath:toPath:)]) {
- dispatch_async(dispatch_get_main_queue(), ^{
- [self.delegate davServer:self didCopyItemFromPath:srcAbsolutePath toPath:dstAbsolutePath];
- });
- }
- }
-
- return [GCDWebServerResponse responseWithStatusCode:(existing ? kGCDWebServerHTTPStatusCode_NoContent : kGCDWebServerHTTPStatusCode_Created)];
-}
-
-static inline xmlNodePtr _XMLChildWithName(xmlNodePtr child, const xmlChar* name) {
- while (child) {
- if ((child->type == XML_ELEMENT_NODE) && !xmlStrcmp(child->name, name)) {
- return child;
- }
- child = child->next;
- }
- return NULL;
-}
-
-- (void)_addPropertyResponseForItem:(NSString*)itemPath resource:(NSString*)resourcePath properties:(DAVProperties)properties xmlString:(NSMutableString*)xmlString {
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- CFStringRef escapedPath = CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (__bridge CFStringRef)resourcePath, NULL, CFSTR("<&>?+"), kCFStringEncodingUTF8);
-#pragma clang diagnostic pop
- if (escapedPath) {
- NSDictionary* attributes = [[NSFileManager defaultManager] attributesOfItemAtPath:itemPath error:NULL];
- NSString* type = [attributes objectForKey:NSFileType];
- BOOL isFile = [type isEqualToString:NSFileTypeRegular];
- BOOL isDirectory = [type isEqualToString:NSFileTypeDirectory];
- if ((isFile && [self _checkFileExtension:itemPath]) || isDirectory) {
- [xmlString appendString:@"<D:response>"];
- [xmlString appendFormat:@"<D:href>%@</D:href>", escapedPath];
- [xmlString appendString:@"<D:propstat>"];
- [xmlString appendString:@"<D:prop>"];
-
- if (properties & kDAVProperty_ResourceType) {
- if (isDirectory) {
- [xmlString appendString:@"<D:resourcetype><D:collection/></D:resourcetype>"];
- } else {
- [xmlString appendString:@"<D:resourcetype/>"];
- }
- }
-
- if ((properties & kDAVProperty_CreationDate) && [attributes objectForKey:NSFileCreationDate]) {
- [xmlString appendFormat:@"<D:creationdate>%@</D:creationdate>", GCDWebServerFormatISO8601([attributes fileCreationDate])];
- }
-
- if ((properties & kDAVProperty_LastModified) && isFile && [attributes objectForKey:NSFileModificationDate]) { // Last modification date is not useful for directories as it changes implicitely and 'Last-Modified' header is not provided for directories anyway
- [xmlString appendFormat:@"<D:getlastmodified>%@</D:getlastmodified>", GCDWebServerFormatRFC822([attributes fileModificationDate])];
- }
-
- if ((properties & kDAVProperty_ContentLength) && !isDirectory && [attributes objectForKey:NSFileSize]) {
- [xmlString appendFormat:@"<D:getcontentlength>%llu</D:getcontentlength>", [attributes fileSize]];
- }
-
- [xmlString appendString:@"</D:prop>"];
- [xmlString appendString:@"<D:status>HTTP/1.1 200 OK</D:status>"];
- [xmlString appendString:@"</D:propstat>"];
- [xmlString appendString:@"</D:response>\n"];
- }
- CFRelease(escapedPath);
- } else {
- [self logError:@"Failed escaping path: %@", itemPath];
- }
-}
-
-- (GCDWebServerResponse*)performPROPFIND:(GCDWebServerDataRequest*)request {
- NSInteger depth;
- NSString* depthHeader = [request.headers objectForKey:@"Depth"];
- if ([depthHeader isEqualToString:@"0"]) {
- depth = 0;
- } else if ([depthHeader isEqualToString:@"1"]) {
- depth = 1;
- } else {
- return [GCDWebServerErrorResponse responseWithClientError:kGCDWebServerHTTPStatusCode_BadRequest message:@"Unsupported 'Depth' header: %@", depthHeader]; // TODO: Return 403 / propfind-finite-depth for "infinity" depth
- }
-
- DAVProperties properties = 0;
- if (request.data.length) {
- BOOL success = YES;
- xmlDocPtr document = xmlReadMemory(request.data.bytes, (int)request.data.length, NULL, NULL, kXMLParseOptions);
- if (document) {
- xmlNodePtr rootNode = _XMLChildWithName(document->children, (const xmlChar*)"propfind");
- xmlNodePtr allNode = rootNode ? _XMLChildWithName(rootNode->children, (const xmlChar*)"allprop") : NULL;
- xmlNodePtr propNode = rootNode ? _XMLChildWithName(rootNode->children, (const xmlChar*)"prop") : NULL;
- if (allNode) {
- properties = kDAVAllProperties;
- } else if (propNode) {
- xmlNodePtr node = propNode->children;
- while (node) {
- if (!xmlStrcmp(node->name, (const xmlChar*)"resourcetype")) {
- properties |= kDAVProperty_ResourceType;
- } else if (!xmlStrcmp(node->name, (const xmlChar*)"creationdate")) {
- properties |= kDAVProperty_CreationDate;
- } else if (!xmlStrcmp(node->name, (const xmlChar*)"getlastmodified")) {
- properties |= kDAVProperty_LastModified;
- } else if (!xmlStrcmp(node->name, (const xmlChar*)"getcontentlength")) {
- properties |= kDAVProperty_ContentLength;
- } else {
- [self logWarning:@"Unknown DAV property requested \"%s\"", node->name];
- }
- node = node->next;
- }
- } else {
- success = NO;
- }
- xmlFreeDoc(document);
- } else {
- success = NO;
- }
- if (!success) {
- NSString* string = [[NSString alloc] initWithData:request.data encoding:NSUTF8StringEncoding];
- return [GCDWebServerErrorResponse responseWithClientError:kGCDWebServerHTTPStatusCode_BadRequest message:@"Invalid DAV properties:\n%@", string];
- }
- } else {
- properties = kDAVAllProperties;
- }
-
- NSString* relativePath = request.path;
- NSString* absolutePath = [_uploadDirectory stringByAppendingPathComponent:relativePath];
- BOOL isDirectory = NO;
- if (![self _checkSandboxedPath:absolutePath] || ![[NSFileManager defaultManager] fileExistsAtPath:absolutePath isDirectory:&isDirectory]) {
- return [GCDWebServerErrorResponse responseWithClientError:kGCDWebServerHTTPStatusCode_NotFound message:@"\"%@\" does not exist", relativePath];
- }
-
- NSString* itemName = [absolutePath lastPathComponent];
- if (([itemName hasPrefix:@"."] && !_allowHidden) || (!isDirectory && ![self _checkFileExtension:itemName])) {
- return [GCDWebServerErrorResponse responseWithClientError:kGCDWebServerHTTPStatusCode_Forbidden message:@"Retrieving properties for item name \"%@\" is not allowed", itemName];
- }
-
- NSArray* items = nil;
- if (isDirectory) {
- NSError* error = nil;
- items = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:absolutePath error:&error];
- if (items == nil) {
- return [GCDWebServerErrorResponse responseWithServerError:kGCDWebServerHTTPStatusCode_InternalServerError underlyingError:error message:@"Failed listing directory \"%@\"", relativePath];
- }
- }
-
- NSMutableString* xmlString = [NSMutableString stringWithString:@"<?xml version=\"1.0\" encoding=\"utf-8\" ?>"];
- [xmlString appendString:@"<D:multistatus xmlns:D=\"DAV:\">\n"];
- if (![relativePath hasPrefix:@"/"]) {
- relativePath = [@"/" stringByAppendingString:relativePath];
- }
- [self _addPropertyResponseForItem:absolutePath resource:relativePath properties:properties xmlString:xmlString];
- if (depth == 1) {
- if (![relativePath hasSuffix:@"/"]) {
- relativePath = [relativePath stringByAppendingString:@"/"];
- }
- for (NSString* item in items) {
- if (_allowHidden || ![item hasPrefix:@"."]) {
- [self _addPropertyResponseForItem:[absolutePath stringByAppendingPathComponent:item] resource:[relativePath stringByAppendingString:item] properties:properties xmlString:xmlString];
- }
- }
- }
- [xmlString appendString:@"</D:multistatus>"];
-
- GCDWebServerDataResponse* response = [GCDWebServerDataResponse responseWithData:[xmlString dataUsingEncoding:NSUTF8StringEncoding]
- contentType:@"application/xml; charset=\"utf-8\""];
- response.statusCode = kGCDWebServerHTTPStatusCode_MultiStatus;
- return response;
-}
-
-- (GCDWebServerResponse*)performLOCK:(GCDWebServerDataRequest*)request {
- if (!_IsMacFinder(request)) {
- return [GCDWebServerErrorResponse responseWithClientError:kGCDWebServerHTTPStatusCode_MethodNotAllowed message:@"LOCK method only allowed for Mac Finder"];
- }
-
- NSString* relativePath = request.path;
- NSString* absolutePath = [_uploadDirectory stringByAppendingPathComponent:relativePath];
- BOOL isDirectory = NO;
- if (![self _checkSandboxedPath:absolutePath] || ![[NSFileManager defaultManager] fileExistsAtPath:absolutePath isDirectory:&isDirectory]) {
- return [GCDWebServerErrorResponse responseWithClientError:kGCDWebServerHTTPStatusCode_NotFound message:@"\"%@\" does not exist", relativePath];
- }
-
- NSString* depthHeader = [request.headers objectForKey:@"Depth"];
- NSString* timeoutHeader = [request.headers objectForKey:@"Timeout"];
- NSString* scope = nil;
- NSString* type = nil;
- NSString* owner = nil;
- NSString* token = nil;
- BOOL success = YES;
- xmlDocPtr document = xmlReadMemory(request.data.bytes, (int)request.data.length, NULL, NULL, kXMLParseOptions);
- if (document) {
- xmlNodePtr node = _XMLChildWithName(document->children, (const xmlChar*)"lockinfo");
- if (node) {
- xmlNodePtr scopeNode = _XMLChildWithName(node->children, (const xmlChar*)"lockscope");
- if (scopeNode && scopeNode->children && scopeNode->children->name) {
- scope = [NSString stringWithUTF8String:(const char*)scopeNode->children->name];
- }
- xmlNodePtr typeNode = _XMLChildWithName(node->children, (const xmlChar*)"locktype");
- if (typeNode && typeNode->children && typeNode->children->name) {
- type = [NSString stringWithUTF8String:(const char*)typeNode->children->name];
- }
- xmlNodePtr ownerNode = _XMLChildWithName(node->children, (const xmlChar*)"owner");
- if (ownerNode) {
- ownerNode = _XMLChildWithName(ownerNode->children, (const xmlChar*)"href");
- if (ownerNode && ownerNode->children && ownerNode->children->content) {
- owner = [NSString stringWithUTF8String:(const char*)ownerNode->children->content];
- }
- }
- } else {
- success = NO;
- }
- xmlFreeDoc(document);
- } else {
- success = NO;
- }
- if (!success) {
- NSString* string = [[NSString alloc] initWithData:request.data encoding:NSUTF8StringEncoding];
- return [GCDWebServerErrorResponse responseWithClientError:kGCDWebServerHTTPStatusCode_BadRequest message:@"Invalid DAV properties:\n%@", string];
- }
-
- if (![scope isEqualToString:@"exclusive"] || ![type isEqualToString:@"write"] || ![depthHeader isEqualToString:@"0"]) {
- return [GCDWebServerErrorResponse responseWithClientError:kGCDWebServerHTTPStatusCode_Forbidden message:@"Locking request \"%@/%@/%@\" for \"%@\" is not allowed", scope, type, depthHeader, relativePath];
- }
-
- NSString* itemName = [absolutePath lastPathComponent];
- if ((!_allowHidden && [itemName hasPrefix:@"."]) || (!isDirectory && ![self _checkFileExtension:itemName])) {
- return [GCDWebServerErrorResponse responseWithClientError:kGCDWebServerHTTPStatusCode_Forbidden message:@"Locking item name \"%@\" is not allowed", itemName];
- }
-
-#ifdef __GCDWEBSERVER_ENABLE_TESTING__
- NSString* lockTokenHeader = [request.headers objectForKey:@"X-GCDWebServer-LockToken"];
- if (lockTokenHeader) {
- token = lockTokenHeader;
- }
-#endif
- if (!token) {
- CFUUIDRef uuid = CFUUIDCreate(kCFAllocatorDefault);
- CFStringRef string = CFUUIDCreateString(kCFAllocatorDefault, uuid);
- token = [NSString stringWithFormat:@"urn:uuid:%@", (__bridge NSString*)string];
- CFRelease(string);
- CFRelease(uuid);
- }
-
- NSMutableString* xmlString = [NSMutableString stringWithString:@"<?xml version=\"1.0\" encoding=\"utf-8\" ?>"];
- [xmlString appendString:@"<D:prop xmlns:D=\"DAV:\">\n"];
- [xmlString appendString:@"<D:lockdiscovery>\n<D:activelock>\n"];
- [xmlString appendFormat:@"<D:locktype><D:%@/></D:locktype>\n", type];
- [xmlString appendFormat:@"<D:lockscope><D:%@/></D:lockscope>\n", scope];
- [xmlString appendFormat:@"<D:depth>%@</D:depth>\n", depthHeader];
- if (owner) {
- [xmlString appendFormat:@"<D:owner><D:href>%@</D:href></D:owner>\n", owner];
- }
- if (timeoutHeader) {
- [xmlString appendFormat:@"<D:timeout>%@</D:timeout>\n", timeoutHeader];
- }
- [xmlString appendFormat:@"<D:locktoken><D:href>%@</D:href></D:locktoken>\n", token];
- NSString* lockroot = [@"http://" stringByAppendingString:[[request.headers objectForKey:@"Host"] stringByAppendingString:[@"/" stringByAppendingString:relativePath]]];
- [xmlString appendFormat:@"<D:lockroot><D:href>%@</D:href></D:lockroot>\n", lockroot];
- [xmlString appendString:@"</D:activelock>\n</D:lockdiscovery>\n"];
- [xmlString appendString:@"</D:prop>"];
-
- [self logVerbose:@"WebDAV pretending to lock \"%@\"", relativePath];
- GCDWebServerDataResponse* response = [GCDWebServerDataResponse responseWithData:[xmlString dataUsingEncoding:NSUTF8StringEncoding]
- contentType:@"application/xml; charset=\"utf-8\""];
- return response;
-}
-
-- (GCDWebServerResponse*)performUNLOCK:(GCDWebServerRequest*)request {
- if (!_IsMacFinder(request)) {
- return [GCDWebServerErrorResponse responseWithClientError:kGCDWebServerHTTPStatusCode_MethodNotAllowed message:@"UNLOCK method only allowed for Mac Finder"];
- }
-
- NSString* relativePath = request.path;
- NSString* absolutePath = [_uploadDirectory stringByAppendingPathComponent:relativePath];
- BOOL isDirectory = NO;
- if (![self _checkSandboxedPath:absolutePath] || ![[NSFileManager defaultManager] fileExistsAtPath:absolutePath isDirectory:&isDirectory]) {
- return [GCDWebServerErrorResponse responseWithClientError:kGCDWebServerHTTPStatusCode_NotFound message:@"\"%@\" does not exist", relativePath];
- }
-
- NSString* tokenHeader = [request.headers objectForKey:@"Lock-Token"];
- if (!tokenHeader.length) {
- return [GCDWebServerErrorResponse responseWithClientError:kGCDWebServerHTTPStatusCode_BadRequest message:@"Missing 'Lock-Token' header"];
- }
-
- NSString* itemName = [absolutePath lastPathComponent];
- if ((!_allowHidden && [itemName hasPrefix:@"."]) || (!isDirectory && ![self _checkFileExtension:itemName])) {
- return [GCDWebServerErrorResponse responseWithClientError:kGCDWebServerHTTPStatusCode_Forbidden message:@"Unlocking item name \"%@\" is not allowed", itemName];
- }
-
- [self logVerbose:@"WebDAV pretending to unlock \"%@\"", relativePath];
- return [GCDWebServerResponse responseWithStatusCode:kGCDWebServerHTTPStatusCode_NoContent];
-}
-
-@end
-
-@implementation GCDWebDAVServer
-
-@synthesize uploadDirectory=_uploadDirectory, allowedFileExtensions=_allowedExtensions, allowHiddenItems=_allowHidden;
-
-@dynamic delegate;
-
-- (instancetype)initWithUploadDirectory:(NSString*)path {
- if ((self = [super init])) {
- _uploadDirectory = [[path stringByStandardizingPath] copy];
- GCDWebDAVServer* __unsafe_unretained server = self;
-
- // 9.1 PROPFIND method
- [self addDefaultHandlerForMethod:@"PROPFIND" requestClass:[GCDWebServerDataRequest class] processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) {
- return [server performPROPFIND:(GCDWebServerDataRequest*)request];
- }];
-
- // 9.3 MKCOL Method
- [self addDefaultHandlerForMethod:@"MKCOL" requestClass:[GCDWebServerDataRequest class] processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) {
- return [server performMKCOL:(GCDWebServerDataRequest*)request];
- }];
-
- // 9.4 GET & HEAD methods
- [self addDefaultHandlerForMethod:@"GET" requestClass:[GCDWebServerRequest class] processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) {
- return [server performGET:request];
- }];
-
- // 9.6 DELETE method
- [self addDefaultHandlerForMethod:@"DELETE" requestClass:[GCDWebServerRequest class] processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) {
- return [server performDELETE:request];
- }];
-
- // 9.7 PUT method
- [self addDefaultHandlerForMethod:@"PUT" requestClass:[GCDWebServerFileRequest class] processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) {
- return [server performPUT:(GCDWebServerFileRequest*)request];
- }];
-
- // 9.8 COPY method
- [self addDefaultHandlerForMethod:@"COPY" requestClass:[GCDWebServerRequest class] processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) {
- return [server performCOPY:request isMove:NO];
- }];
-
- // 9.9 MOVE method
- [self addDefaultHandlerForMethod:@"MOVE" requestClass:[GCDWebServerRequest class] processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) {
- return [server performCOPY:request isMove:YES];
- }];
-
- // 9.10 LOCK method
- [self addDefaultHandlerForMethod:@"LOCK" requestClass:[GCDWebServerDataRequest class] processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) {
- return [server performLOCK:(GCDWebServerDataRequest*)request];
- }];
-
- // 9.11 UNLOCK method
- [self addDefaultHandlerForMethod:@"UNLOCK" requestClass:[GCDWebServerRequest class] processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) {
- return [server performUNLOCK:request];
- }];
-
- // 10.1 OPTIONS method / DAV Header
- [self addDefaultHandlerForMethod:@"OPTIONS" requestClass:[GCDWebServerRequest class] processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) {
- return [server performOPTIONS:request];
- }];
-
- }
- return self;
-}
-
-@end
-
-@implementation GCDWebDAVServer (Subclassing)
-
-- (BOOL)shouldUploadFileAtPath:(NSString*)path withTemporaryFile:(NSString*)tempPath {
- return YES;
-}
-
-- (BOOL)shouldMoveItemFromPath:(NSString*)fromPath toPath:(NSString*)toPath {
- return YES;
-}
-
-- (BOOL)shouldCopyItemFromPath:(NSString*)fromPath toPath:(NSString*)toPath {
- return YES;
-}
-
-- (BOOL)shouldDeleteItemAtPath:(NSString*)path {
- return YES;
-}
-
-- (BOOL)shouldCreateDirectoryAtPath:(NSString*)path {
- return YES;
-}
-
-@end
diff --git a/local-webserver/src/ios/GCDWebServer/GCDWebServer.podspec b/local-webserver/src/ios/GCDWebServer/GCDWebServer.podspec
deleted file mode 100644
index 901de93..0000000
--- a/local-webserver/src/ios/GCDWebServer/GCDWebServer.podspec
+++ /dev/null
@@ -1,75 +0,0 @@
-# http://guides.cocoapods.org/syntax/podspec.html
-# http://guides.cocoapods.org/making/getting-setup-with-trunk.html
-# $ sudo gem update cocoapods
-# (optional) $ pod trunk register {email} {name} --description={computer}
-# $ pod trunk --verbose push
-# DELETE THIS SECTION BEFORE PROCEEDING!
-
-Pod::Spec.new do |s|
- s.name = 'GCDWebServer'
- s.version = '3.3.3'
- s.author = { 'Pierre-Olivier Latour' => 'info@pol-online.net' }
- s.license = { :type => 'BSD', :file => 'LICENSE' }
- s.homepage = 'https://github.com/swisspol/GCDWebServer'
- s.summary = 'Lightweight GCD based HTTP server for OS X & iOS (includes web based uploader & WebDAV server)'
-
- s.source = { :git => 'https://github.com/swisspol/GCDWebServer.git', :tag => s.version.to_s }
- s.ios.deployment_target = '5.0'
- s.tvos.deployment_target = '9.0'
- s.osx.deployment_target = '10.7'
- s.requires_arc = true
-
- s.default_subspec = 'Core'
-
- s.subspec 'Core' do |cs|
- cs.source_files = 'GCDWebServer/**/*.{h,m}'
- cs.private_header_files = "GCDWebServer/Core/GCDWebServerPrivate.h"
- cs.requires_arc = true
- cs.ios.library = 'z'
- cs.ios.frameworks = 'MobileCoreServices', 'CFNetwork'
- cs.tvos.library = 'z'
- cs.tvos.frameworks = 'MobileCoreServices', 'CFNetwork'
- cs.osx.library = 'z'
- cs.osx.framework = 'SystemConfiguration'
- end
-
- s.subspec "CocoaLumberjack" do |cs|
- cs.dependency 'GCDWebServer/Core'
- cs.dependency 'CocoaLumberjack', '~> 2'
- end
-
- s.subspec 'WebDAV' do |cs|
- cs.default_subspec = 'Core'
-
- cs.subspec "Core" do |ccs|
- ccs.dependency 'GCDWebServer/Core'
- ccs.source_files = 'GCDWebDAVServer/*.{h,m}'
- ccs.requires_arc = true
- ccs.ios.library = 'xml2'
- ccs.tvos.library = 'xml2'
- ccs.osx.library = 'xml2'
- ccs.compiler_flags = '-I$(SDKROOT)/usr/include/libxml2'
- end
-
- cs.subspec "CocoaLumberjack" do |cscl|
- cscl.dependency 'GCDWebServer/WebDAV/Core'
- cscl.dependency 'GCDWebServer/CocoaLumberjack'
- end
- end
-
- s.subspec 'WebUploader' do |cs|
- cs.default_subspec = 'Core'
-
- cs.subspec "Core" do |ccs|
- ccs.dependency 'GCDWebServer/Core'
- ccs.source_files = 'GCDWebUploader/*.{h,m}'
- ccs.requires_arc = true
- ccs.resource = "GCDWebUploader/GCDWebUploader.bundle"
- end
-
- cs.subspec "CocoaLumberjack" do |cscl|
- cscl.dependency 'GCDWebServer/WebUploader/Core'
- cscl.dependency 'GCDWebServer/CocoaLumberjack'
- end
- end
-end
diff --git a/local-webserver/src/ios/GCDWebServer/GCDWebServer.xcodeproj/project.pbxproj b/local-webserver/src/ios/GCDWebServer/GCDWebServer.xcodeproj/project.pbxproj
deleted file mode 100644
index fb676ab..0000000
--- a/local-webserver/src/ios/GCDWebServer/GCDWebServer.xcodeproj/project.pbxproj
+++ /dev/null
@@ -1,1546 +0,0 @@
-// !$*UTF8*$!
-{
- archiveVersion = 1;
- classes = {
- };
- objectVersion = 46;
- objects = {
-
-/* Begin PBXAggregateTarget section */
- E274F876187E77D8009E0582 /* Build All */ = {
- isa = PBXAggregateTarget;
- buildConfigurationList = E274F879187E77D8009E0582 /* Build configuration list for PBXAggregateTarget "Build All" */;
- buildPhases = (
- );
- dependencies = (
- CE54F3941AE84FCA003C110E /* PBXTargetDependency */,
- CE54F3961AE84FCA003C110E /* PBXTargetDependency */,
- E2DDD1941BE6941C002CE867 /* PBXTargetDependency */,
- E274F87B187E77E3009E0582 /* PBXTargetDependency */,
- E2DDD20E1BE69EEE002CE867 /* PBXTargetDependency */,
- E2DDD1DC1BE69911002CE867 /* PBXTargetDependency */,
- );
- name = "Build All";
- productName = "Build All";
- };
-/* End PBXAggregateTarget section */
-
-/* Begin PBXBuildFile section */
- CEE28CF41AE0051F00F4023C /* GCDWebServers.h in Headers */ = {isa = PBXBuildFile; fileRef = CEE28CF31AE0051F00F4023C /* GCDWebServers.h */; settings = {ATTRIBUTES = (Public, ); }; };
- CEE28D091AE006C200F4023C /* GCDWebServer.h in Headers */ = {isa = PBXBuildFile; fileRef = E28BAE1618F99C810095C089 /* GCDWebServer.h */; settings = {ATTRIBUTES = (Public, ); }; };
- CEE28D0A1AE006C300F4023C /* GCDWebServer.h in Headers */ = {isa = PBXBuildFile; fileRef = E28BAE1618F99C810095C089 /* GCDWebServer.h */; settings = {ATTRIBUTES = (Public, ); }; };
- CEE28D0B1AE006CC00F4023C /* GCDWebServer.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE1718F99C810095C089 /* GCDWebServer.m */; };
- CEE28D0C1AE006CD00F4023C /* GCDWebServer.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE1718F99C810095C089 /* GCDWebServer.m */; };
- CEE28D0D1AE006D700F4023C /* GCDWebServerConnection.h in Headers */ = {isa = PBXBuildFile; fileRef = E28BAE1818F99C810095C089 /* GCDWebServerConnection.h */; settings = {ATTRIBUTES = (Public, ); }; };
- CEE28D0E1AE006D800F4023C /* GCDWebServerConnection.h in Headers */ = {isa = PBXBuildFile; fileRef = E28BAE1818F99C810095C089 /* GCDWebServerConnection.h */; settings = {ATTRIBUTES = (Public, ); }; };
- CEE28D0F1AE006DE00F4023C /* GCDWebServerConnection.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE1918F99C810095C089 /* GCDWebServerConnection.m */; };
- CEE28D101AE006DF00F4023C /* GCDWebServerConnection.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE1918F99C810095C089 /* GCDWebServerConnection.m */; };
- CEE28D111AE006E200F4023C /* GCDWebServerFunctions.h in Headers */ = {isa = PBXBuildFile; fileRef = E28BAE1A18F99C810095C089 /* GCDWebServerFunctions.h */; settings = {ATTRIBUTES = (Public, ); }; };
- CEE28D121AE006E300F4023C /* GCDWebServerFunctions.h in Headers */ = {isa = PBXBuildFile; fileRef = E28BAE1A18F99C810095C089 /* GCDWebServerFunctions.h */; settings = {ATTRIBUTES = (Public, ); }; };
- CEE28D131AE006E900F4023C /* GCDWebServerFunctions.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE1B18F99C810095C089 /* GCDWebServerFunctions.m */; };
- CEE28D141AE006EA00F4023C /* GCDWebServerFunctions.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE1B18F99C810095C089 /* GCDWebServerFunctions.m */; };
- CEE28D151AE006ED00F4023C /* GCDWebServerHTTPStatusCodes.h in Headers */ = {isa = PBXBuildFile; fileRef = E28BAE1C18F99C810095C089 /* GCDWebServerHTTPStatusCodes.h */; settings = {ATTRIBUTES = (Public, ); }; };
- CEE28D161AE006EE00F4023C /* GCDWebServerHTTPStatusCodes.h in Headers */ = {isa = PBXBuildFile; fileRef = E28BAE1C18F99C810095C089 /* GCDWebServerHTTPStatusCodes.h */; settings = {ATTRIBUTES = (Public, ); }; };
- CEE28D191AE006FD00F4023C /* GCDWebServerRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = E28BAE1E18F99C810095C089 /* GCDWebServerRequest.h */; settings = {ATTRIBUTES = (Public, ); }; };
- CEE28D1A1AE006FD00F4023C /* GCDWebServerRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = E28BAE1E18F99C810095C089 /* GCDWebServerRequest.h */; settings = {ATTRIBUTES = (Public, ); }; };
- CEE28D1B1AE0070300F4023C /* GCDWebServerRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE1F18F99C810095C089 /* GCDWebServerRequest.m */; };
- CEE28D1C1AE0070400F4023C /* GCDWebServerRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE1F18F99C810095C089 /* GCDWebServerRequest.m */; };
- CEE28D1D1AE0070600F4023C /* GCDWebServerResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = E28BAE2018F99C810095C089 /* GCDWebServerResponse.h */; settings = {ATTRIBUTES = (Public, ); }; };
- CEE28D1E1AE0070700F4023C /* GCDWebServerResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = E28BAE2018F99C810095C089 /* GCDWebServerResponse.h */; settings = {ATTRIBUTES = (Public, ); }; };
- CEE28D1F1AE0070D00F4023C /* GCDWebServerResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE2118F99C810095C089 /* GCDWebServerResponse.m */; };
- CEE28D201AE0070E00F4023C /* GCDWebServerResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE2118F99C810095C089 /* GCDWebServerResponse.m */; };
- CEE28D211AE0071200F4023C /* GCDWebServerDataRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = E28BAE2318F99C810095C089 /* GCDWebServerDataRequest.h */; settings = {ATTRIBUTES = (Public, ); }; };
- CEE28D221AE0071300F4023C /* GCDWebServerDataRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = E28BAE2318F99C810095C089 /* GCDWebServerDataRequest.h */; settings = {ATTRIBUTES = (Public, ); }; };
- CEE28D231AE0071A00F4023C /* GCDWebServerDataRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE2418F99C810095C089 /* GCDWebServerDataRequest.m */; };
- CEE28D241AE0071B00F4023C /* GCDWebServerDataRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE2418F99C810095C089 /* GCDWebServerDataRequest.m */; };
- CEE28D251AE0071E00F4023C /* GCDWebServerFileRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = E28BAE2518F99C810095C089 /* GCDWebServerFileRequest.h */; settings = {ATTRIBUTES = (Public, ); }; };
- CEE28D261AE0071E00F4023C /* GCDWebServerFileRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = E28BAE2518F99C810095C089 /* GCDWebServerFileRequest.h */; settings = {ATTRIBUTES = (Public, ); }; };
- CEE28D271AE0072400F4023C /* GCDWebServerFileRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE2618F99C810095C089 /* GCDWebServerFileRequest.m */; };
- CEE28D281AE0072400F4023C /* GCDWebServerFileRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE2618F99C810095C089 /* GCDWebServerFileRequest.m */; };
- CEE28D291AE0072800F4023C /* GCDWebServerMultiPartFormRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = E28BAE2718F99C810095C089 /* GCDWebServerMultiPartFormRequest.h */; settings = {ATTRIBUTES = (Public, ); }; };
- CEE28D2A1AE0072800F4023C /* GCDWebServerMultiPartFormRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = E28BAE2718F99C810095C089 /* GCDWebServerMultiPartFormRequest.h */; settings = {ATTRIBUTES = (Public, ); }; };
- CEE28D2B1AE0073000F4023C /* GCDWebServerMultiPartFormRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE2818F99C810095C089 /* GCDWebServerMultiPartFormRequest.m */; };
- CEE28D2C1AE0073000F4023C /* GCDWebServerMultiPartFormRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE2818F99C810095C089 /* GCDWebServerMultiPartFormRequest.m */; };
- CEE28D2D1AE0073300F4023C /* GCDWebServerURLEncodedFormRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = E28BAE2918F99C810095C089 /* GCDWebServerURLEncodedFormRequest.h */; settings = {ATTRIBUTES = (Public, ); }; };
- CEE28D2E1AE0073400F4023C /* GCDWebServerURLEncodedFormRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = E28BAE2918F99C810095C089 /* GCDWebServerURLEncodedFormRequest.h */; settings = {ATTRIBUTES = (Public, ); }; };
- CEE28D2F1AE0073C00F4023C /* GCDWebServerURLEncodedFormRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE2A18F99C810095C089 /* GCDWebServerURLEncodedFormRequest.m */; };
- CEE28D301AE0073C00F4023C /* GCDWebServerURLEncodedFormRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE2A18F99C810095C089 /* GCDWebServerURLEncodedFormRequest.m */; };
- CEE28D311AE0074200F4023C /* GCDWebServerDataResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = E28BAE2C18F99C810095C089 /* GCDWebServerDataResponse.h */; settings = {ATTRIBUTES = (Public, ); }; };
- CEE28D321AE0074200F4023C /* GCDWebServerDataResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = E28BAE2C18F99C810095C089 /* GCDWebServerDataResponse.h */; settings = {ATTRIBUTES = (Public, ); }; };
- CEE28D331AE0074900F4023C /* GCDWebServerDataResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE2D18F99C810095C089 /* GCDWebServerDataResponse.m */; };
- CEE28D341AE0074A00F4023C /* GCDWebServerDataResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE2D18F99C810095C089 /* GCDWebServerDataResponse.m */; };
- CEE28D351AE0074D00F4023C /* GCDWebServerErrorResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = E28BAE2E18F99C810095C089 /* GCDWebServerErrorResponse.h */; settings = {ATTRIBUTES = (Public, ); }; };
- CEE28D361AE0074E00F4023C /* GCDWebServerErrorResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = E28BAE2E18F99C810095C089 /* GCDWebServerErrorResponse.h */; settings = {ATTRIBUTES = (Public, ); }; };
- CEE28D371AE0075900F4023C /* GCDWebServerErrorResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE2F18F99C810095C089 /* GCDWebServerErrorResponse.m */; };
- CEE28D381AE0075900F4023C /* GCDWebServerErrorResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE2F18F99C810095C089 /* GCDWebServerErrorResponse.m */; };
- CEE28D391AE0075C00F4023C /* GCDWebServerFileResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = E28BAE3018F99C810095C089 /* GCDWebServerFileResponse.h */; settings = {ATTRIBUTES = (Public, ); }; };
- CEE28D3A1AE0075D00F4023C /* GCDWebServerFileResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = E28BAE3018F99C810095C089 /* GCDWebServerFileResponse.h */; settings = {ATTRIBUTES = (Public, ); }; };
- CEE28D3B1AE0076400F4023C /* GCDWebServerFileResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE3118F99C810095C089 /* GCDWebServerFileResponse.m */; };
- CEE28D3C1AE0076400F4023C /* GCDWebServerFileResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE3118F99C810095C089 /* GCDWebServerFileResponse.m */; };
- CEE28D3D1AE0076700F4023C /* GCDWebServerStreamedResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = E28BAE3218F99C810095C089 /* GCDWebServerStreamedResponse.h */; settings = {ATTRIBUTES = (Public, ); }; };
- CEE28D3E1AE0076800F4023C /* GCDWebServerStreamedResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = E28BAE3218F99C810095C089 /* GCDWebServerStreamedResponse.h */; settings = {ATTRIBUTES = (Public, ); }; };
- CEE28D3F1AE0076E00F4023C /* GCDWebServerStreamedResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE3318F99C810095C089 /* GCDWebServerStreamedResponse.m */; };
- CEE28D401AE0076F00F4023C /* GCDWebServerStreamedResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE3318F99C810095C089 /* GCDWebServerStreamedResponse.m */; };
- CEE28D411AE0077800F4023C /* GCDWebDAVServer.h in Headers */ = {isa = PBXBuildFile; fileRef = E2A0E80818F3432600C580B1 /* GCDWebDAVServer.h */; settings = {ATTRIBUTES = (Public, ); }; };
- CEE28D421AE0077800F4023C /* GCDWebDAVServer.h in Headers */ = {isa = PBXBuildFile; fileRef = E2A0E80818F3432600C580B1 /* GCDWebDAVServer.h */; settings = {ATTRIBUTES = (Public, ); }; };
- CEE28D431AE0077F00F4023C /* GCDWebDAVServer.m in Sources */ = {isa = PBXBuildFile; fileRef = E2A0E80918F3432600C580B1 /* GCDWebDAVServer.m */; };
- CEE28D441AE0078000F4023C /* GCDWebDAVServer.m in Sources */ = {isa = PBXBuildFile; fileRef = E2A0E80918F3432600C580B1 /* GCDWebDAVServer.m */; };
- CEE28D451AE0078600F4023C /* GCDWebUploader.bundle in Resources */ = {isa = PBXBuildFile; fileRef = E2BE850718E77ECA0061360B /* GCDWebUploader.bundle */; };
- CEE28D461AE0078600F4023C /* GCDWebUploader.bundle in Resources */ = {isa = PBXBuildFile; fileRef = E2BE850718E77ECA0061360B /* GCDWebUploader.bundle */; };
- CEE28D471AE0078A00F4023C /* GCDWebUploader.h in Headers */ = {isa = PBXBuildFile; fileRef = E2BE850818E77ECA0061360B /* GCDWebUploader.h */; settings = {ATTRIBUTES = (Public, ); }; };
- CEE28D481AE0078B00F4023C /* GCDWebUploader.h in Headers */ = {isa = PBXBuildFile; fileRef = E2BE850818E77ECA0061360B /* GCDWebUploader.h */; settings = {ATTRIBUTES = (Public, ); }; };
- CEE28D491AE0079100F4023C /* GCDWebUploader.m in Sources */ = {isa = PBXBuildFile; fileRef = E2BE850918E77ECA0061360B /* GCDWebUploader.m */; };
- CEE28D4A1AE0079200F4023C /* GCDWebUploader.m in Sources */ = {isa = PBXBuildFile; fileRef = E2BE850918E77ECA0061360B /* GCDWebUploader.m */; };
- CEE28D4C1AE0095600F4023C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE28D4B1AE0095600F4023C /* Foundation.framework */; };
- CEE28D4F1AE0097E00F4023C /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E208D148167B76B700500836 /* CFNetwork.framework */; };
- CEE28D501AE0098600F4023C /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E2BE851018E79DAF0061360B /* SystemConfiguration.framework */; };
- CEE28D511AE0098C00F4023C /* CoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E208D1B2167BB17E00500836 /* CoreServices.framework */; };
- CEE28D521AE00A7A00F4023C /* GCDWebServers.h in Headers */ = {isa = PBXBuildFile; fileRef = CEE28CF31AE0051F00F4023C /* GCDWebServers.h */; settings = {ATTRIBUTES = (Public, ); }; };
- CEE28D571AE00AFE00F4023C /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E221129C1690B7BA0048D2B2 /* MobileCoreServices.framework */; };
- CEE28D591AE00AFE00F4023C /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E22112981690B7AA0048D2B2 /* CFNetwork.framework */; };
- CEE28D6A1AE1ABAA00F4023C /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE28D691AE1ABAA00F4023C /* UIKit.framework */; };
- E208D149167B76B700500836 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E208D148167B76B700500836 /* CFNetwork.framework */; };
- E208D1B3167BB17E00500836 /* CoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E208D1B2167BB17E00500836 /* CoreServices.framework */; };
- E221128F1690B6470048D2B2 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = E221128E1690B6470048D2B2 /* main.m */; };
- E240392B1BA09207000B7089 /* GCDWebServers.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE28CD11AE004D800F4023C /* GCDWebServers.framework */; };
- E24039321BA092B7000B7089 /* Tests.m in Sources */ = {isa = PBXBuildFile; fileRef = E24039311BA092B7000B7089 /* Tests.m */; };
- E28BAE3418F99C810095C089 /* GCDWebServer.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE1718F99C810095C089 /* GCDWebServer.m */; };
- E28BAE3618F99C810095C089 /* GCDWebServerConnection.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE1918F99C810095C089 /* GCDWebServerConnection.m */; };
- E28BAE3818F99C810095C089 /* GCDWebServerFunctions.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE1B18F99C810095C089 /* GCDWebServerFunctions.m */; };
- E28BAE3A18F99C810095C089 /* GCDWebServerRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE1F18F99C810095C089 /* GCDWebServerRequest.m */; };
- E28BAE3C18F99C810095C089 /* GCDWebServerResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE2118F99C810095C089 /* GCDWebServerResponse.m */; };
- E28BAE3E18F99C810095C089 /* GCDWebServerDataRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE2418F99C810095C089 /* GCDWebServerDataRequest.m */; };
- E28BAE4018F99C810095C089 /* GCDWebServerFileRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE2618F99C810095C089 /* GCDWebServerFileRequest.m */; };
- E28BAE4218F99C810095C089 /* GCDWebServerMultiPartFormRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE2818F99C810095C089 /* GCDWebServerMultiPartFormRequest.m */; };
- E28BAE4418F99C810095C089 /* GCDWebServerURLEncodedFormRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE2A18F99C810095C089 /* GCDWebServerURLEncodedFormRequest.m */; };
- E28BAE4618F99C810095C089 /* GCDWebServerDataResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE2D18F99C810095C089 /* GCDWebServerDataResponse.m */; };
- E28BAE4818F99C810095C089 /* GCDWebServerErrorResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE2F18F99C810095C089 /* GCDWebServerErrorResponse.m */; };
- E28BAE4A18F99C810095C089 /* GCDWebServerFileResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE3118F99C810095C089 /* GCDWebServerFileResponse.m */; };
- E28BAE4C18F99C810095C089 /* GCDWebServerStreamedResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE3318F99C810095C089 /* GCDWebServerStreamedResponse.m */; };
- E2A0E80A18F3432600C580B1 /* GCDWebDAVServer.m in Sources */ = {isa = PBXBuildFile; fileRef = E2A0E80918F3432600C580B1 /* GCDWebDAVServer.m */; };
- E2BE850C18E785940061360B /* GCDWebUploader.m in Sources */ = {isa = PBXBuildFile; fileRef = E2BE850918E77ECA0061360B /* GCDWebUploader.m */; };
- E2BE850F18E788990061360B /* GCDWebUploader.bundle in CopyFiles */ = {isa = PBXBuildFile; fileRef = E2BE850718E77ECA0061360B /* GCDWebUploader.bundle */; };
- E2BE851118E79DAF0061360B /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E2BE851018E79DAF0061360B /* SystemConfiguration.framework */; };
- E2DDD1951BE69427002CE867 /* GCDWebUploader.bundle in Resources */ = {isa = PBXBuildFile; fileRef = E2BE850718E77ECA0061360B /* GCDWebUploader.bundle */; };
- E2DDD1961BE6945F002CE867 /* GCDWebServer.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE1718F99C810095C089 /* GCDWebServer.m */; };
- E2DDD1971BE6945F002CE867 /* GCDWebServerConnection.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE1918F99C810095C089 /* GCDWebServerConnection.m */; };
- E2DDD1981BE6945F002CE867 /* GCDWebServerFunctions.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE1B18F99C810095C089 /* GCDWebServerFunctions.m */; };
- E2DDD1991BE6945F002CE867 /* GCDWebServerRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE1F18F99C810095C089 /* GCDWebServerRequest.m */; };
- E2DDD19A1BE6945F002CE867 /* GCDWebServerResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE2118F99C810095C089 /* GCDWebServerResponse.m */; };
- E2DDD19B1BE6945F002CE867 /* GCDWebServerDataRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE2418F99C810095C089 /* GCDWebServerDataRequest.m */; };
- E2DDD19C1BE6945F002CE867 /* GCDWebServerFileRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE2618F99C810095C089 /* GCDWebServerFileRequest.m */; };
- E2DDD19D1BE6945F002CE867 /* GCDWebServerMultiPartFormRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE2818F99C810095C089 /* GCDWebServerMultiPartFormRequest.m */; };
- E2DDD19E1BE6945F002CE867 /* GCDWebServerURLEncodedFormRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE2A18F99C810095C089 /* GCDWebServerURLEncodedFormRequest.m */; };
- E2DDD19F1BE6945F002CE867 /* GCDWebServerDataResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE2D18F99C810095C089 /* GCDWebServerDataResponse.m */; };
- E2DDD1A01BE6945F002CE867 /* GCDWebServerErrorResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE2F18F99C810095C089 /* GCDWebServerErrorResponse.m */; };
- E2DDD1A11BE6945F002CE867 /* GCDWebServerFileResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE3118F99C810095C089 /* GCDWebServerFileResponse.m */; };
- E2DDD1A21BE6945F002CE867 /* GCDWebServerStreamedResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE3318F99C810095C089 /* GCDWebServerStreamedResponse.m */; };
- E2DDD1A31BE6945F002CE867 /* GCDWebDAVServer.m in Sources */ = {isa = PBXBuildFile; fileRef = E2A0E80918F3432600C580B1 /* GCDWebDAVServer.m */; };
- E2DDD1A41BE6945F002CE867 /* GCDWebUploader.m in Sources */ = {isa = PBXBuildFile; fileRef = E2BE850918E77ECA0061360B /* GCDWebUploader.m */; };
- E2DDD1A51BE6947F002CE867 /* GCDWebServer.h in Headers */ = {isa = PBXBuildFile; fileRef = E28BAE1618F99C810095C089 /* GCDWebServer.h */; settings = {ATTRIBUTES = (Public, ); }; };
- E2DDD1A61BE6947F002CE867 /* GCDWebServerConnection.h in Headers */ = {isa = PBXBuildFile; fileRef = E28BAE1818F99C810095C089 /* GCDWebServerConnection.h */; settings = {ATTRIBUTES = (Public, ); }; };
- E2DDD1A71BE6947F002CE867 /* GCDWebServerFunctions.h in Headers */ = {isa = PBXBuildFile; fileRef = E28BAE1A18F99C810095C089 /* GCDWebServerFunctions.h */; settings = {ATTRIBUTES = (Public, ); }; };
- E2DDD1A81BE6947F002CE867 /* GCDWebServerHTTPStatusCodes.h in Headers */ = {isa = PBXBuildFile; fileRef = E28BAE1C18F99C810095C089 /* GCDWebServerHTTPStatusCodes.h */; settings = {ATTRIBUTES = (Public, ); }; };
- E2DDD1A91BE6947F002CE867 /* GCDWebServerRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = E28BAE1E18F99C810095C089 /* GCDWebServerRequest.h */; settings = {ATTRIBUTES = (Public, ); }; };
- E2DDD1AA1BE6947F002CE867 /* GCDWebServerResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = E28BAE2018F99C810095C089 /* GCDWebServerResponse.h */; settings = {ATTRIBUTES = (Public, ); }; };
- E2DDD1AB1BE6947F002CE867 /* GCDWebServerDataRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = E28BAE2318F99C810095C089 /* GCDWebServerDataRequest.h */; settings = {ATTRIBUTES = (Public, ); }; };
- E2DDD1AC1BE6947F002CE867 /* GCDWebServerFileRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = E28BAE2518F99C810095C089 /* GCDWebServerFileRequest.h */; settings = {ATTRIBUTES = (Public, ); }; };
- E2DDD1AD1BE6947F002CE867 /* GCDWebServerMultiPartFormRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = E28BAE2718F99C810095C089 /* GCDWebServerMultiPartFormRequest.h */; settings = {ATTRIBUTES = (Public, ); }; };
- E2DDD1AE1BE6947F002CE867 /* GCDWebServerURLEncodedFormRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = E28BAE2918F99C810095C089 /* GCDWebServerURLEncodedFormRequest.h */; settings = {ATTRIBUTES = (Public, ); }; };
- E2DDD1AF1BE6947F002CE867 /* GCDWebServerDataResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = E28BAE2C18F99C810095C089 /* GCDWebServerDataResponse.h */; settings = {ATTRIBUTES = (Public, ); }; };
- E2DDD1B01BE6947F002CE867 /* GCDWebServerErrorResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = E28BAE2E18F99C810095C089 /* GCDWebServerErrorResponse.h */; settings = {ATTRIBUTES = (Public, ); }; };
- E2DDD1B11BE6947F002CE867 /* GCDWebServerFileResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = E28BAE3018F99C810095C089 /* GCDWebServerFileResponse.h */; settings = {ATTRIBUTES = (Public, ); }; };
- E2DDD1B21BE6947F002CE867 /* GCDWebServerStreamedResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = E28BAE3218F99C810095C089 /* GCDWebServerStreamedResponse.h */; settings = {ATTRIBUTES = (Public, ); }; };
- E2DDD1B31BE6947F002CE867 /* GCDWebDAVServer.h in Headers */ = {isa = PBXBuildFile; fileRef = E2A0E80818F3432600C580B1 /* GCDWebDAVServer.h */; settings = {ATTRIBUTES = (Public, ); }; };
- E2DDD1B41BE6947F002CE867 /* GCDWebUploader.h in Headers */ = {isa = PBXBuildFile; fileRef = E2BE850818E77ECA0061360B /* GCDWebUploader.h */; settings = {ATTRIBUTES = (Public, ); }; };
- E2DDD1B51BE6947F002CE867 /* GCDWebServers.h in Headers */ = {isa = PBXBuildFile; fileRef = CEE28CF31AE0051F00F4023C /* GCDWebServers.h */; settings = {ATTRIBUTES = (Public, ); }; };
- E2DDD1B71BE6951A002CE867 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E2DDD1B61BE6951A002CE867 /* CFNetwork.framework */; };
- E2DDD1BA1BE69545002CE867 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = E2DDD1B91BE69545002CE867 /* libz.tbd */; };
- E2DDD1BC1BE69551002CE867 /* libxml2.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = E2DDD1BB1BE69551002CE867 /* libxml2.tbd */; };
- E2DDD1BE1BE6956F002CE867 /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E2DDD1BD1BE6956F002CE867 /* MobileCoreServices.framework */; };
- E2DDD1C01BE69576002CE867 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E2DDD1BF1BE69576002CE867 /* UIKit.framework */; };
- E2DDD1CB1BE698A8002CE867 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = E2DDD1CA1BE698A8002CE867 /* main.m */; };
- E2DDD1CE1BE698A8002CE867 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = E2DDD1CD1BE698A8002CE867 /* AppDelegate.m */; };
- E2DDD1D11BE698A8002CE867 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E2DDD1D01BE698A8002CE867 /* ViewController.m */; };
- E2DDD1D41BE698A8002CE867 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E2DDD1D21BE698A8002CE867 /* Main.storyboard */; };
- E2DDD1D61BE698A8002CE867 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = E2DDD1D51BE698A8002CE867 /* Assets.xcassets */; };
- E2DDD1DD1BE69B1C002CE867 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E2DDD1BF1BE69576002CE867 /* UIKit.framework */; };
- E2DDD1DE1BE69BB7002CE867 /* GCDWebServer.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE1718F99C810095C089 /* GCDWebServer.m */; };
- E2DDD1DF1BE69BB7002CE867 /* GCDWebServerConnection.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE1918F99C810095C089 /* GCDWebServerConnection.m */; };
- E2DDD1E01BE69BB7002CE867 /* GCDWebServerFunctions.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE1B18F99C810095C089 /* GCDWebServerFunctions.m */; };
- E2DDD1E11BE69BB7002CE867 /* GCDWebServerRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE1F18F99C810095C089 /* GCDWebServerRequest.m */; };
- E2DDD1E21BE69BB7002CE867 /* GCDWebServerResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE2118F99C810095C089 /* GCDWebServerResponse.m */; };
- E2DDD1E31BE69BB7002CE867 /* GCDWebServerDataRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE2418F99C810095C089 /* GCDWebServerDataRequest.m */; };
- E2DDD1E41BE69BB7002CE867 /* GCDWebServerFileRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE2618F99C810095C089 /* GCDWebServerFileRequest.m */; };
- E2DDD1E51BE69BB7002CE867 /* GCDWebServerMultiPartFormRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE2818F99C810095C089 /* GCDWebServerMultiPartFormRequest.m */; };
- E2DDD1E61BE69BB7002CE867 /* GCDWebServerURLEncodedFormRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE2A18F99C810095C089 /* GCDWebServerURLEncodedFormRequest.m */; };
- E2DDD1E71BE69BB7002CE867 /* GCDWebServerDataResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE2D18F99C810095C089 /* GCDWebServerDataResponse.m */; };
- E2DDD1E81BE69BB7002CE867 /* GCDWebServerErrorResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE2F18F99C810095C089 /* GCDWebServerErrorResponse.m */; };
- E2DDD1E91BE69BB7002CE867 /* GCDWebServerFileResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE3118F99C810095C089 /* GCDWebServerFileResponse.m */; };
- E2DDD1EA1BE69BB7002CE867 /* GCDWebServerStreamedResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE3318F99C810095C089 /* GCDWebServerStreamedResponse.m */; };
- E2DDD1EB1BE69BB7002CE867 /* GCDWebDAVServer.m in Sources */ = {isa = PBXBuildFile; fileRef = E2A0E80918F3432600C580B1 /* GCDWebDAVServer.m */; };
- E2DDD1EC1BE69BB7002CE867 /* GCDWebUploader.m in Sources */ = {isa = PBXBuildFile; fileRef = E2BE850918E77ECA0061360B /* GCDWebUploader.m */; };
- E2DDD1ED1BE69BC5002CE867 /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E2DDD1BD1BE6956F002CE867 /* MobileCoreServices.framework */; };
- E2DDD1EE1BE69BC5002CE867 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E2DDD1B61BE6951A002CE867 /* CFNetwork.framework */; };
- E2DDD1EF1BE69BC5002CE867 /* libxml2.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = E2DDD1BB1BE69551002CE867 /* libxml2.tbd */; };
- E2DDD1F01BE69BC5002CE867 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = E2DDD1B91BE69545002CE867 /* libz.tbd */; };
- E2DDD1F11BE69BE9002CE867 /* GCDWebUploader.bundle in Resources */ = {isa = PBXBuildFile; fileRef = E2BE850718E77ECA0061360B /* GCDWebUploader.bundle */; };
- E2DDD1FA1BE69EE5002CE867 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = E2DDD1F91BE69EE5002CE867 /* main.m */; };
- E2DDD1FD1BE69EE5002CE867 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = E2DDD1FC1BE69EE5002CE867 /* AppDelegate.m */; };
- E2DDD2001BE69EE5002CE867 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E2DDD1FF1BE69EE5002CE867 /* ViewController.m */; };
- E2DDD2031BE69EE5002CE867 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E2DDD2011BE69EE5002CE867 /* Main.storyboard */; };
- E2DDD2051BE69EE5002CE867 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = E2DDD2041BE69EE5002CE867 /* Assets.xcassets */; };
- E2DDD2081BE69EE5002CE867 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E2DDD2061BE69EE5002CE867 /* LaunchScreen.storyboard */; };
- E2DDD20F1BE69F03002CE867 /* GCDWebUploader.bundle in Resources */ = {isa = PBXBuildFile; fileRef = E2BE850718E77ECA0061360B /* GCDWebUploader.bundle */; };
- E2DDD2101BE69F17002CE867 /* GCDWebServer.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE1718F99C810095C089 /* GCDWebServer.m */; };
- E2DDD2111BE69F17002CE867 /* GCDWebServerConnection.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE1918F99C810095C089 /* GCDWebServerConnection.m */; };
- E2DDD2121BE69F17002CE867 /* GCDWebServerFunctions.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE1B18F99C810095C089 /* GCDWebServerFunctions.m */; };
- E2DDD2131BE69F17002CE867 /* GCDWebServerRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE1F18F99C810095C089 /* GCDWebServerRequest.m */; };
- E2DDD2141BE69F17002CE867 /* GCDWebServerResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE2118F99C810095C089 /* GCDWebServerResponse.m */; };
- E2DDD2151BE69F17002CE867 /* GCDWebServerDataRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE2418F99C810095C089 /* GCDWebServerDataRequest.m */; };
- E2DDD2161BE69F17002CE867 /* GCDWebServerFileRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE2618F99C810095C089 /* GCDWebServerFileRequest.m */; };
- E2DDD2171BE69F17002CE867 /* GCDWebServerMultiPartFormRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE2818F99C810095C089 /* GCDWebServerMultiPartFormRequest.m */; };
- E2DDD2181BE69F17002CE867 /* GCDWebServerURLEncodedFormRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE2A18F99C810095C089 /* GCDWebServerURLEncodedFormRequest.m */; };
- E2DDD2191BE69F17002CE867 /* GCDWebServerDataResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE2D18F99C810095C089 /* GCDWebServerDataResponse.m */; };
- E2DDD21A1BE69F17002CE867 /* GCDWebServerErrorResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE2F18F99C810095C089 /* GCDWebServerErrorResponse.m */; };
- E2DDD21B1BE69F17002CE867 /* GCDWebServerFileResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE3118F99C810095C089 /* GCDWebServerFileResponse.m */; };
- E2DDD21C1BE69F17002CE867 /* GCDWebServerStreamedResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = E28BAE3318F99C810095C089 /* GCDWebServerStreamedResponse.m */; };
- E2DDD21D1BE69F25002CE867 /* GCDWebDAVServer.m in Sources */ = {isa = PBXBuildFile; fileRef = E2A0E80918F3432600C580B1 /* GCDWebDAVServer.m */; };
- E2DDD21E1BE69F25002CE867 /* GCDWebUploader.m in Sources */ = {isa = PBXBuildFile; fileRef = E2BE850918E77ECA0061360B /* GCDWebUploader.m */; };
- E2DDD21F1BE6A061002CE867 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE28D691AE1ABAA00F4023C /* UIKit.framework */; };
- E2DDD2201BE6A067002CE867 /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E221129C1690B7BA0048D2B2 /* MobileCoreServices.framework */; };
- E2DDD2211BE6A06E002CE867 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E22112981690B7AA0048D2B2 /* CFNetwork.framework */; };
- E2DDD2251BE6A0AE002CE867 /* libxml2.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = E2DDD2241BE6A0AE002CE867 /* libxml2.tbd */; };
- E2DDD2271BE6A0B4002CE867 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = E2DDD2261BE6A0B4002CE867 /* libz.tbd */; };
- E2DDD2281BE6A0D8002CE867 /* libxml2.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = E2DDD2241BE6A0AE002CE867 /* libxml2.tbd */; };
- E2DDD2291BE6A0D8002CE867 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = E2DDD2261BE6A0B4002CE867 /* libz.tbd */; };
- E2DDD22B1BE6A0EB002CE867 /* libxml2.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = E2DDD22A1BE6A0EB002CE867 /* libxml2.tbd */; };
- E2DDD22D1BE6A0EF002CE867 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = E2DDD22C1BE6A0EF002CE867 /* libz.tbd */; };
- E2DDD22E1BE6A106002CE867 /* libxml2.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = E2DDD22A1BE6A0EB002CE867 /* libxml2.tbd */; };
- E2DDD22F1BE6A108002CE867 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = E2DDD22C1BE6A0EF002CE867 /* libz.tbd */; };
-/* End PBXBuildFile section */
-
-/* Begin PBXContainerItemProxy section */
- CE54F3931AE84FCA003C110E /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = CEE28CD01AE004D800F4023C;
- remoteInfo = "GCDWebServers (Mac)";
- };
- CE54F3951AE84FCA003C110E /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = CEE28CEE1AE0051F00F4023C;
- remoteInfo = "GCDWebServers (iOS)";
- };
- E240392C1BA09207000B7089 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = CEE28CD01AE004D800F4023C;
- remoteInfo = "GCDWebServers (Mac)";
- };
- E274F87A187E77E3009E0582 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 8DD76FA90486AB0100D96B5E;
- remoteInfo = "GCDWebServer (Mac)";
- };
- E2DDD1931BE6941C002CE867 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = E2DDD18A1BE69404002CE867;
- remoteInfo = "GCDWebServer (tvOS)";
- };
- E2DDD1DB1BE69911002CE867 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = E2DDD1C61BE698A8002CE867;
- remoteInfo = "GCDWebServer (tvOS)";
- };
- E2DDD20D1BE69EEE002CE867 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = E2DDD1F51BE69EE4002CE867;
- remoteInfo = "GCDWebServer (iOS)";
- };
-/* End PBXContainerItemProxy section */
-
-/* Begin PBXCopyFilesBuildPhase section */
- E2BE850E18E788910061360B /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 16;
- files = (
- E2BE850F18E788990061360B /* GCDWebUploader.bundle in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXCopyFilesBuildPhase section */
-
-/* Begin PBXFileReference section */
- 8DD76FB20486AB0100D96B5E /* GCDWebServer */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = GCDWebServer; sourceTree = BUILT_PRODUCTS_DIR; };
- CEE28CD11AE004D800F4023C /* GCDWebServers.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = GCDWebServers.framework; sourceTree = BUILT_PRODUCTS_DIR; };
- CEE28CEF1AE0051F00F4023C /* GCDWebServers.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = GCDWebServers.framework; sourceTree = BUILT_PRODUCTS_DIR; };
- CEE28CF21AE0051F00F4023C /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
- CEE28CF31AE0051F00F4023C /* GCDWebServers.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GCDWebServers.h; sourceTree = "<group>"; };
- CEE28D4B1AE0095600F4023C /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
- CEE28D691AE1ABAA00F4023C /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; };
- E208D148167B76B700500836 /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = System/Library/Frameworks/CFNetwork.framework; sourceTree = SDKROOT; };
- E208D1B2167BB17E00500836 /* CoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreServices.framework; path = System/Library/Frameworks/CoreServices.framework; sourceTree = SDKROOT; };
- E221128E1690B6470048D2B2 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
- E22112981690B7AA0048D2B2 /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.0.sdk/System/Library/Frameworks/CFNetwork.framework; sourceTree = DEVELOPER_DIR; };
- E221129C1690B7BA0048D2B2 /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.0.sdk/System/Library/Frameworks/MobileCoreServices.framework; sourceTree = DEVELOPER_DIR; };
- E24039251BA09207000B7089 /* Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
- E24039311BA092B7000B7089 /* Tests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Tests.m; sourceTree = "<group>"; };
- E28BAE1618F99C810095C089 /* GCDWebServer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCDWebServer.h; sourceTree = "<group>"; };
- E28BAE1718F99C810095C089 /* GCDWebServer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GCDWebServer.m; sourceTree = "<group>"; };
- E28BAE1818F99C810095C089 /* GCDWebServerConnection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCDWebServerConnection.h; sourceTree = "<group>"; };
- E28BAE1918F99C810095C089 /* GCDWebServerConnection.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GCDWebServerConnection.m; sourceTree = "<group>"; };
- E28BAE1A18F99C810095C089 /* GCDWebServerFunctions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCDWebServerFunctions.h; sourceTree = "<group>"; };
- E28BAE1B18F99C810095C089 /* GCDWebServerFunctions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GCDWebServerFunctions.m; sourceTree = "<group>"; };
- E28BAE1C18F99C810095C089 /* GCDWebServerHTTPStatusCodes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCDWebServerHTTPStatusCodes.h; sourceTree = "<group>"; };
- E28BAE1D18F99C810095C089 /* GCDWebServerPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCDWebServerPrivate.h; sourceTree = "<group>"; };
- E28BAE1E18F99C810095C089 /* GCDWebServerRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCDWebServerRequest.h; sourceTree = "<group>"; };
- E28BAE1F18F99C810095C089 /* GCDWebServerRequest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GCDWebServerRequest.m; sourceTree = "<group>"; };
- E28BAE2018F99C810095C089 /* GCDWebServerResponse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCDWebServerResponse.h; sourceTree = "<group>"; };
- E28BAE2118F99C810095C089 /* GCDWebServerResponse.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GCDWebServerResponse.m; sourceTree = "<group>"; };
- E28BAE2318F99C810095C089 /* GCDWebServerDataRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCDWebServerDataRequest.h; sourceTree = "<group>"; };
- E28BAE2418F99C810095C089 /* GCDWebServerDataRequest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GCDWebServerDataRequest.m; sourceTree = "<group>"; };
- E28BAE2518F99C810095C089 /* GCDWebServerFileRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCDWebServerFileRequest.h; sourceTree = "<group>"; };
- E28BAE2618F99C810095C089 /* GCDWebServerFileRequest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GCDWebServerFileRequest.m; sourceTree = "<group>"; };
- E28BAE2718F99C810095C089 /* GCDWebServerMultiPartFormRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCDWebServerMultiPartFormRequest.h; sourceTree = "<group>"; };
- E28BAE2818F99C810095C089 /* GCDWebServerMultiPartFormRequest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GCDWebServerMultiPartFormRequest.m; sourceTree = "<group>"; };
- E28BAE2918F99C810095C089 /* GCDWebServerURLEncodedFormRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCDWebServerURLEncodedFormRequest.h; sourceTree = "<group>"; };
- E28BAE2A18F99C810095C089 /* GCDWebServerURLEncodedFormRequest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GCDWebServerURLEncodedFormRequest.m; sourceTree = "<group>"; };
- E28BAE2C18F99C810095C089 /* GCDWebServerDataResponse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCDWebServerDataResponse.h; sourceTree = "<group>"; };
- E28BAE2D18F99C810095C089 /* GCDWebServerDataResponse.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GCDWebServerDataResponse.m; sourceTree = "<group>"; };
- E28BAE2E18F99C810095C089 /* GCDWebServerErrorResponse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCDWebServerErrorResponse.h; sourceTree = "<group>"; };
- E28BAE2F18F99C810095C089 /* GCDWebServerErrorResponse.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GCDWebServerErrorResponse.m; sourceTree = "<group>"; };
- E28BAE3018F99C810095C089 /* GCDWebServerFileResponse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCDWebServerFileResponse.h; sourceTree = "<group>"; };
- E28BAE3118F99C810095C089 /* GCDWebServerFileResponse.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GCDWebServerFileResponse.m; sourceTree = "<group>"; };
- E28BAE3218F99C810095C089 /* GCDWebServerStreamedResponse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCDWebServerStreamedResponse.h; sourceTree = "<group>"; };
- E28BAE3318F99C810095C089 /* GCDWebServerStreamedResponse.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GCDWebServerStreamedResponse.m; sourceTree = "<group>"; };
- E2A0E80818F3432600C580B1 /* GCDWebDAVServer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCDWebDAVServer.h; sourceTree = "<group>"; };
- E2A0E80918F3432600C580B1 /* GCDWebDAVServer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GCDWebDAVServer.m; sourceTree = "<group>"; };
- E2BE850718E77ECA0061360B /* GCDWebUploader.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = GCDWebUploader.bundle; sourceTree = "<group>"; };
- E2BE850818E77ECA0061360B /* GCDWebUploader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCDWebUploader.h; sourceTree = "<group>"; };
- E2BE850918E77ECA0061360B /* GCDWebUploader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GCDWebUploader.m; sourceTree = "<group>"; };
- E2BE851018E79DAF0061360B /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; };
- E2DDD18B1BE69404002CE867 /* GCDWebServers.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = GCDWebServers.framework; sourceTree = BUILT_PRODUCTS_DIR; };
- E2DDD1B61BE6951A002CE867 /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS9.0.sdk/System/Library/Frameworks/CFNetwork.framework; sourceTree = DEVELOPER_DIR; };
- E2DDD1B91BE69545002CE867 /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS9.0.sdk/usr/lib/libz.tbd; sourceTree = DEVELOPER_DIR; };
- E2DDD1BB1BE69551002CE867 /* libxml2.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libxml2.tbd; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS9.0.sdk/usr/lib/libxml2.tbd; sourceTree = DEVELOPER_DIR; };
- E2DDD1BD1BE6956F002CE867 /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS9.0.sdk/System/Library/Frameworks/MobileCoreServices.framework; sourceTree = DEVELOPER_DIR; };
- E2DDD1BF1BE69576002CE867 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS9.0.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; };
- E2DDD1C71BE698A8002CE867 /* GCDWebServer.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = GCDWebServer.app; sourceTree = BUILT_PRODUCTS_DIR; };
- E2DDD1CA1BE698A8002CE867 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
- E2DDD1CC1BE698A8002CE867 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
- E2DDD1CD1BE698A8002CE867 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
- E2DDD1CF1BE698A8002CE867 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = "<group>"; };
- E2DDD1D01BE698A8002CE867 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = "<group>"; };
- E2DDD1D31BE698A8002CE867 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
- E2DDD1D51BE698A8002CE867 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
- E2DDD1D71BE698A8002CE867 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
- E2DDD1F61BE69EE4002CE867 /* GCDWebServer.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = GCDWebServer.app; sourceTree = BUILT_PRODUCTS_DIR; };
- E2DDD1F91BE69EE5002CE867 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
- E2DDD1FB1BE69EE5002CE867 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
- E2DDD1FC1BE69EE5002CE867 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
- E2DDD1FE1BE69EE5002CE867 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = "<group>"; };
- E2DDD1FF1BE69EE5002CE867 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = "<group>"; };
- E2DDD2021BE69EE5002CE867 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
- E2DDD2041BE69EE5002CE867 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
- E2DDD2071BE69EE5002CE867 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
- E2DDD2091BE69EE5002CE867 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
- E2DDD2241BE6A0AE002CE867 /* libxml2.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libxml2.tbd; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.1.sdk/usr/lib/libxml2.tbd; sourceTree = DEVELOPER_DIR; };
- E2DDD2261BE6A0B4002CE867 /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.1.sdk/usr/lib/libz.tbd; sourceTree = DEVELOPER_DIR; };
- E2DDD22A1BE6A0EB002CE867 /* libxml2.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libxml2.tbd; path = usr/lib/libxml2.tbd; sourceTree = SDKROOT; };
- E2DDD22C1BE6A0EF002CE867 /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; };
-/* End PBXFileReference section */
-
-/* Begin PBXFrameworksBuildPhase section */
- 8DD76FAD0486AB0100D96B5E /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- E2BE851118E79DAF0061360B /* SystemConfiguration.framework in Frameworks */,
- E208D1B3167BB17E00500836 /* CoreServices.framework in Frameworks */,
- E208D149167B76B700500836 /* CFNetwork.framework in Frameworks */,
- E2DDD22E1BE6A106002CE867 /* libxml2.tbd in Frameworks */,
- E2DDD22F1BE6A108002CE867 /* libz.tbd in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- CEE28CCD1AE004D800F4023C /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- CEE28D4C1AE0095600F4023C /* Foundation.framework in Frameworks */,
- CEE28D511AE0098C00F4023C /* CoreServices.framework in Frameworks */,
- CEE28D501AE0098600F4023C /* SystemConfiguration.framework in Frameworks */,
- CEE28D4F1AE0097E00F4023C /* CFNetwork.framework in Frameworks */,
- E2DDD22B1BE6A0EB002CE867 /* libxml2.tbd in Frameworks */,
- E2DDD22D1BE6A0EF002CE867 /* libz.tbd in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- CEE28CEB1AE0051F00F4023C /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- CEE28D6A1AE1ABAA00F4023C /* UIKit.framework in Frameworks */,
- CEE28D571AE00AFE00F4023C /* MobileCoreServices.framework in Frameworks */,
- CEE28D591AE00AFE00F4023C /* CFNetwork.framework in Frameworks */,
- E2DDD2251BE6A0AE002CE867 /* libxml2.tbd in Frameworks */,
- E2DDD2271BE6A0B4002CE867 /* libz.tbd in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- E24039221BA09207000B7089 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- E240392B1BA09207000B7089 /* GCDWebServers.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- E2DDD1871BE69404002CE867 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- E2DDD1C01BE69576002CE867 /* UIKit.framework in Frameworks */,
- E2DDD1BE1BE6956F002CE867 /* MobileCoreServices.framework in Frameworks */,
- E2DDD1B71BE6951A002CE867 /* CFNetwork.framework in Frameworks */,
- E2DDD1BC1BE69551002CE867 /* libxml2.tbd in Frameworks */,
- E2DDD1BA1BE69545002CE867 /* libz.tbd in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- E2DDD1C41BE698A8002CE867 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- E2DDD1DD1BE69B1C002CE867 /* UIKit.framework in Frameworks */,
- E2DDD1ED1BE69BC5002CE867 /* MobileCoreServices.framework in Frameworks */,
- E2DDD1EE1BE69BC5002CE867 /* CFNetwork.framework in Frameworks */,
- E2DDD1EF1BE69BC5002CE867 /* libxml2.tbd in Frameworks */,
- E2DDD1F01BE69BC5002CE867 /* libz.tbd in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- E2DDD1F31BE69EE4002CE867 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- E2DDD21F1BE6A061002CE867 /* UIKit.framework in Frameworks */,
- E2DDD2201BE6A067002CE867 /* MobileCoreServices.framework in Frameworks */,
- E2DDD2211BE6A06E002CE867 /* CFNetwork.framework in Frameworks */,
- E2DDD2281BE6A0D8002CE867 /* libxml2.tbd in Frameworks */,
- E2DDD2291BE6A0D8002CE867 /* libz.tbd in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXFrameworksBuildPhase section */
-
-/* Begin PBXGroup section */
- 08FB7794FE84155DC02AAC07 /* LittleCMS */ = {
- isa = PBXGroup;
- children = (
- E28BAE1418F99C810095C089 /* GCDWebServer */,
- E2A0E80718F3432600C580B1 /* GCDWebDAVServer */,
- E2BE850618E77ECA0061360B /* GCDWebUploader */,
- CEE28D081AE0053E00F4023C /* Frameworks */,
- E221128D1690B6470048D2B2 /* Mac */,
- E2DDD1F71BE69EE5002CE867 /* iOS */,
- E2DDD1C81BE698A8002CE867 /* tvOS */,
- E282F1A7150FF0630004D7C0 /* Mac Frameworks and Libraries */,
- E221129E1690B7CB0048D2B2 /* iOS Frameworks and Libraries */,
- E2DDD1B81BE6952F002CE867 /* tvOS Frameworks and Libraries */,
- 1AB674ADFE9D54B511CA2CBB /* Products */,
- );
- name = LittleCMS;
- sourceTree = "<group>";
- };
- 1AB674ADFE9D54B511CA2CBB /* Products */ = {
- isa = PBXGroup;
- children = (
- 8DD76FB20486AB0100D96B5E /* GCDWebServer */,
- CEE28CD11AE004D800F4023C /* GCDWebServers.framework */,
- CEE28CEF1AE0051F00F4023C /* GCDWebServers.framework */,
- E24039251BA09207000B7089 /* Tests.xctest */,
- E2DDD18B1BE69404002CE867 /* GCDWebServers.framework */,
- E2DDD1C71BE698A8002CE867 /* GCDWebServer.app */,
- E2DDD1F61BE69EE4002CE867 /* GCDWebServer.app */,
- );
- name = Products;
- sourceTree = "<group>";
- };
- CEE28D081AE0053E00F4023C /* Frameworks */ = {
- isa = PBXGroup;
- children = (
- CEE28CF31AE0051F00F4023C /* GCDWebServers.h */,
- CEE28CF21AE0051F00F4023C /* Info.plist */,
- E24039311BA092B7000B7089 /* Tests.m */,
- );
- path = Frameworks;
- sourceTree = "<group>";
- };
- E221128D1690B6470048D2B2 /* Mac */ = {
- isa = PBXGroup;
- children = (
- E221128E1690B6470048D2B2 /* main.m */,
- );
- path = Mac;
- sourceTree = "<group>";
- };
- E221129E1690B7CB0048D2B2 /* iOS Frameworks and Libraries */ = {
- isa = PBXGroup;
- children = (
- CEE28D691AE1ABAA00F4023C /* UIKit.framework */,
- E221129C1690B7BA0048D2B2 /* MobileCoreServices.framework */,
- E22112981690B7AA0048D2B2 /* CFNetwork.framework */,
- E2DDD2241BE6A0AE002CE867 /* libxml2.tbd */,
- E2DDD2261BE6A0B4002CE867 /* libz.tbd */,
- );
- name = "iOS Frameworks and Libraries";
- sourceTree = "<group>";
- };
- E282F1A7150FF0630004D7C0 /* Mac Frameworks and Libraries */ = {
- isa = PBXGroup;
- children = (
- CEE28D4B1AE0095600F4023C /* Foundation.framework */,
- E2BE851018E79DAF0061360B /* SystemConfiguration.framework */,
- E208D1B2167BB17E00500836 /* CoreServices.framework */,
- E208D148167B76B700500836 /* CFNetwork.framework */,
- E2DDD22A1BE6A0EB002CE867 /* libxml2.tbd */,
- E2DDD22C1BE6A0EF002CE867 /* libz.tbd */,
- );
- name = "Mac Frameworks and Libraries";
- sourceTree = "<group>";
- };
- E28BAE1418F99C810095C089 /* GCDWebServer */ = {
- isa = PBXGroup;
- children = (
- E28BAE1518F99C810095C089 /* Core */,
- E28BAE2218F99C810095C089 /* Requests */,
- E28BAE2B18F99C810095C089 /* Responses */,
- );
- path = GCDWebServer;
- sourceTree = "<group>";
- };
- E28BAE1518F99C810095C089 /* Core */ = {
- isa = PBXGroup;
- children = (
- E28BAE1618F99C810095C089 /* GCDWebServer.h */,
- E28BAE1718F99C810095C089 /* GCDWebServer.m */,
- E28BAE1818F99C810095C089 /* GCDWebServerConnection.h */,
- E28BAE1918F99C810095C089 /* GCDWebServerConnection.m */,
- E28BAE1A18F99C810095C089 /* GCDWebServerFunctions.h */,
- E28BAE1B18F99C810095C089 /* GCDWebServerFunctions.m */,
- E28BAE1C18F99C810095C089 /* GCDWebServerHTTPStatusCodes.h */,
- E28BAE1D18F99C810095C089 /* GCDWebServerPrivate.h */,
- E28BAE1E18F99C810095C089 /* GCDWebServerRequest.h */,
- E28BAE1F18F99C810095C089 /* GCDWebServerRequest.m */,
- E28BAE2018F99C810095C089 /* GCDWebServerResponse.h */,
- E28BAE2118F99C810095C089 /* GCDWebServerResponse.m */,
- );
- path = Core;
- sourceTree = "<group>";
- };
- E28BAE2218F99C810095C089 /* Requests */ = {
- isa = PBXGroup;
- children = (
- E28BAE2318F99C810095C089 /* GCDWebServerDataRequest.h */,
- E28BAE2418F99C810095C089 /* GCDWebServerDataRequest.m */,
- E28BAE2518F99C810095C089 /* GCDWebServerFileRequest.h */,
- E28BAE2618F99C810095C089 /* GCDWebServerFileRequest.m */,
- E28BAE2718F99C810095C089 /* GCDWebServerMultiPartFormRequest.h */,
- E28BAE2818F99C810095C089 /* GCDWebServerMultiPartFormRequest.m */,
- E28BAE2918F99C810095C089 /* GCDWebServerURLEncodedFormRequest.h */,
- E28BAE2A18F99C810095C089 /* GCDWebServerURLEncodedFormRequest.m */,
- );
- path = Requests;
- sourceTree = "<group>";
- };
- E28BAE2B18F99C810095C089 /* Responses */ = {
- isa = PBXGroup;
- children = (
- E28BAE2C18F99C810095C089 /* GCDWebServerDataResponse.h */,
- E28BAE2D18F99C810095C089 /* GCDWebServerDataResponse.m */,
- E28BAE2E18F99C810095C089 /* GCDWebServerErrorResponse.h */,
- E28BAE2F18F99C810095C089 /* GCDWebServerErrorResponse.m */,
- E28BAE3018F99C810095C089 /* GCDWebServerFileResponse.h */,
- E28BAE3118F99C810095C089 /* GCDWebServerFileResponse.m */,
- E28BAE3218F99C810095C089 /* GCDWebServerStreamedResponse.h */,
- E28BAE3318F99C810095C089 /* GCDWebServerStreamedResponse.m */,
- );
- path = Responses;
- sourceTree = "<group>";
- };
- E2A0E80718F3432600C580B1 /* GCDWebDAVServer */ = {
- isa = PBXGroup;
- children = (
- E2A0E80818F3432600C580B1 /* GCDWebDAVServer.h */,
- E2A0E80918F3432600C580B1 /* GCDWebDAVServer.m */,
- );
- path = GCDWebDAVServer;
- sourceTree = "<group>";
- };
- E2BE850618E77ECA0061360B /* GCDWebUploader */ = {
- isa = PBXGroup;
- children = (
- E2BE850718E77ECA0061360B /* GCDWebUploader.bundle */,
- E2BE850818E77ECA0061360B /* GCDWebUploader.h */,
- E2BE850918E77ECA0061360B /* GCDWebUploader.m */,
- );
- path = GCDWebUploader;
- sourceTree = "<group>";
- };
- E2DDD1B81BE6952F002CE867 /* tvOS Frameworks and Libraries */ = {
- isa = PBXGroup;
- children = (
- E2DDD1BF1BE69576002CE867 /* UIKit.framework */,
- E2DDD1BD1BE6956F002CE867 /* MobileCoreServices.framework */,
- E2DDD1B61BE6951A002CE867 /* CFNetwork.framework */,
- E2DDD1BB1BE69551002CE867 /* libxml2.tbd */,
- E2DDD1B91BE69545002CE867 /* libz.tbd */,
- );
- name = "tvOS Frameworks and Libraries";
- sourceTree = "<group>";
- };
- E2DDD1C81BE698A8002CE867 /* tvOS */ = {
- isa = PBXGroup;
- children = (
- E2DDD1CC1BE698A8002CE867 /* AppDelegate.h */,
- E2DDD1CD1BE698A8002CE867 /* AppDelegate.m */,
- E2DDD1CF1BE698A8002CE867 /* ViewController.h */,
- E2DDD1D01BE698A8002CE867 /* ViewController.m */,
- E2DDD1D21BE698A8002CE867 /* Main.storyboard */,
- E2DDD1D51BE698A8002CE867 /* Assets.xcassets */,
- E2DDD1D71BE698A8002CE867 /* Info.plist */,
- E2DDD1CA1BE698A8002CE867 /* main.m */,
- );
- path = tvOS;
- sourceTree = "<group>";
- };
- E2DDD1F71BE69EE5002CE867 /* iOS */ = {
- isa = PBXGroup;
- children = (
- E2DDD1FB1BE69EE5002CE867 /* AppDelegate.h */,
- E2DDD1FC1BE69EE5002CE867 /* AppDelegate.m */,
- E2DDD1FE1BE69EE5002CE867 /* ViewController.h */,
- E2DDD1FF1BE69EE5002CE867 /* ViewController.m */,
- E2DDD2011BE69EE5002CE867 /* Main.storyboard */,
- E2DDD2041BE69EE5002CE867 /* Assets.xcassets */,
- E2DDD2061BE69EE5002CE867 /* LaunchScreen.storyboard */,
- E2DDD2091BE69EE5002CE867 /* Info.plist */,
- E2DDD1F91BE69EE5002CE867 /* main.m */,
- );
- path = iOS;
- sourceTree = "<group>";
- };
-/* End PBXGroup section */
-
-/* Begin PBXHeadersBuildPhase section */
- CEE28CCE1AE004D800F4023C /* Headers */ = {
- isa = PBXHeadersBuildPhase;
- buildActionMask = 2147483647;
- files = (
- CEE28D521AE00A7A00F4023C /* GCDWebServers.h in Headers */,
- CEE28D151AE006ED00F4023C /* GCDWebServerHTTPStatusCodes.h in Headers */,
- CEE28D191AE006FD00F4023C /* GCDWebServerRequest.h in Headers */,
- CEE28D091AE006C200F4023C /* GCDWebServer.h in Headers */,
- CEE28D351AE0074D00F4023C /* GCDWebServerErrorResponse.h in Headers */,
- CEE28D2D1AE0073300F4023C /* GCDWebServerURLEncodedFormRequest.h in Headers */,
- CEE28D1D1AE0070600F4023C /* GCDWebServerResponse.h in Headers */,
- CEE28D391AE0075C00F4023C /* GCDWebServerFileResponse.h in Headers */,
- CEE28D291AE0072800F4023C /* GCDWebServerMultiPartFormRequest.h in Headers */,
- CEE28D3D1AE0076700F4023C /* GCDWebServerStreamedResponse.h in Headers */,
- CEE28D0D1AE006D700F4023C /* GCDWebServerConnection.h in Headers */,
- CEE28D211AE0071200F4023C /* GCDWebServerDataRequest.h in Headers */,
- CEE28D311AE0074200F4023C /* GCDWebServerDataResponse.h in Headers */,
- CEE28D111AE006E200F4023C /* GCDWebServerFunctions.h in Headers */,
- CEE28D251AE0071E00F4023C /* GCDWebServerFileRequest.h in Headers */,
- CEE28D411AE0077800F4023C /* GCDWebDAVServer.h in Headers */,
- CEE28D471AE0078A00F4023C /* GCDWebUploader.h in Headers */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- CEE28CEC1AE0051F00F4023C /* Headers */ = {
- isa = PBXHeadersBuildPhase;
- buildActionMask = 2147483647;
- files = (
- CEE28CF41AE0051F00F4023C /* GCDWebServers.h in Headers */,
- CEE28D261AE0071E00F4023C /* GCDWebServerFileRequest.h in Headers */,
- CEE28D321AE0074200F4023C /* GCDWebServerDataResponse.h in Headers */,
- CEE28D121AE006E300F4023C /* GCDWebServerFunctions.h in Headers */,
- CEE28D221AE0071300F4023C /* GCDWebServerDataRequest.h in Headers */,
- CEE28D1A1AE006FD00F4023C /* GCDWebServerRequest.h in Headers */,
- CEE28D0E1AE006D800F4023C /* GCDWebServerConnection.h in Headers */,
- CEE28D161AE006EE00F4023C /* GCDWebServerHTTPStatusCodes.h in Headers */,
- CEE28D3A1AE0075D00F4023C /* GCDWebServerFileResponse.h in Headers */,
- CEE28D2A1AE0072800F4023C /* GCDWebServerMultiPartFormRequest.h in Headers */,
- CEE28D3E1AE0076800F4023C /* GCDWebServerStreamedResponse.h in Headers */,
- CEE28D1E1AE0070700F4023C /* GCDWebServerResponse.h in Headers */,
- CEE28D2E1AE0073400F4023C /* GCDWebServerURLEncodedFormRequest.h in Headers */,
- CEE28D0A1AE006C300F4023C /* GCDWebServer.h in Headers */,
- CEE28D361AE0074E00F4023C /* GCDWebServerErrorResponse.h in Headers */,
- CEE28D421AE0077800F4023C /* GCDWebDAVServer.h in Headers */,
- CEE28D481AE0078B00F4023C /* GCDWebUploader.h in Headers */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- E2DDD1881BE69404002CE867 /* Headers */ = {
- isa = PBXHeadersBuildPhase;
- buildActionMask = 2147483647;
- files = (
- E2DDD1A51BE6947F002CE867 /* GCDWebServer.h in Headers */,
- E2DDD1A61BE6947F002CE867 /* GCDWebServerConnection.h in Headers */,
- E2DDD1A71BE6947F002CE867 /* GCDWebServerFunctions.h in Headers */,
- E2DDD1A81BE6947F002CE867 /* GCDWebServerHTTPStatusCodes.h in Headers */,
- E2DDD1A91BE6947F002CE867 /* GCDWebServerRequest.h in Headers */,
- E2DDD1AA1BE6947F002CE867 /* GCDWebServerResponse.h in Headers */,
- E2DDD1AB1BE6947F002CE867 /* GCDWebServerDataRequest.h in Headers */,
- E2DDD1AC1BE6947F002CE867 /* GCDWebServerFileRequest.h in Headers */,
- E2DDD1AD1BE6947F002CE867 /* GCDWebServerMultiPartFormRequest.h in Headers */,
- E2DDD1AE1BE6947F002CE867 /* GCDWebServerURLEncodedFormRequest.h in Headers */,
- E2DDD1AF1BE6947F002CE867 /* GCDWebServerDataResponse.h in Headers */,
- E2DDD1B01BE6947F002CE867 /* GCDWebServerErrorResponse.h in Headers */,
- E2DDD1B11BE6947F002CE867 /* GCDWebServerFileResponse.h in Headers */,
- E2DDD1B21BE6947F002CE867 /* GCDWebServerStreamedResponse.h in Headers */,
- E2DDD1B31BE6947F002CE867 /* GCDWebDAVServer.h in Headers */,
- E2DDD1B41BE6947F002CE867 /* GCDWebUploader.h in Headers */,
- E2DDD1B51BE6947F002CE867 /* GCDWebServers.h in Headers */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXHeadersBuildPhase section */
-
-/* Begin PBXNativeTarget section */
- 8DD76FA90486AB0100D96B5E /* GCDWebServer (Mac) */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 1DEB928508733DD80010E9CD /* Build configuration list for PBXNativeTarget "GCDWebServer (Mac)" */;
- buildPhases = (
- E21F038418FB37D80043AD1E /* Delete GCDWebUploader.bundle */,
- E2BE850E18E788910061360B /* CopyFiles */,
- 8DD76FAB0486AB0100D96B5E /* Sources */,
- 8DD76FAD0486AB0100D96B5E /* Frameworks */,
- );
- buildRules = (
- );
- dependencies = (
- );
- name = "GCDWebServer (Mac)";
- productInstallPath = "$(HOME)/bin";
- productName = LittleCMS;
- productReference = 8DD76FB20486AB0100D96B5E /* GCDWebServer */;
- productType = "com.apple.product-type.tool";
- };
- CEE28CD01AE004D800F4023C /* GCDWebServers (Mac) */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = CEE28CE81AE004D800F4023C /* Build configuration list for PBXNativeTarget "GCDWebServers (Mac)" */;
- buildPhases = (
- CEE28CCC1AE004D800F4023C /* Sources */,
- CEE28CCD1AE004D800F4023C /* Frameworks */,
- CEE28CCE1AE004D800F4023C /* Headers */,
- CEE28CCF1AE004D800F4023C /* Resources */,
- );
- buildRules = (
- );
- dependencies = (
- );
- name = "GCDWebServers (Mac)";
- productName = GCDWebServers;
- productReference = CEE28CD11AE004D800F4023C /* GCDWebServers.framework */;
- productType = "com.apple.product-type.framework";
- };
- CEE28CEE1AE0051F00F4023C /* GCDWebServers (iOS) */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = CEE28D021AE0052000F4023C /* Build configuration list for PBXNativeTarget "GCDWebServers (iOS)" */;
- buildPhases = (
- CEE28CEA1AE0051F00F4023C /* Sources */,
- CEE28CEB1AE0051F00F4023C /* Frameworks */,
- CEE28CEC1AE0051F00F4023C /* Headers */,
- CEE28CED1AE0051F00F4023C /* Resources */,
- );
- buildRules = (
- );
- dependencies = (
- );
- name = "GCDWebServers (iOS)";
- productName = GCDWebServers;
- productReference = CEE28CEF1AE0051F00F4023C /* GCDWebServers.framework */;
- productType = "com.apple.product-type.framework";
- };
- E24039241BA09207000B7089 /* Tests (Mac) */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = E240392E1BA09207000B7089 /* Build configuration list for PBXNativeTarget "Tests (Mac)" */;
- buildPhases = (
- E24039211BA09207000B7089 /* Sources */,
- E24039221BA09207000B7089 /* Frameworks */,
- );
- buildRules = (
- );
- dependencies = (
- E240392D1BA09207000B7089 /* PBXTargetDependency */,
- );
- name = "Tests (Mac)";
- productName = "GCDWebServers Tests (Mac)";
- productReference = E24039251BA09207000B7089 /* Tests.xctest */;
- productType = "com.apple.product-type.bundle.unit-test";
- };
- E2DDD18A1BE69404002CE867 /* GCDWebServers (tvOS) */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = E2DDD1921BE69404002CE867 /* Build configuration list for PBXNativeTarget "GCDWebServers (tvOS)" */;
- buildPhases = (
- E2DDD1861BE69404002CE867 /* Sources */,
- E2DDD1871BE69404002CE867 /* Frameworks */,
- E2DDD1881BE69404002CE867 /* Headers */,
- E2DDD1891BE69404002CE867 /* Resources */,
- );
- buildRules = (
- );
- dependencies = (
- );
- name = "GCDWebServers (tvOS)";
- productName = "GCDWebServer (tvOS)";
- productReference = E2DDD18B1BE69404002CE867 /* GCDWebServers.framework */;
- productType = "com.apple.product-type.framework";
- };
- E2DDD1C61BE698A8002CE867 /* GCDWebServer (tvOS) */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = E2DDD1D81BE698A8002CE867 /* Build configuration list for PBXNativeTarget "GCDWebServer (tvOS)" */;
- buildPhases = (
- E2DDD1C51BE698A8002CE867 /* Resources */,
- E2DDD1C31BE698A8002CE867 /* Sources */,
- E2DDD1C41BE698A8002CE867 /* Frameworks */,
- );
- buildRules = (
- );
- dependencies = (
- );
- name = "GCDWebServer (tvOS)";
- productName = tvOS;
- productReference = E2DDD1C71BE698A8002CE867 /* GCDWebServer.app */;
- productType = "com.apple.product-type.application";
- };
- E2DDD1F51BE69EE4002CE867 /* GCDWebServer (iOS) */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = E2DDD20A1BE69EE5002CE867 /* Build configuration list for PBXNativeTarget "GCDWebServer (iOS)" */;
- buildPhases = (
- E2DDD1F41BE69EE4002CE867 /* Resources */,
- E2DDD1F21BE69EE4002CE867 /* Sources */,
- E2DDD1F31BE69EE4002CE867 /* Frameworks */,
- );
- buildRules = (
- );
- dependencies = (
- );
- name = "GCDWebServer (iOS)";
- productName = "GCDWebServer (iOS)";
- productReference = E2DDD1F61BE69EE4002CE867 /* GCDWebServer.app */;
- productType = "com.apple.product-type.application";
- };
-/* End PBXNativeTarget section */
-
-/* Begin PBXProject section */
- 08FB7793FE84155DC02AAC07 /* Project object */ = {
- isa = PBXProject;
- attributes = {
- LastUpgradeCheck = 0720;
- TargetAttributes = {
- CEE28CD01AE004D800F4023C = {
- CreatedOnToolsVersion = 6.3;
- };
- CEE28CEE1AE0051F00F4023C = {
- CreatedOnToolsVersion = 6.3;
- DevelopmentTeam = 88W3E55T4B;
- };
- E24039241BA09207000B7089 = {
- CreatedOnToolsVersion = 6.4;
- };
- E2DDD18A1BE69404002CE867 = {
- CreatedOnToolsVersion = 7.1;
- };
- E2DDD1C61BE698A8002CE867 = {
- CreatedOnToolsVersion = 7.1;
- DevelopmentTeam = 88W3E55T4B;
- };
- E2DDD1F51BE69EE4002CE867 = {
- CreatedOnToolsVersion = 7.1;
- };
- };
- };
- buildConfigurationList = 1DEB928908733DD80010E9CD /* Build configuration list for PBXProject "GCDWebServer" */;
- compatibilityVersion = "Xcode 3.2";
- developmentRegion = English;
- hasScannedForEncodings = 1;
- knownRegions = (
- English,
- Japanese,
- French,
- German,
- en,
- Base,
- );
- mainGroup = 08FB7794FE84155DC02AAC07 /* LittleCMS */;
- projectDirPath = "";
- projectRoot = "";
- targets = (
- E274F876187E77D8009E0582 /* Build All */,
- 8DD76FA90486AB0100D96B5E /* GCDWebServer (Mac) */,
- E2DDD1F51BE69EE4002CE867 /* GCDWebServer (iOS) */,
- E2DDD1C61BE698A8002CE867 /* GCDWebServer (tvOS) */,
- CEE28CD01AE004D800F4023C /* GCDWebServers (Mac) */,
- CEE28CEE1AE0051F00F4023C /* GCDWebServers (iOS) */,
- E2DDD18A1BE69404002CE867 /* GCDWebServers (tvOS) */,
- E24039241BA09207000B7089 /* Tests (Mac) */,
- );
- };
-/* End PBXProject section */
-
-/* Begin PBXResourcesBuildPhase section */
- CEE28CCF1AE004D800F4023C /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- CEE28D451AE0078600F4023C /* GCDWebUploader.bundle in Resources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- CEE28CED1AE0051F00F4023C /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- CEE28D461AE0078600F4023C /* GCDWebUploader.bundle in Resources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- E2DDD1891BE69404002CE867 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- E2DDD1951BE69427002CE867 /* GCDWebUploader.bundle in Resources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- E2DDD1C51BE698A8002CE867 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- E2DDD1F11BE69BE9002CE867 /* GCDWebUploader.bundle in Resources */,
- E2DDD1D61BE698A8002CE867 /* Assets.xcassets in Resources */,
- E2DDD1D41BE698A8002CE867 /* Main.storyboard in Resources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- E2DDD1F41BE69EE4002CE867 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- E2DDD20F1BE69F03002CE867 /* GCDWebUploader.bundle in Resources */,
- E2DDD2081BE69EE5002CE867 /* LaunchScreen.storyboard in Resources */,
- E2DDD2051BE69EE5002CE867 /* Assets.xcassets in Resources */,
- E2DDD2031BE69EE5002CE867 /* Main.storyboard in Resources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXResourcesBuildPhase section */
-
-/* Begin PBXShellScriptBuildPhase section */
- E21F038418FB37D80043AD1E /* Delete GCDWebUploader.bundle */ = {
- isa = PBXShellScriptBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- inputPaths = (
- );
- name = "Delete GCDWebUploader.bundle";
- outputPaths = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- shellPath = /bin/sh;
- shellScript = "if [ \"$CONFIGURATION\" == \"Debug\" ]; then\n cd \"$BUILT_PRODUCTS_DIR\"\n rm -rf \"GCDWebUploader.bundle\"\nfi\n";
- };
-/* End PBXShellScriptBuildPhase section */
-
-/* Begin PBXSourcesBuildPhase section */
- 8DD76FAB0486AB0100D96B5E /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- E28BAE4618F99C810095C089 /* GCDWebServerDataResponse.m in Sources */,
- E28BAE3818F99C810095C089 /* GCDWebServerFunctions.m in Sources */,
- E28BAE4A18F99C810095C089 /* GCDWebServerFileResponse.m in Sources */,
- E28BAE4418F99C810095C089 /* GCDWebServerURLEncodedFormRequest.m in Sources */,
- E28BAE3A18F99C810095C089 /* GCDWebServerRequest.m in Sources */,
- E28BAE3418F99C810095C089 /* GCDWebServer.m in Sources */,
- E28BAE3618F99C810095C089 /* GCDWebServerConnection.m in Sources */,
- E28BAE3C18F99C810095C089 /* GCDWebServerResponse.m in Sources */,
- E28BAE4018F99C810095C089 /* GCDWebServerFileRequest.m in Sources */,
- E28BAE4C18F99C810095C089 /* GCDWebServerStreamedResponse.m in Sources */,
- E28BAE3E18F99C810095C089 /* GCDWebServerDataRequest.m in Sources */,
- E2A0E80A18F3432600C580B1 /* GCDWebDAVServer.m in Sources */,
- E28BAE4218F99C810095C089 /* GCDWebServerMultiPartFormRequest.m in Sources */,
- E2BE850C18E785940061360B /* GCDWebUploader.m in Sources */,
- E221128F1690B6470048D2B2 /* main.m in Sources */,
- E28BAE4818F99C810095C089 /* GCDWebServerErrorResponse.m in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- CEE28CCC1AE004D800F4023C /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- CEE28D1B1AE0070300F4023C /* GCDWebServerRequest.m in Sources */,
- CEE28D2F1AE0073C00F4023C /* GCDWebServerURLEncodedFormRequest.m in Sources */,
- CEE28D0F1AE006DE00F4023C /* GCDWebServerConnection.m in Sources */,
- CEE28D231AE0071A00F4023C /* GCDWebServerDataRequest.m in Sources */,
- CEE28D2B1AE0073000F4023C /* GCDWebServerMultiPartFormRequest.m in Sources */,
- CEE28D271AE0072400F4023C /* GCDWebServerFileRequest.m in Sources */,
- CEE28D1F1AE0070D00F4023C /* GCDWebServerResponse.m in Sources */,
- CEE28D3B1AE0076400F4023C /* GCDWebServerFileResponse.m in Sources */,
- CEE28D3F1AE0076E00F4023C /* GCDWebServerStreamedResponse.m in Sources */,
- CEE28D331AE0074900F4023C /* GCDWebServerDataResponse.m in Sources */,
- CEE28D431AE0077F00F4023C /* GCDWebDAVServer.m in Sources */,
- CEE28D0B1AE006CC00F4023C /* GCDWebServer.m in Sources */,
- CEE28D131AE006E900F4023C /* GCDWebServerFunctions.m in Sources */,
- CEE28D371AE0075900F4023C /* GCDWebServerErrorResponse.m in Sources */,
- CEE28D491AE0079100F4023C /* GCDWebUploader.m in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- CEE28CEA1AE0051F00F4023C /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- CEE28D1C1AE0070400F4023C /* GCDWebServerRequest.m in Sources */,
- CEE28D301AE0073C00F4023C /* GCDWebServerURLEncodedFormRequest.m in Sources */,
- CEE28D101AE006DF00F4023C /* GCDWebServerConnection.m in Sources */,
- CEE28D241AE0071B00F4023C /* GCDWebServerDataRequest.m in Sources */,
- CEE28D2C1AE0073000F4023C /* GCDWebServerMultiPartFormRequest.m in Sources */,
- CEE28D281AE0072400F4023C /* GCDWebServerFileRequest.m in Sources */,
- CEE28D201AE0070E00F4023C /* GCDWebServerResponse.m in Sources */,
- CEE28D3C1AE0076400F4023C /* GCDWebServerFileResponse.m in Sources */,
- CEE28D401AE0076F00F4023C /* GCDWebServerStreamedResponse.m in Sources */,
- CEE28D341AE0074A00F4023C /* GCDWebServerDataResponse.m in Sources */,
- CEE28D441AE0078000F4023C /* GCDWebDAVServer.m in Sources */,
- CEE28D0C1AE006CD00F4023C /* GCDWebServer.m in Sources */,
- CEE28D141AE006EA00F4023C /* GCDWebServerFunctions.m in Sources */,
- CEE28D381AE0075900F4023C /* GCDWebServerErrorResponse.m in Sources */,
- CEE28D4A1AE0079200F4023C /* GCDWebUploader.m in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- E24039211BA09207000B7089 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- E24039321BA092B7000B7089 /* Tests.m in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- E2DDD1861BE69404002CE867 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- E2DDD1961BE6945F002CE867 /* GCDWebServer.m in Sources */,
- E2DDD1971BE6945F002CE867 /* GCDWebServerConnection.m in Sources */,
- E2DDD1981BE6945F002CE867 /* GCDWebServerFunctions.m in Sources */,
- E2DDD1991BE6945F002CE867 /* GCDWebServerRequest.m in Sources */,
- E2DDD19A1BE6945F002CE867 /* GCDWebServerResponse.m in Sources */,
- E2DDD19B1BE6945F002CE867 /* GCDWebServerDataRequest.m in Sources */,
- E2DDD19C1BE6945F002CE867 /* GCDWebServerFileRequest.m in Sources */,
- E2DDD19D1BE6945F002CE867 /* GCDWebServerMultiPartFormRequest.m in Sources */,
- E2DDD19E1BE6945F002CE867 /* GCDWebServerURLEncodedFormRequest.m in Sources */,
- E2DDD19F1BE6945F002CE867 /* GCDWebServerDataResponse.m in Sources */,
- E2DDD1A01BE6945F002CE867 /* GCDWebServerErrorResponse.m in Sources */,
- E2DDD1A11BE6945F002CE867 /* GCDWebServerFileResponse.m in Sources */,
- E2DDD1A21BE6945F002CE867 /* GCDWebServerStreamedResponse.m in Sources */,
- E2DDD1A31BE6945F002CE867 /* GCDWebDAVServer.m in Sources */,
- E2DDD1A41BE6945F002CE867 /* GCDWebUploader.m in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- E2DDD1C31BE698A8002CE867 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- E2DDD1DE1BE69BB7002CE867 /* GCDWebServer.m in Sources */,
- E2DDD1DF1BE69BB7002CE867 /* GCDWebServerConnection.m in Sources */,
- E2DDD1E01BE69BB7002CE867 /* GCDWebServerFunctions.m in Sources */,
- E2DDD1E11BE69BB7002CE867 /* GCDWebServerRequest.m in Sources */,
- E2DDD1E21BE69BB7002CE867 /* GCDWebServerResponse.m in Sources */,
- E2DDD1E31BE69BB7002CE867 /* GCDWebServerDataRequest.m in Sources */,
- E2DDD1E41BE69BB7002CE867 /* GCDWebServerFileRequest.m in Sources */,
- E2DDD1E51BE69BB7002CE867 /* GCDWebServerMultiPartFormRequest.m in Sources */,
- E2DDD1E61BE69BB7002CE867 /* GCDWebServerURLEncodedFormRequest.m in Sources */,
- E2DDD1E71BE69BB7002CE867 /* GCDWebServerDataResponse.m in Sources */,
- E2DDD1E81BE69BB7002CE867 /* GCDWebServerErrorResponse.m in Sources */,
- E2DDD1E91BE69BB7002CE867 /* GCDWebServerFileResponse.m in Sources */,
- E2DDD1EA1BE69BB7002CE867 /* GCDWebServerStreamedResponse.m in Sources */,
- E2DDD1EB1BE69BB7002CE867 /* GCDWebDAVServer.m in Sources */,
- E2DDD1EC1BE69BB7002CE867 /* GCDWebUploader.m in Sources */,
- E2DDD1D11BE698A8002CE867 /* ViewController.m in Sources */,
- E2DDD1CE1BE698A8002CE867 /* AppDelegate.m in Sources */,
- E2DDD1CB1BE698A8002CE867 /* main.m in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- E2DDD1F21BE69EE4002CE867 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- E2DDD2101BE69F17002CE867 /* GCDWebServer.m in Sources */,
- E2DDD2111BE69F17002CE867 /* GCDWebServerConnection.m in Sources */,
- E2DDD2121BE69F17002CE867 /* GCDWebServerFunctions.m in Sources */,
- E2DDD2131BE69F17002CE867 /* GCDWebServerRequest.m in Sources */,
- E2DDD2141BE69F17002CE867 /* GCDWebServerResponse.m in Sources */,
- E2DDD2151BE69F17002CE867 /* GCDWebServerDataRequest.m in Sources */,
- E2DDD2161BE69F17002CE867 /* GCDWebServerFileRequest.m in Sources */,
- E2DDD2171BE69F17002CE867 /* GCDWebServerMultiPartFormRequest.m in Sources */,
- E2DDD2181BE69F17002CE867 /* GCDWebServerURLEncodedFormRequest.m in Sources */,
- E2DDD2191BE69F17002CE867 /* GCDWebServerDataResponse.m in Sources */,
- E2DDD21A1BE69F17002CE867 /* GCDWebServerErrorResponse.m in Sources */,
- E2DDD21B1BE69F17002CE867 /* GCDWebServerFileResponse.m in Sources */,
- E2DDD21C1BE69F17002CE867 /* GCDWebServerStreamedResponse.m in Sources */,
- E2DDD21D1BE69F25002CE867 /* GCDWebDAVServer.m in Sources */,
- E2DDD21E1BE69F25002CE867 /* GCDWebUploader.m in Sources */,
- E2DDD2001BE69EE5002CE867 /* ViewController.m in Sources */,
- E2DDD1FD1BE69EE5002CE867 /* AppDelegate.m in Sources */,
- E2DDD1FA1BE69EE5002CE867 /* main.m in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXSourcesBuildPhase section */
-
-/* Begin PBXTargetDependency section */
- CE54F3941AE84FCA003C110E /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = CEE28CD01AE004D800F4023C /* GCDWebServers (Mac) */;
- targetProxy = CE54F3931AE84FCA003C110E /* PBXContainerItemProxy */;
- };
- CE54F3961AE84FCA003C110E /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = CEE28CEE1AE0051F00F4023C /* GCDWebServers (iOS) */;
- targetProxy = CE54F3951AE84FCA003C110E /* PBXContainerItemProxy */;
- };
- E240392D1BA09207000B7089 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = CEE28CD01AE004D800F4023C /* GCDWebServers (Mac) */;
- targetProxy = E240392C1BA09207000B7089 /* PBXContainerItemProxy */;
- };
- E274F87B187E77E3009E0582 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 8DD76FA90486AB0100D96B5E /* GCDWebServer (Mac) */;
- targetProxy = E274F87A187E77E3009E0582 /* PBXContainerItemProxy */;
- };
- E2DDD1941BE6941C002CE867 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = E2DDD18A1BE69404002CE867 /* GCDWebServers (tvOS) */;
- targetProxy = E2DDD1931BE6941C002CE867 /* PBXContainerItemProxy */;
- };
- E2DDD1DC1BE69911002CE867 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = E2DDD1C61BE698A8002CE867 /* GCDWebServer (tvOS) */;
- targetProxy = E2DDD1DB1BE69911002CE867 /* PBXContainerItemProxy */;
- };
- E2DDD20E1BE69EEE002CE867 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = E2DDD1F51BE69EE4002CE867 /* GCDWebServer (iOS) */;
- targetProxy = E2DDD20D1BE69EEE002CE867 /* PBXContainerItemProxy */;
- };
-/* End PBXTargetDependency section */
-
-/* Begin PBXVariantGroup section */
- E2DDD1D21BE698A8002CE867 /* Main.storyboard */ = {
- isa = PBXVariantGroup;
- children = (
- E2DDD1D31BE698A8002CE867 /* Base */,
- );
- name = Main.storyboard;
- sourceTree = "<group>";
- };
- E2DDD2011BE69EE5002CE867 /* Main.storyboard */ = {
- isa = PBXVariantGroup;
- children = (
- E2DDD2021BE69EE5002CE867 /* Base */,
- );
- name = Main.storyboard;
- sourceTree = "<group>";
- };
- E2DDD2061BE69EE5002CE867 /* LaunchScreen.storyboard */ = {
- isa = PBXVariantGroup;
- children = (
- E2DDD2071BE69EE5002CE867 /* Base */,
- );
- name = LaunchScreen.storyboard;
- sourceTree = "<group>";
- };
-/* End PBXVariantGroup section */
-
-/* Begin XCBuildConfiguration section */
- 1DEB928608733DD80010E9CD /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- MACOSX_DEPLOYMENT_TARGET = 10.7;
- PRODUCT_NAME = GCDWebServer;
- SDKROOT = macosx;
- };
- name = Debug;
- };
- 1DEB928708733DD80010E9CD /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- MACOSX_DEPLOYMENT_TARGET = 10.7;
- PRODUCT_NAME = GCDWebServer;
- SDKROOT = macosx;
- };
- name = Release;
- };
- 1DEB928A08733DD80010E9CD /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- BUNDLE_VERSION_STRING = 3.3.3;
- CLANG_ENABLE_OBJC_ARC = YES;
- ENABLE_STRICT_OBJC_MSGSEND = YES;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PREPROCESSOR_DEFINITIONS = "DEBUG=1";
- GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = __GCDWEBSERVER_ENABLE_TESTING__;
- HEADER_SEARCH_PATHS = "$(SDKROOT)/usr/include/libxml2";
- ONLY_ACTIVE_ARCH = YES;
- PRODUCT_BUNDLE_IDENTIFIER = "net.pol-online.GCDWebServers";
- WARNING_CFLAGS = (
- "-Wall",
- "-Weverything",
- "-Wshadow",
- "-Wshorten-64-to-32",
- "-Wno-vla",
- "-Wno-explicit-ownership-type",
- "-Wno-gnu-statement-expression",
- "-Wno-direct-ivar-access",
- "-Wno-implicit-retain-self",
- "-Wno-assign-enum",
- "-Wno-format-nonliteral",
- "-Wno-cast-align",
- "-Wno-padded",
- "-Wno-documentation",
- "-Wno-documentation-unknown-command",
- "-Wno-objc-missing-property-synthesis",
- "-Wno-cstring-format-directive",
- "-Wno-reserved-id-macro",
- "-Wno-cast-qual",
- "-Wno-nullable-to-nonnull-conversion",
- );
- };
- name = Debug;
- };
- 1DEB928B08733DD80010E9CD /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- BUNDLE_VERSION_STRING = 3.3.3;
- CLANG_ENABLE_OBJC_ARC = YES;
- ENABLE_STRICT_OBJC_MSGSEND = YES;
- GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = __GCDWEBSERVER_ENABLE_TESTING__;
- GCC_TREAT_WARNINGS_AS_ERRORS = YES;
- HEADER_SEARCH_PATHS = "$(SDKROOT)/usr/include/libxml2";
- PRODUCT_BUNDLE_IDENTIFIER = "net.pol-online.GCDWebServers";
- WARNING_CFLAGS = "-Wall";
- };
- name = Release;
- };
- CEE28CE41AE004D800F4023C /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- DEFINES_MODULE = YES;
- DYLIB_COMPATIBILITY_VERSION = 1;
- DYLIB_CURRENT_VERSION = 1;
- DYLIB_INSTALL_NAME_BASE = "@rpath";
- INFOPLIST_FILE = Frameworks/Info.plist;
- LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks";
- MACOSX_DEPLOYMENT_TARGET = 10.7;
- PRODUCT_NAME = GCDWebServers;
- SDKROOT = macosx;
- };
- name = Debug;
- };
- CEE28CE51AE004D800F4023C /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- DEFINES_MODULE = YES;
- DYLIB_COMPATIBILITY_VERSION = 1;
- DYLIB_CURRENT_VERSION = 1;
- DYLIB_INSTALL_NAME_BASE = "@rpath";
- INFOPLIST_FILE = Frameworks/Info.plist;
- LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks";
- MACOSX_DEPLOYMENT_TARGET = 10.7;
- PRODUCT_NAME = GCDWebServers;
- SDKROOT = macosx;
- };
- name = Release;
- };
- CEE28D031AE0052000F4023C /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- CODE_SIGN_IDENTITY = "iPhone Developer";
- DEFINES_MODULE = YES;
- DYLIB_COMPATIBILITY_VERSION = 1;
- DYLIB_CURRENT_VERSION = 1;
- DYLIB_INSTALL_NAME_BASE = "@rpath";
- INFOPLIST_FILE = Frameworks/Info.plist;
- IPHONEOS_DEPLOYMENT_TARGET = 8.0;
- LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
- PRODUCT_NAME = GCDWebServers;
- PROVISIONING_PROFILE = "";
- SDKROOT = iphoneos;
- };
- name = Debug;
- };
- CEE28D041AE0052000F4023C /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- CODE_SIGN_IDENTITY = "iPhone Developer";
- DEFINES_MODULE = YES;
- DYLIB_COMPATIBILITY_VERSION = 1;
- DYLIB_CURRENT_VERSION = 1;
- DYLIB_INSTALL_NAME_BASE = "@rpath";
- INFOPLIST_FILE = Frameworks/Info.plist;
- IPHONEOS_DEPLOYMENT_TARGET = 8.0;
- LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
- PRODUCT_NAME = GCDWebServers;
- PROVISIONING_PROFILE = "";
- SDKROOT = iphoneos;
- };
- name = Release;
- };
- E240392F1BA09207000B7089 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- FRAMEWORK_SEARCH_PATHS = (
- "$(DEVELOPER_FRAMEWORKS_DIR)",
- "$(inherited)",
- );
- LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
- MACOSX_DEPLOYMENT_TARGET = 10.7;
- PRODUCT_NAME = Tests;
- SDKROOT = macosx;
- WARNING_CFLAGS = (
- "$(inherited)",
- "-Wno-gnu-zero-variadic-macro-arguments",
- );
- };
- name = Debug;
- };
- E24039301BA09207000B7089 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- FRAMEWORK_SEARCH_PATHS = (
- "$(DEVELOPER_FRAMEWORKS_DIR)",
- "$(inherited)",
- );
- LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
- MACOSX_DEPLOYMENT_TARGET = 10.7;
- PRODUCT_NAME = Tests;
- SDKROOT = macosx;
- WARNING_CFLAGS = (
- "$(inherited)",
- "-Wno-gnu-zero-variadic-macro-arguments",
- );
- };
- name = Release;
- };
- E274F877187E77D8009E0582 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- PRODUCT_NAME = "$(TARGET_NAME)";
- };
- name = Debug;
- };
- E274F878187E77D8009E0582 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- PRODUCT_NAME = "$(TARGET_NAME)";
- };
- name = Release;
- };
- E2DDD1901BE69404002CE867 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- CODE_SIGN_IDENTITY = "iPhone Developer";
- DEFINES_MODULE = YES;
- DYLIB_COMPATIBILITY_VERSION = 1;
- DYLIB_CURRENT_VERSION = 1;
- DYLIB_INSTALL_NAME_BASE = "@rpath";
- INFOPLIST_FILE = Frameworks/Info.plist;
- LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
- PRODUCT_NAME = GCDWebServers;
- PROVISIONING_PROFILE = "";
- SDKROOT = appletvos;
- TVOS_DEPLOYMENT_TARGET = 9.0;
- };
- name = Debug;
- };
- E2DDD1911BE69404002CE867 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- CODE_SIGN_IDENTITY = "iPhone Developer";
- DEFINES_MODULE = YES;
- DYLIB_COMPATIBILITY_VERSION = 1;
- DYLIB_CURRENT_VERSION = 1;
- DYLIB_INSTALL_NAME_BASE = "@rpath";
- INFOPLIST_FILE = Frameworks/Info.plist;
- LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
- PRODUCT_NAME = GCDWebServers;
- PROVISIONING_PROFILE = "";
- SDKROOT = appletvos;
- TVOS_DEPLOYMENT_TARGET = 9.0;
- };
- name = Release;
- };
- E2DDD1D91BE698A8002CE867 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- CODE_SIGN_IDENTITY = "iPhone Developer";
- INFOPLIST_FILE = tvOS/Info.plist;
- PRODUCT_NAME = GCDWebServer;
- PROVISIONING_PROFILE = "";
- SDKROOT = appletvos;
- TVOS_DEPLOYMENT_TARGET = 9.0;
- };
- name = Debug;
- };
- E2DDD1DA1BE698A8002CE867 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- CODE_SIGN_IDENTITY = "iPhone Developer";
- INFOPLIST_FILE = tvOS/Info.plist;
- PRODUCT_NAME = GCDWebServer;
- PROVISIONING_PROFILE = "";
- SDKROOT = appletvos;
- TVOS_DEPLOYMENT_TARGET = 9.0;
- };
- name = Release;
- };
- E2DDD20B1BE69EE5002CE867 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- CODE_SIGN_IDENTITY = "iPhone Developer";
- ENABLE_BITCODE = YES;
- INFOPLIST_FILE = iOS/Info.plist;
- IPHONEOS_DEPLOYMENT_TARGET = 6.0;
- PRODUCT_NAME = GCDWebServer;
- PROVISIONING_PROFILE = "";
- SDKROOT = iphoneos;
- TARGETED_DEVICE_FAMILY = "1,2";
- };
- name = Debug;
- };
- E2DDD20C1BE69EE5002CE867 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- CODE_SIGN_IDENTITY = "iPhone Developer";
- ENABLE_BITCODE = YES;
- INFOPLIST_FILE = iOS/Info.plist;
- IPHONEOS_DEPLOYMENT_TARGET = 6.0;
- PRODUCT_NAME = GCDWebServer;
- PROVISIONING_PROFILE = "";
- SDKROOT = iphoneos;
- TARGETED_DEVICE_FAMILY = "1,2";
- };
- name = Release;
- };
-/* End XCBuildConfiguration section */
-
-/* Begin XCConfigurationList section */
- 1DEB928508733DD80010E9CD /* Build configuration list for PBXNativeTarget "GCDWebServer (Mac)" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 1DEB928608733DD80010E9CD /* Debug */,
- 1DEB928708733DD80010E9CD /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
- 1DEB928908733DD80010E9CD /* Build configuration list for PBXProject "GCDWebServer" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 1DEB928A08733DD80010E9CD /* Debug */,
- 1DEB928B08733DD80010E9CD /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
- CEE28CE81AE004D800F4023C /* Build configuration list for PBXNativeTarget "GCDWebServers (Mac)" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- CEE28CE41AE004D800F4023C /* Debug */,
- CEE28CE51AE004D800F4023C /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
- CEE28D021AE0052000F4023C /* Build configuration list for PBXNativeTarget "GCDWebServers (iOS)" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- CEE28D031AE0052000F4023C /* Debug */,
- CEE28D041AE0052000F4023C /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
- E240392E1BA09207000B7089 /* Build configuration list for PBXNativeTarget "Tests (Mac)" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- E240392F1BA09207000B7089 /* Debug */,
- E24039301BA09207000B7089 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
- E274F879187E77D8009E0582 /* Build configuration list for PBXAggregateTarget "Build All" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- E274F877187E77D8009E0582 /* Debug */,
- E274F878187E77D8009E0582 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
- E2DDD1921BE69404002CE867 /* Build configuration list for PBXNativeTarget "GCDWebServers (tvOS)" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- E2DDD1901BE69404002CE867 /* Debug */,
- E2DDD1911BE69404002CE867 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
- E2DDD1D81BE698A8002CE867 /* Build configuration list for PBXNativeTarget "GCDWebServer (tvOS)" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- E2DDD1D91BE698A8002CE867 /* Debug */,
- E2DDD1DA1BE698A8002CE867 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
- E2DDD20A1BE69EE5002CE867 /* Build configuration list for PBXNativeTarget "GCDWebServer (iOS)" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- E2DDD20B1BE69EE5002CE867 /* Debug */,
- E2DDD20C1BE69EE5002CE867 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
-/* End XCConfigurationList section */
- };
- rootObject = 08FB7793FE84155DC02AAC07 /* Project object */;
-}
diff --git "a/local-webserver/src/ios/GCDWebServer/GCDWebServer.xcodeproj/xcshareddata/xcschemes/GCDWebServers \050Mac\051.xcscheme" "b/local-webserver/src/ios/GCDWebServer/GCDWebServer.xcodeproj/xcshareddata/xcschemes/GCDWebServers \050Mac\051.xcscheme"
deleted file mode 100644
index b905059..0000000
--- "a/local-webserver/src/ios/GCDWebServer/GCDWebServer.xcodeproj/xcshareddata/xcschemes/GCDWebServers \050Mac\051.xcscheme"
+++ /dev/null
@@ -1,90 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<Scheme
- LastUpgradeVersion = "0720"
- version = "1.3">
- <BuildAction
- parallelizeBuildables = "YES"
- buildImplicitDependencies = "YES">
- <BuildActionEntries>
- <BuildActionEntry
- buildForTesting = "NO"
- buildForRunning = "YES"
- buildForProfiling = "YES"
- buildForArchiving = "YES"
- buildForAnalyzing = "YES">
- <BuildableReference
- BuildableIdentifier = "primary"
- BlueprintIdentifier = "CEE28CD01AE004D800F4023C"
- BuildableName = "GCDWebServers.framework"
- BlueprintName = "GCDWebServers (Mac)"
- ReferencedContainer = "container:GCDWebServer.xcodeproj">
- </BuildableReference>
- </BuildActionEntry>
- </BuildActionEntries>
- </BuildAction>
- <TestAction
- buildConfiguration = "Debug"
- selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
- selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
- shouldUseLaunchSchemeArgsEnv = "YES">
- <Testables>
- <TestableReference
- skipped = "NO">
- <BuildableReference
- BuildableIdentifier = "primary"
- BlueprintIdentifier = "E24039241BA09207000B7089"
- BuildableName = "Tests.xctest"
- BlueprintName = "Tests (Mac)"
- ReferencedContainer = "container:GCDWebServer.xcodeproj">
- </BuildableReference>
- </TestableReference>
- </Testables>
- <AdditionalOptions>
- </AdditionalOptions>
- </TestAction>
- <LaunchAction
- buildConfiguration = "Debug"
- selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
- selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
- launchStyle = "0"
- useCustomWorkingDirectory = "NO"
- ignoresPersistentStateOnLaunch = "NO"
- debugDocumentVersioning = "YES"
- debugServiceExtension = "internal"
- allowLocationSimulation = "YES">
- <MacroExpansion>
- <BuildableReference
- BuildableIdentifier = "primary"
- BlueprintIdentifier = "CEE28CD01AE004D800F4023C"
- BuildableName = "GCDWebServers.framework"
- BlueprintName = "GCDWebServers (Mac)"
- ReferencedContainer = "container:GCDWebServer.xcodeproj">
- </BuildableReference>
- </MacroExpansion>
- <AdditionalOptions>
- </AdditionalOptions>
- </LaunchAction>
- <ProfileAction
- buildConfiguration = "Release"
- shouldUseLaunchSchemeArgsEnv = "YES"
- savedToolIdentifier = ""
- useCustomWorkingDirectory = "NO"
- debugDocumentVersioning = "YES">
- <MacroExpansion>
- <BuildableReference
- BuildableIdentifier = "primary"
- BlueprintIdentifier = "CEE28CD01AE004D800F4023C"
- BuildableName = "GCDWebServers.framework"
- BlueprintName = "GCDWebServers (Mac)"
- ReferencedContainer = "container:GCDWebServer.xcodeproj">
- </BuildableReference>
- </MacroExpansion>
- </ProfileAction>
- <AnalyzeAction
- buildConfiguration = "Debug">
- </AnalyzeAction>
- <ArchiveAction
- buildConfiguration = "Release"
- revealArchiveInOrganizer = "YES">
- </ArchiveAction>
-</Scheme>
diff --git "a/local-webserver/src/ios/GCDWebServer/GCDWebServer.xcodeproj/xcshareddata/xcschemes/GCDWebServers \050iOS\051.xcscheme" "b/local-webserver/src/ios/GCDWebServer/GCDWebServer.xcodeproj/xcshareddata/xcschemes/GCDWebServers \050iOS\051.xcscheme"
deleted file mode 100644
index 73e3e0a..0000000
--- "a/local-webserver/src/ios/GCDWebServer/GCDWebServer.xcodeproj/xcshareddata/xcschemes/GCDWebServers \050iOS\051.xcscheme"
+++ /dev/null
@@ -1,89 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<Scheme
- LastUpgradeVersion = "0720"
- version = "1.3">
- <BuildAction
- parallelizeBuildables = "YES"
- buildImplicitDependencies = "YES">
- <BuildActionEntries>
- <BuildActionEntry
- buildForTesting = "NO"
- buildForRunning = "YES"
- buildForProfiling = "YES"
- buildForArchiving = "YES"
- buildForAnalyzing = "YES">
- <BuildableReference
- BuildableIdentifier = "primary"
- BlueprintIdentifier = "CEE28CEE1AE0051F00F4023C"
- BuildableName = "GCDWebServers.framework"
- BlueprintName = "GCDWebServers (iOS)"
- ReferencedContainer = "container:GCDWebServer.xcodeproj">
- </BuildableReference>
- </BuildActionEntry>
- </BuildActionEntries>
- </BuildAction>
- <TestAction
- buildConfiguration = "Debug"
- selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
- selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
- shouldUseLaunchSchemeArgsEnv = "YES">
- <Testables>
- </Testables>
- <MacroExpansion>
- <BuildableReference
- BuildableIdentifier = "primary"
- BlueprintIdentifier = "CEE28CEE1AE0051F00F4023C"
- BuildableName = "GCDWebServers.framework"
- BlueprintName = "GCDWebServers (iOS)"
- ReferencedContainer = "container:GCDWebServer.xcodeproj">
- </BuildableReference>
- </MacroExpansion>
- <AdditionalOptions>
- </AdditionalOptions>
- </TestAction>
- <LaunchAction
- buildConfiguration = "Debug"
- selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
- selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
- launchStyle = "0"
- useCustomWorkingDirectory = "NO"
- ignoresPersistentStateOnLaunch = "NO"
- debugDocumentVersioning = "YES"
- debugServiceExtension = "internal"
- allowLocationSimulation = "YES">
- <MacroExpansion>
- <BuildableReference
- BuildableIdentifier = "primary"
- BlueprintIdentifier = "CEE28CEE1AE0051F00F4023C"
- BuildableName = "GCDWebServers.framework"
- BlueprintName = "GCDWebServers (iOS)"
- ReferencedContainer = "container:GCDWebServer.xcodeproj">
- </BuildableReference>
- </MacroExpansion>
- <AdditionalOptions>
- </AdditionalOptions>
- </LaunchAction>
- <ProfileAction
- buildConfiguration = "Release"
- shouldUseLaunchSchemeArgsEnv = "YES"
- savedToolIdentifier = ""
- useCustomWorkingDirectory = "NO"
- debugDocumentVersioning = "YES">
- <MacroExpansion>
- <BuildableReference
- BuildableIdentifier = "primary"
- BlueprintIdentifier = "CEE28CEE1AE0051F00F4023C"
- BuildableName = "GCDWebServers.framework"
- BlueprintName = "GCDWebServers (iOS)"
- ReferencedContainer = "container:GCDWebServer.xcodeproj">
- </BuildableReference>
- </MacroExpansion>
- </ProfileAction>
- <AnalyzeAction
- buildConfiguration = "Debug">
- </AnalyzeAction>
- <ArchiveAction
- buildConfiguration = "Release"
- revealArchiveInOrganizer = "YES">
- </ArchiveAction>
-</Scheme>
diff --git "a/local-webserver/src/ios/GCDWebServer/GCDWebServer.xcodeproj/xcshareddata/xcschemes/GCDWebServers \050tvOS\051.xcscheme" "b/local-webserver/src/ios/GCDWebServer/GCDWebServer.xcodeproj/xcshareddata/xcschemes/GCDWebServers \050tvOS\051.xcscheme"
deleted file mode 100644
index 920fa99..0000000
--- "a/local-webserver/src/ios/GCDWebServer/GCDWebServer.xcodeproj/xcshareddata/xcschemes/GCDWebServers \050tvOS\051.xcscheme"
+++ /dev/null
@@ -1,89 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<Scheme
- LastUpgradeVersion = "0720"
- version = "1.3">
- <BuildAction
- parallelizeBuildables = "YES"
- buildImplicitDependencies = "YES">
- <BuildActionEntries>
- <BuildActionEntry
- buildForTesting = "NO"
- buildForRunning = "YES"
- buildForProfiling = "YES"
- buildForArchiving = "YES"
- buildForAnalyzing = "YES">
- <BuildableReference
- BuildableIdentifier = "primary"
- BlueprintIdentifier = "E2DDD18A1BE69404002CE867"
- BuildableName = "GCDWebServers.framework"
- BlueprintName = "GCDWebServers (tvOS)"
- ReferencedContainer = "container:GCDWebServer.xcodeproj">
- </BuildableReference>
- </BuildActionEntry>
- </BuildActionEntries>
- </BuildAction>
- <TestAction
- buildConfiguration = "Debug"
- selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
- selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
- shouldUseLaunchSchemeArgsEnv = "YES">
- <Testables>
- </Testables>
- <MacroExpansion>
- <BuildableReference
- BuildableIdentifier = "primary"
- BlueprintIdentifier = "E2DDD18A1BE69404002CE867"
- BuildableName = "GCDWebServers.framework"
- BlueprintName = "GCDWebServers (tvOS)"
- ReferencedContainer = "container:GCDWebServer.xcodeproj">
- </BuildableReference>
- </MacroExpansion>
- <AdditionalOptions>
- </AdditionalOptions>
- </TestAction>
- <LaunchAction
- buildConfiguration = "Debug"
- selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
- selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
- launchStyle = "0"
- useCustomWorkingDirectory = "NO"
- ignoresPersistentStateOnLaunch = "NO"
- debugDocumentVersioning = "YES"
- debugServiceExtension = "internal"
- allowLocationSimulation = "YES">
- <MacroExpansion>
- <BuildableReference
- BuildableIdentifier = "primary"
- BlueprintIdentifier = "E2DDD18A1BE69404002CE867"
- BuildableName = "GCDWebServers.framework"
- BlueprintName = "GCDWebServers (tvOS)"
- ReferencedContainer = "container:GCDWebServer.xcodeproj">
- </BuildableReference>
- </MacroExpansion>
- <AdditionalOptions>
- </AdditionalOptions>
- </LaunchAction>
- <ProfileAction
- buildConfiguration = "Release"
- shouldUseLaunchSchemeArgsEnv = "YES"
- savedToolIdentifier = ""
- useCustomWorkingDirectory = "NO"
- debugDocumentVersioning = "YES">
- <MacroExpansion>
- <BuildableReference
- BuildableIdentifier = "primary"
- BlueprintIdentifier = "E2DDD18A1BE69404002CE867"
- BuildableName = "GCDWebServers.framework"
- BlueprintName = "GCDWebServers (tvOS)"
- ReferencedContainer = "container:GCDWebServer.xcodeproj">
- </BuildableReference>
- </MacroExpansion>
- </ProfileAction>
- <AnalyzeAction
- buildConfiguration = "Debug">
- </AnalyzeAction>
- <ArchiveAction
- buildConfiguration = "Release"
- revealArchiveInOrganizer = "YES">
- </ArchiveAction>
-</Scheme>
diff --git a/local-webserver/src/ios/GCDWebServer/GCDWebServer/Core/GCDWebServer.h b/local-webserver/src/ios/GCDWebServer/GCDWebServer/Core/GCDWebServer.h
deleted file mode 100644
index b4afb4c..0000000
--- a/local-webserver/src/ios/GCDWebServer/GCDWebServer/Core/GCDWebServer.h
+++ /dev/null
@@ -1,618 +0,0 @@
-/*
- 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 <TargetConditionals.h>
-
-#import "GCDWebServerRequest.h"
-#import "GCDWebServerResponse.h"
-
-/**
- * The GCDWebServerMatchBlock is called for every handler added to the
- * GCDWebServer whenever a new HTTP request has started (i.e. HTTP headers have
- * been received). The block is passed the basic info for the request (HTTP method,
- * URL, headers...) and must decide if it wants to handle it or not.
- *
- * If the handler can handle the request, the block must return a new
- * GCDWebServerRequest instance created with the same basic info.
- * Otherwise, it simply returns nil.
- */
-typedef GCDWebServerRequest* (^GCDWebServerMatchBlock)(NSString* requestMethod, NSURL* requestURL, NSDictionary* requestHeaders, NSString* urlPath, NSDictionary* urlQuery);
-
-/**
- * The GCDWebServerProcessBlock is called after the HTTP request has been fully
- * received (i.e. the entire HTTP body has been read). The block is passed the
- * GCDWebServerRequest created at the previous step by the GCDWebServerMatchBlock.
- *
- * The block must return a GCDWebServerResponse or nil on error, which will
- * result in a 500 HTTP status code returned to the client. It's however
- * recommended to return a GCDWebServerErrorResponse on error so more useful
- * information can be returned to the client.
- */
-typedef GCDWebServerResponse* (^GCDWebServerProcessBlock)(__kindof GCDWebServerRequest* request);
-
-/**
- * The GCDWebServerAsynchronousProcessBlock works like the GCDWebServerProcessBlock
- * except the GCDWebServerResponse can be returned to the server at a later time
- * allowing for asynchronous generation of the response.
- *
- * The block must eventually call "completionBlock" passing a GCDWebServerResponse
- * or nil on error, which will result in a 500 HTTP status code returned to the client.
- * It's however recommended to return a GCDWebServerErrorResponse on error so more
- * useful information can be returned to the client.
- */
-typedef void (^GCDWebServerCompletionBlock)(GCDWebServerResponse* response);
-typedef void (^GCDWebServerAsyncProcessBlock)(__kindof GCDWebServerRequest* request, GCDWebServerCompletionBlock completionBlock);
-
-/**
- * The port used by the GCDWebServer (NSNumber / NSUInteger).
- *
- * The default value is 0 i.e. let the OS pick a random port.
- */
-extern NSString* const GCDWebServerOption_Port;
-
-/**
- * The Bonjour name used by the GCDWebServer (NSString). If set to an empty string,
- * the name will automatically take the value of the GCDWebServerOption_ServerName
- * option. If this option is set to nil, Bonjour will be disabled.
- *
- * The default value is nil.
- */
-extern NSString* const GCDWebServerOption_BonjourName;
-
-/**
- * The Bonjour service type used by the GCDWebServer (NSString).
- *
- * The default value is "_http._tcp", the service type for HTTP web servers.
- */
-extern NSString* const GCDWebServerOption_BonjourType;
-
-/**
- * Request a port mapping in the NAT gateway (NSNumber / BOOL).
- *
- * This uses the DNSService API under the hood which supports IPv4 mappings only.
- *
- * The default value is NO.
- *
- * @warning The external port set up by the NAT gateway may be different than
- * the one used by the GCDWebServer.
- */
-extern NSString* const GCDWebServerOption_RequestNATPortMapping;
-
-/**
- * Only accept HTTP requests coming from localhost i.e. not from the outside
- * network (NSNumber / BOOL).
- *
- * The default value is NO.
- *
- * @warning Bonjour and NAT port mapping should be disabled if using this option
- * since the server will not be reachable from the outside network anyway.
- */
-extern NSString* const GCDWebServerOption_BindToLocalhost;
-
-/**
- * The maximum number of incoming HTTP requests that can be queued waiting to
- * be handled before new ones are dropped (NSNumber / NSUInteger).
- *
- * The default value is 16.
- */
-extern NSString* const GCDWebServerOption_MaxPendingConnections;
-
-/**
- * The value for "Server" HTTP header used by the GCDWebServer (NSString).
- *
- * The default value is the GCDWebServer class name.
- */
-extern NSString* const GCDWebServerOption_ServerName;
-
-/**
- * The authentication method used by the GCDWebServer
- * (one of "GCDWebServerAuthenticationMethod_...").
- *
- * The default value is nil i.e. authentication is disabled.
- */
-extern NSString* const GCDWebServerOption_AuthenticationMethod;
-
-/**
- * The authentication realm used by the GCDWebServer (NSString).
- *
- * The default value is the same as the GCDWebServerOption_ServerName option.
- */
-extern NSString* const GCDWebServerOption_AuthenticationRealm;
-
-/**
- * The authentication accounts used by the GCDWebServer
- * (NSDictionary of username / password pairs).
- *
- * The default value is nil i.e. no accounts.
- */
-extern NSString* const GCDWebServerOption_AuthenticationAccounts;
-
-/**
- * The class used by the GCDWebServer when instantiating GCDWebServerConnection
- * (subclass of GCDWebServerConnection).
- *
- * The default value is the GCDWebServerConnection class.
- */
-extern NSString* const GCDWebServerOption_ConnectionClass;
-
-/**
- * Allow the GCDWebServer to pretend "HEAD" requests are actually "GET" ones
- * and automatically discard the HTTP body of the response (NSNumber / BOOL).
- *
- * The default value is YES.
- */
-extern NSString* const GCDWebServerOption_AutomaticallyMapHEADToGET;
-
-/**
- * The interval expressed in seconds used by the GCDWebServer to decide how to
- * coalesce calls to -webServerDidConnect: and -webServerDidDisconnect:
- * (NSNumber / double). Coalescing will be disabled if the interval is <= 0.0.
- *
- * The default value is 1.0 second.
- */
-extern NSString* const GCDWebServerOption_ConnectedStateCoalescingInterval;
-
-#if TARGET_OS_IPHONE
-
-/**
- * Enables the GCDWebServer to automatically suspend itself (as if -stop was
- * called) when the iOS app goes into the background and the last
- * GCDWebServerConnection is closed, then resume itself (as if -start was called)
- * when the iOS app comes back to the foreground (NSNumber / BOOL).
- *
- * See the README.md file for more information about this option.
- *
- * The default value is YES.
- *
- * @warning The running property will be NO while the GCDWebServer is suspended.
- */
-extern NSString* const GCDWebServerOption_AutomaticallySuspendInBackground;
-
-#endif
-
-/**
- * HTTP Basic Authentication scheme (see https://tools.ietf.org/html/rfc2617).
- *
- * @warning Use of this authentication scheme is not recommended as the
- * passwords are sent in clear.
- */
-extern NSString* const GCDWebServerAuthenticationMethod_Basic;
-
-/**
- * HTTP Digest Access Authentication scheme (see https://tools.ietf.org/html/rfc2617).
- */
-extern NSString* const GCDWebServerAuthenticationMethod_DigestAccess;
-
-@class GCDWebServer;
-
-/**
- * Delegate methods for GCDWebServer.
- *
- * @warning These methods are always called on the main thread in a serialized way.
- */
-@protocol GCDWebServerDelegate <NSObject>
-@optional
-
-/**
- * This method is called after the server has successfully started.
- */
-- (void)webServerDidStart:(GCDWebServer*)server;
-
-/**
- * This method is called after the Bonjour registration for the server has
- * successfully completed.
- *
- * Use the "bonjourServerURL" property to retrieve the Bonjour address of the
- * server.
- */
-- (void)webServerDidCompleteBonjourRegistration:(GCDWebServer*)server;
-
-/**
- * This method is called after the NAT port mapping for the server has been
- * updated.
- *
- * Use the "publicServerURL" property to retrieve the public address of the
- * server.
- */
-- (void)webServerDidUpdateNATPortMapping:(GCDWebServer*)server;
-
-/**
- * This method is called when the first GCDWebServerConnection is opened by the
- * server to serve a series of HTTP requests.
- *
- * A series of HTTP requests is considered ongoing as long as new HTTP requests
- * keep coming (and new GCDWebServerConnection instances keep being opened),
- * until before the last HTTP request has been responded to (and the
- * corresponding last GCDWebServerConnection closed).
- */
-- (void)webServerDidConnect:(GCDWebServer*)server;
-
-/**
- * This method is called when the last GCDWebServerConnection is closed after
- * the server has served a series of HTTP requests.
- *
- * The GCDWebServerOption_ConnectedStateCoalescingInterval option can be used
- * to have the server wait some extra delay before considering that the series
- * of HTTP requests has ended (in case there some latency between consecutive
- * requests). This effectively coalesces the calls to -webServerDidConnect:
- * and -webServerDidDisconnect:.
- */
-- (void)webServerDidDisconnect:(GCDWebServer*)server;
-
-/**
- * This method is called after the server has stopped.
- */
-- (void)webServerDidStop:(GCDWebServer*)server;
-
-@end
-
-/**
- * The GCDWebServer class listens for incoming HTTP requests on a given port,
- * then passes each one to a "handler" capable of generating an HTTP response
- * for it, which is then sent back to the client.
- *
- * GCDWebServer instances can be created and used from any thread but it's
- * recommended to have the main thread's runloop be running so internal callbacks
- * can be handled e.g. for Bonjour registration.
- *
- * See the README.md file for more information about the architecture of GCDWebServer.
- */
-@interface GCDWebServer : NSObject
-
-/**
- * Sets the delegate for the server.
- */
-@property(nonatomic, assign) id<GCDWebServerDelegate> delegate;
-
-/**
- * Returns YES if the server is currently running.
- */
-@property(nonatomic, readonly, getter=isRunning) BOOL running;
-
-/**
- * Returns the port used by the server.
- *
- * @warning This property is only valid if the server is running.
- */
-@property(nonatomic, readonly) NSUInteger port;
-
-/**
- * Returns the Bonjour name used by the server.
- *
- * @warning This property is only valid if the server is running and Bonjour
- * registration has successfully completed, which can take up to a few seconds.
- */
-@property(nonatomic, readonly) NSString* bonjourName;
-
-/**
- * Returns the Bonjour service type used by the server.
- *
- * @warning This property is only valid if the server is running and Bonjour
- * registration has successfully completed, which can take up to a few seconds.
- */
-@property(nonatomic, readonly) NSString* bonjourType;
-
-/**
- * This method is the designated initializer for the class.
- */
-- (instancetype)init;
-
-/**
- * Adds to the server a handler that generates responses synchronously when handling incoming HTTP requests.
- *
- * Handlers are called in a LIFO queue, so if multiple handlers can potentially
- * respond to a given request, the latest added one wins.
- *
- * @warning Addling handlers while the server is running is not allowed.
- */
-- (void)addHandlerWithMatchBlock:(GCDWebServerMatchBlock)matchBlock processBlock:(GCDWebServerProcessBlock)processBlock;
-
-/**
- * Adds to the server a handler that generates responses asynchronously when handling incoming HTTP requests.
- *
- * Handlers are called in a LIFO queue, so if multiple handlers can potentially
- * respond to a given request, the latest added one wins.
- *
- * @warning Addling handlers while the server is running is not allowed.
- */
-- (void)addHandlerWithMatchBlock:(GCDWebServerMatchBlock)matchBlock asyncProcessBlock:(GCDWebServerAsyncProcessBlock)processBlock;
-
-/**
- * Removes all handlers previously added to the server.
- *
- * @warning Removing handlers while the server is running is not allowed.
- */
-- (void)removeAllHandlers;
-
-/**
- * Starts the server with explicit options. This method is the designated way
- * to start the server.
- *
- * Returns NO if the server failed to start and sets "error" argument if not NULL.
- */
-- (BOOL)startWithOptions:(NSDictionary*)options error:(NSError**)error;
-
-/**
- * Stops the server and prevents it to accepts new HTTP requests.
- *
- * @warning Stopping the server does not abort GCDWebServerConnection instances
- * currently handling already received HTTP requests. These connections will
- * continue to execute normally until completion.
- */
-- (void)stop;
-
-@end
-
-@interface GCDWebServer (Extensions)
-
-/**
- * Returns the server's URL.
- *
- * @warning This property is only valid if the server is running.
- */
-@property(nonatomic, readonly) NSURL* serverURL;
-
-/**
- * Returns the server's Bonjour URL.
- *
- * @warning This property is only valid if the server is running and Bonjour
- * registration has successfully completed, which can take up to a few seconds.
- * Also be aware this property will not automatically update if the Bonjour hostname
- * has been dynamically changed after the server started running (this should be rare).
- */
-@property(nonatomic, readonly) NSURL* bonjourServerURL;
-
-/**
- * Returns the server's public URL.
- *
- * @warning This property is only valid if the server is running and NAT port
- * mapping is active.
- */
-@property(nonatomic, readonly) NSURL* publicServerURL;
-
-/**
- * Starts the server on port 8080 (OS X & iOS Simulator) or port 80 (iOS)
- * using the default Bonjour name.
- *
- * Returns NO if the server failed to start.
- */
-- (BOOL)start;
-
-/**
- * Starts the server on a given port and with a specific Bonjour name.
- * Pass a nil Bonjour name to disable Bonjour entirely or an empty string to
- * use the default name.
- *
- * Returns NO if the server failed to start.
- */
-- (BOOL)startWithPort:(NSUInteger)port bonjourName:(NSString*)name;
-
-#if !TARGET_OS_IPHONE
-
-/**
- * Runs the server synchronously using -startWithPort:bonjourName: until a
- * SIGINT signal is received i.e. Ctrl-C. This method is intended to be used
- * by command line tools.
- *
- * Returns NO if the server failed to start.
- *
- * @warning This method must be used from the main thread only.
- */
-- (BOOL)runWithPort:(NSUInteger)port bonjourName:(NSString*)name;
-
-/**
- * Runs the server synchronously using -startWithOptions: until a SIGTERM or
- * SIGINT signal is received i.e. Ctrl-C in Terminal. This method is intended to
- * be used by command line tools.
- *
- * Returns NO if the server failed to start and sets "error" argument if not NULL.
- *
- * @warning This method must be used from the main thread only.
- */
-- (BOOL)runWithOptions:(NSDictionary*)options error:(NSError**)error;
-
-#endif
-
-@end
-
-@interface GCDWebServer (Handlers)
-
-/**
- * Adds a default handler to the server to handle all incoming HTTP requests
- * with a given HTTP method and generate responses synchronously.
- */
-- (void)addDefaultHandlerForMethod:(NSString*)method requestClass:(Class)aClass processBlock:(GCDWebServerProcessBlock)block;
-
-/**
- * Adds a default handler to the server to handle all incoming HTTP requests
- * with a given HTTP method and generate responses asynchronously.
- */
-- (void)addDefaultHandlerForMethod:(NSString*)method requestClass:(Class)aClass asyncProcessBlock:(GCDWebServerAsyncProcessBlock)block;
-
-/**
- * Adds a handler to the server to handle incoming HTTP requests with a given
- * HTTP method and a specific case-insensitive path and generate responses
- * synchronously.
- */
-- (void)addHandlerForMethod:(NSString*)method path:(NSString*)path requestClass:(Class)aClass processBlock:(GCDWebServerProcessBlock)block;
-
-/**
- * Adds a handler to the server to handle incoming HTTP requests with a given
- * HTTP method and a specific case-insensitive path and generate responses
- * asynchronously.
- */
-- (void)addHandlerForMethod:(NSString*)method path:(NSString*)path requestClass:(Class)aClass asyncProcessBlock:(GCDWebServerAsyncProcessBlock)block;
-
-/**
- * Adds a handler to the server to handle incoming HTTP requests with a given
- * HTTP method and a path matching a case-insensitive regular expression and
- * generate responses synchronously.
- */
-- (void)addHandlerForMethod:(NSString*)method pathRegex:(NSString*)regex requestClass:(Class)aClass processBlock:(GCDWebServerProcessBlock)block;
-
-/**
- * Adds a handler to the server to handle incoming HTTP requests with a given
- * HTTP method and a path matching a case-insensitive regular expression and
- * generate responses asynchronously.
- */
-- (void)addHandlerForMethod:(NSString*)method pathRegex:(NSString*)regex requestClass:(Class)aClass asyncProcessBlock:(GCDWebServerAsyncProcessBlock)block;
-
-@end
-
-@interface GCDWebServer (GETHandlers)
-
-/**
- * Adds a handler to the server to respond to incoming "GET" HTTP requests
- * with a specific case-insensitive path with in-memory data.
- */
-- (void)addGETHandlerForPath:(NSString*)path staticData:(NSData*)staticData contentType:(NSString*)contentType cacheAge:(NSUInteger)cacheAge;
-
-/**
- * Adds a handler to the server to respond to incoming "GET" HTTP requests
- * with a specific case-insensitive path with a file.
- */
-- (void)addGETHandlerForPath:(NSString*)path filePath:(NSString*)filePath isAttachment:(BOOL)isAttachment cacheAge:(NSUInteger)cacheAge allowRangeRequests:(BOOL)allowRangeRequests;
-
-/**
- * Adds a handler to the server to respond to incoming "GET" HTTP requests
- * with a case-insensitive path inside a base path with the corresponding file
- * inside a local directory. If no local file matches the request path, a 401
- * HTTP status code is returned to the client.
- *
- * The "indexFilename" argument allows to specify an "index" file name to use
- * when the request path corresponds to a directory.
- */
-- (void)addGETHandlerForBasePath:(NSString*)basePath directoryPath:(NSString*)directoryPath indexFilename:(NSString*)indexFilename cacheAge:(NSUInteger)cacheAge allowRangeRequests:(BOOL)allowRangeRequests;
-
-@end
-
-/**
- * GCDWebServer provides its own built-in logging facility which is used by
- * default. It simply sends log messages to stderr assuming it is connected
- * to a terminal type device.
- *
- * GCDWebServer is also compatible with a limited set of third-party logging
- * facilities. If one of them is available at compile time, GCDWebServer will
- * automatically use it in place of the built-in one.
- *
- * Currently supported third-party logging facilities are:
- * - XLFacility (by the same author as GCDWebServer): https://github.com/swisspol/XLFacility
- * - CocoaLumberjack: https://github.com/CocoaLumberjack/CocoaLumberjack
- *
- * For both the built-in logging facility and CocoaLumberjack, the default
- * logging level is INFO (or DEBUG if the preprocessor constant "DEBUG"
- * evaluates to non-zero at compile time).
- *
- * It's possible to have GCDWebServer use a custom logging facility by defining
- * the "__GCDWEBSERVER_LOGGING_HEADER__" preprocessor constant in Xcode build
- * settings to the name of a custom header file (escaped like \"MyLogging.h\").
- * This header file must define the following set of macros:
- *
- * GWS_LOG_DEBUG(...)
- * GWS_LOG_VERBOSE(...)
- * GWS_LOG_INFO(...)
- * GWS_LOG_WARNING(...)
- * GWS_LOG_ERROR(...)
- * GWS_LOG_EXCEPTION(__EXCEPTION__)
- *
- * IMPORTANT: Except for GWS_LOG_EXCEPTION() which gets passed an NSException,
- * these macros must behave like NSLog(). Furthermore the GWS_LOG_DEBUG() macro
- * should not do anything unless the preprocessor constant "DEBUG" evaluates to
- * non-zero.
- *
- * The logging methods below send log messages to the same logging facility
- * used by GCDWebServer. They can be used for consistency wherever you interact
- * with GCDWebServer in your code (e.g. in the implementation of handlers).
- */
-@interface GCDWebServer (Logging)
-
-/**
- * Sets the log level of the logging facility below which log messages are discarded.
- *
- * @warning The interpretation of the "level" argument depends on the logging
- * facility used at compile time.
- *
- * If using the built-in logging facility, the log levels are as follow:
- * DEBUG = 0
- * VERBOSE = 1
- * INFO = 2
- * WARNING = 3
- * ERROR = 4
- * EXCEPTION = 5
- */
-+ (void)setLogLevel:(int)level;
-
-/**
- * Logs a message to the logging facility at the VERBOSE level.
- */
-- (void)logVerbose:(NSString*)format, ... NS_FORMAT_FUNCTION(1,2);
-
-/**
- * Logs a message to the logging facility at the INFO level.
- */
-- (void)logInfo:(NSString*)format, ... NS_FORMAT_FUNCTION(1,2);
-
-/**
- * Logs a message to the logging facility at the WARNING level.
- */
-- (void)logWarning:(NSString*)format, ... NS_FORMAT_FUNCTION(1,2);
-
-/**
- * Logs a message to the logging facility at the ERROR level.
- */
-- (void)logError:(NSString*)format, ... NS_FORMAT_FUNCTION(1,2);
-
-/**
- * Logs an exception to the logging facility at the EXCEPTION level.
- */
-- (void)logException:(NSException*)exception;
-
-@end
-
-#ifdef __GCDWEBSERVER_ENABLE_TESTING__
-
-@interface GCDWebServer (Testing)
-
-/**
- * Activates recording of HTTP requests and responses which create files in the
- * current directory containing the raw data for all requests and responses.
- *
- * @warning The current directory must not contain any prior recording files.
- */
-@property(nonatomic, getter=isRecordingEnabled) BOOL recordingEnabled;
-
-/**
- * Runs tests by playing back pre-recorded HTTP requests in the given directory
- * and comparing the generated responses with the pre-recorded ones.
- *
- * Returns the number of failed tests or -1 if server failed to start.
- */
-- (NSInteger)runTestsWithOptions:(NSDictionary*)options inDirectory:(NSString*)path;
-
-@end
-
-#endif
diff --git a/local-webserver/src/ios/GCDWebServer/GCDWebServer/Core/GCDWebServer.m b/local-webserver/src/ios/GCDWebServer/GCDWebServer/Core/GCDWebServer.m
deleted file mode 100644
index 815fab3..0000000
--- a/local-webserver/src/ios/GCDWebServer/GCDWebServer/Core/GCDWebServer.m
+++ /dev/null
@@ -1,1325 +0,0 @@
-/*
- 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.
- */
-
-#if !__has_feature(objc_arc)
-#error GCDWebServer requires ARC
-#endif
-
-#import <TargetConditionals.h>
-#if TARGET_OS_IPHONE
-#import <UIKit/UIKit.h>
-#else
-#ifdef __GCDWEBSERVER_ENABLE_TESTING__
-#import <AppKit/AppKit.h>
-#endif
-#endif
-#import <netinet/in.h>
-#import <dns_sd.h>
-
-#import "GCDWebServerPrivate.h"
-
-#if TARGET_OS_IPHONE && !TARGET_IPHONE_SIMULATOR
-#define kDefaultPort 80
-#else
-#define kDefaultPort 8080
-#endif
-
-#define kBonjourResolutionTimeout 5.0
-
-NSString* const GCDWebServerOption_Port = @"Port";
-NSString* const GCDWebServerOption_BonjourName = @"BonjourName";
-NSString* const GCDWebServerOption_BonjourType = @"BonjourType";
-NSString* const GCDWebServerOption_RequestNATPortMapping = @"RequestNATPortMapping";
-NSString* const GCDWebServerOption_BindToLocalhost = @"BindToLocalhost";
-NSString* const GCDWebServerOption_MaxPendingConnections = @"MaxPendingConnections";
-NSString* const GCDWebServerOption_ServerName = @"ServerName";
-NSString* const GCDWebServerOption_AuthenticationMethod = @"AuthenticationMethod";
-NSString* const GCDWebServerOption_AuthenticationRealm = @"AuthenticationRealm";
-NSString* const GCDWebServerOption_AuthenticationAccounts = @"AuthenticationAccounts";
-NSString* const GCDWebServerOption_ConnectionClass = @"ConnectionClass";
-NSString* const GCDWebServerOption_AutomaticallyMapHEADToGET = @"AutomaticallyMapHEADToGET";
-NSString* const GCDWebServerOption_ConnectedStateCoalescingInterval = @"ConnectedStateCoalescingInterval";
-#if TARGET_OS_IPHONE
-NSString* const GCDWebServerOption_AutomaticallySuspendInBackground = @"AutomaticallySuspendInBackground";
-#endif
-
-NSString* const GCDWebServerAuthenticationMethod_Basic = @"Basic";
-NSString* const GCDWebServerAuthenticationMethod_DigestAccess = @"DigestAccess";
-
-#if defined(__GCDWEBSERVER_LOGGING_FACILITY_BUILTIN__)
-#if DEBUG
-GCDWebServerLoggingLevel GCDWebServerLogLevel = kGCDWebServerLoggingLevel_Debug;
-#else
-GCDWebServerLoggingLevel GCDWebServerLogLevel = kGCDWebServerLoggingLevel_Info;
-#endif
-#elif defined(__GCDWEBSERVER_LOGGING_FACILITY_COCOALUMBERJACK__)
-#if DEBUG
-DDLogLevel GCDWebServerLogLevel = DDLogLevelDebug;
-#else
-DDLogLevel GCDWebServerLogLevel = DDLogLevelInfo;
-#endif
-#endif
-
-#if !TARGET_OS_IPHONE
-static BOOL _run;
-#endif
-
-#ifdef __GCDWEBSERVER_LOGGING_FACILITY_BUILTIN__
-
-void GCDWebServerLogMessage(GCDWebServerLoggingLevel level, NSString* format, ...) {
- static const char* levelNames[] = {"DEBUG", "VERBOSE", "INFO", "WARNING", "ERROR", "EXCEPTION"};
- static int enableLogging = -1;
- if (enableLogging < 0) {
- enableLogging = (isatty(STDERR_FILENO) ? 1 : 0);
- }
- if (enableLogging) {
- va_list arguments;
- va_start(arguments, format);
- NSString* message = [[NSString alloc] initWithFormat:format arguments:arguments];
- va_end(arguments);
- fprintf(stderr, "[%s] %s\n", levelNames[level], [message UTF8String]);
- }
-}
-
-#endif
-
-#if !TARGET_OS_IPHONE
-
-static void _SignalHandler(int signal) {
- _run = NO;
- printf("\n");
-}
-
-#endif
-
-#if !TARGET_OS_IPHONE || defined(__GCDWEBSERVER_ENABLE_TESTING__)
-
-// This utility function is used to ensure scheduled callbacks on the main thread are called when running the server synchronously
-// https://developer.apple.com/library/mac/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html
-// The main queue works with the application’s run loop to interleave the execution of queued tasks with the execution of other event sources attached to the run loop
-// TODO: Ensure all scheduled blocks on the main queue are also executed
-static void _ExecuteMainThreadRunLoopSources() {
- SInt32 result;
- do {
- result = CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.0, true);
- } while (result == kCFRunLoopRunHandledSource);
-}
-
-#endif
-
-@interface GCDWebServerHandler () {
-@private
- GCDWebServerMatchBlock _matchBlock;
- GCDWebServerAsyncProcessBlock _asyncProcessBlock;
-}
-@end
-
-@implementation GCDWebServerHandler
-
-@synthesize matchBlock=_matchBlock, asyncProcessBlock=_asyncProcessBlock;
-
-- (id)initWithMatchBlock:(GCDWebServerMatchBlock)matchBlock asyncProcessBlock:(GCDWebServerAsyncProcessBlock)processBlock {
- if ((self = [super init])) {
- _matchBlock = [matchBlock copy];
- _asyncProcessBlock = [processBlock copy];
- }
- return self;
-}
-
-@end
-
-@interface GCDWebServer () {
-@private
- id<GCDWebServerDelegate> __unsafe_unretained _delegate;
- dispatch_queue_t _syncQueue;
- dispatch_group_t _sourceGroup;
- NSMutableArray* _handlers;
- NSInteger _activeConnections; // Accessed through _syncQueue only
- BOOL _connected; // Accessed on main thread only
- CFRunLoopTimerRef _disconnectTimer; // Accessed on main thread only
-
- NSDictionary* _options;
- NSString* _serverName;
- NSString* _authenticationRealm;
- NSMutableDictionary* _authenticationBasicAccounts;
- NSMutableDictionary* _authenticationDigestAccounts;
- Class _connectionClass;
- BOOL _mapHEADToGET;
- CFTimeInterval _disconnectDelay;
- NSUInteger _port;
- dispatch_source_t _source4;
- dispatch_source_t _source6;
- CFNetServiceRef _registrationService;
- CFNetServiceRef _resolutionService;
- DNSServiceRef _dnsService;
- CFSocketRef _dnsSocket;
- CFRunLoopSourceRef _dnsSource;
- NSString* _dnsAddress;
- NSUInteger _dnsPort;
- BOOL _bindToLocalhost;
-#if TARGET_OS_IPHONE
- BOOL _suspendInBackground;
- UIBackgroundTaskIdentifier _backgroundTask;
-#endif
-#ifdef __GCDWEBSERVER_ENABLE_TESTING__
- BOOL _recording;
-#endif
-}
-@end
-
-@implementation GCDWebServer
-
-@synthesize delegate=_delegate, handlers=_handlers, port=_port, serverName=_serverName, authenticationRealm=_authenticationRealm,
- authenticationBasicAccounts=_authenticationBasicAccounts, authenticationDigestAccounts=_authenticationDigestAccounts,
- shouldAutomaticallyMapHEADToGET=_mapHEADToGET;
-
-+ (void)initialize {
- GCDWebServerInitializeFunctions();
-}
-
-- (instancetype)init {
- if ((self = [super init])) {
- _syncQueue = dispatch_queue_create([NSStringFromClass([self class]) UTF8String], DISPATCH_QUEUE_SERIAL);
- _sourceGroup = dispatch_group_create();
- _handlers = [[NSMutableArray alloc] init];
-#if TARGET_OS_IPHONE
- _backgroundTask = UIBackgroundTaskInvalid;
-#endif
- }
- return self;
-}
-
-- (void)dealloc {
- GWS_DCHECK(_connected == NO);
- GWS_DCHECK(_activeConnections == 0);
- GWS_DCHECK(_options == nil); // The server can never be dealloc'ed while running because of the retain-cycle with the dispatch source
- GWS_DCHECK(_disconnectTimer == NULL); // The server can never be dealloc'ed while the disconnect timer is pending because of the retain-cycle
-
-#if !OS_OBJECT_USE_OBJC_RETAIN_RELEASE
- dispatch_release(_sourceGroup);
- dispatch_release(_syncQueue);
-#endif
-}
-
-#if TARGET_OS_IPHONE
-
-// Always called on main thread
-- (void)_startBackgroundTask {
- GWS_DCHECK([NSThread isMainThread]);
- if (_backgroundTask == UIBackgroundTaskInvalid) {
- GWS_LOG_DEBUG(@"Did start background task");
- _backgroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
-
- GWS_LOG_WARNING(@"Application is being suspended while %@ is still connected", [self class]);
- [self _endBackgroundTask];
-
- }];
- } else {
- GWS_DNOT_REACHED();
- }
-}
-
-#endif
-
-// Always called on main thread
-- (void)_didConnect {
- GWS_DCHECK([NSThread isMainThread]);
- GWS_DCHECK(_connected == NO);
- _connected = YES;
- GWS_LOG_DEBUG(@"Did connect");
-
-#if TARGET_OS_IPHONE
- if ([[UIApplication sharedApplication] applicationState] != UIApplicationStateBackground) {
- [self _startBackgroundTask];
- }
-#endif
-
- if ([_delegate respondsToSelector:@selector(webServerDidConnect:)]) {
- [_delegate webServerDidConnect:self];
- }
-}
-
-- (void)willStartConnection:(GCDWebServerConnection*)connection {
- dispatch_sync(_syncQueue, ^{
-
- GWS_DCHECK(_activeConnections >= 0);
- if (_activeConnections == 0) {
- dispatch_async(dispatch_get_main_queue(), ^{
- if (_disconnectTimer) {
- CFRunLoopTimerInvalidate(_disconnectTimer);
- CFRelease(_disconnectTimer);
- _disconnectTimer = NULL;
- }
- if (_connected == NO) {
- [self _didConnect];
- }
- });
- }
- _activeConnections += 1;
-
- });
-}
-
-#if TARGET_OS_IPHONE
-
-// Always called on main thread
-- (void)_endBackgroundTask {
- GWS_DCHECK([NSThread isMainThread]);
- if (_backgroundTask != UIBackgroundTaskInvalid) {
- if (_suspendInBackground && ([[UIApplication sharedApplication] applicationState] == UIApplicationStateBackground) && _source4) {
- [self _stop];
- }
- [[UIApplication sharedApplication] endBackgroundTask:_backgroundTask];
- _backgroundTask = UIBackgroundTaskInvalid;
- GWS_LOG_DEBUG(@"Did end background task");
- }
-}
-
-#endif
-
-// Always called on main thread
-- (void)_didDisconnect {
- GWS_DCHECK([NSThread isMainThread]);
- GWS_DCHECK(_connected == YES);
- _connected = NO;
- GWS_LOG_DEBUG(@"Did disconnect");
-
-#if TARGET_OS_IPHONE
- [self _endBackgroundTask];
-#endif
-
- if ([_delegate respondsToSelector:@selector(webServerDidDisconnect:)]) {
- [_delegate webServerDidDisconnect:self];
- }
-}
-
-- (void)didEndConnection:(GCDWebServerConnection*)connection {
- dispatch_sync(_syncQueue, ^{
- GWS_DCHECK(_activeConnections > 0);
- _activeConnections -= 1;
- if (_activeConnections == 0) {
- dispatch_async(dispatch_get_main_queue(), ^{
- if ((_disconnectDelay > 0.0) && (_source4 != NULL)) {
- if (_disconnectTimer) {
- CFRunLoopTimerInvalidate(_disconnectTimer);
- CFRelease(_disconnectTimer);
- }
- _disconnectTimer = CFRunLoopTimerCreateWithHandler(kCFAllocatorDefault, CFAbsoluteTimeGetCurrent() + _disconnectDelay, 0.0, 0, 0, ^(CFRunLoopTimerRef timer) {
- GWS_DCHECK([NSThread isMainThread]);
- [self _didDisconnect];
- CFRelease(_disconnectTimer);
- _disconnectTimer = NULL;
- });
- CFRunLoopAddTimer(CFRunLoopGetMain(), _disconnectTimer, kCFRunLoopCommonModes);
- } else {
- [self _didDisconnect];
- }
- });
- }
- });
-}
-
-- (NSString*)bonjourName {
- CFStringRef name = _resolutionService ? CFNetServiceGetName(_resolutionService) : NULL;
- return name && CFStringGetLength(name) ? CFBridgingRelease(CFStringCreateCopy(kCFAllocatorDefault, name)) : nil;
-}
-
-- (NSString*)bonjourType {
- CFStringRef type = _resolutionService ? CFNetServiceGetType(_resolutionService) : NULL;
- return type && CFStringGetLength(type) ? CFBridgingRelease(CFStringCreateCopy(kCFAllocatorDefault, type)) : nil;
-}
-
-- (void)addHandlerWithMatchBlock:(GCDWebServerMatchBlock)matchBlock processBlock:(GCDWebServerProcessBlock)processBlock {
- [self addHandlerWithMatchBlock:matchBlock asyncProcessBlock:^(GCDWebServerRequest* request, GCDWebServerCompletionBlock completionBlock) {
- completionBlock(processBlock(request));
- }];
-}
-
-- (void)addHandlerWithMatchBlock:(GCDWebServerMatchBlock)matchBlock asyncProcessBlock:(GCDWebServerAsyncProcessBlock)processBlock {
- GWS_DCHECK(_options == nil);
- GCDWebServerHandler* handler = [[GCDWebServerHandler alloc] initWithMatchBlock:matchBlock asyncProcessBlock:processBlock];
- [_handlers insertObject:handler atIndex:0];
-}
-
-- (void)removeAllHandlers {
- GWS_DCHECK(_options == nil);
- [_handlers removeAllObjects];
-}
-
-static void _NetServiceRegisterCallBack(CFNetServiceRef service, CFStreamError* error, void* info) {
- GWS_DCHECK([NSThread isMainThread]);
- @autoreleasepool {
- if (error->error) {
- GWS_LOG_ERROR(@"Bonjour registration error %i (domain %i)", (int)error->error, (int)error->domain);
- } else {
- GCDWebServer* server = (__bridge GCDWebServer*)info;
- GWS_LOG_VERBOSE(@"Bonjour registration complete for %@", [server class]);
- if (!CFNetServiceResolveWithTimeout(server->_resolutionService, kBonjourResolutionTimeout, NULL)) {
- GWS_LOG_ERROR(@"Failed starting Bonjour resolution");
- GWS_DNOT_REACHED();
- }
- }
- }
-}
-
-static void _NetServiceResolveCallBack(CFNetServiceRef service, CFStreamError* error, void* info) {
- GWS_DCHECK([NSThread isMainThread]);
- @autoreleasepool {
- if (error->error) {
- if ((error->domain != kCFStreamErrorDomainNetServices) && (error->error != kCFNetServicesErrorTimeout)) {
- GWS_LOG_ERROR(@"Bonjour resolution error %i (domain %i)", (int)error->error, (int)error->domain);
- }
- } else {
- GCDWebServer* server = (__bridge GCDWebServer*)info;
- GWS_LOG_INFO(@"%@ now locally reachable at %@", [server class], server.bonjourServerURL);
- if ([server.delegate respondsToSelector:@selector(webServerDidCompleteBonjourRegistration:)]) {
- [server.delegate webServerDidCompleteBonjourRegistration:server];
- }
- }
- }
-}
-
-static void _DNSServiceCallBack(DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, DNSServiceErrorType errorCode, uint32_t externalAddress, DNSServiceProtocol protocol, uint16_t internalPort, uint16_t externalPort, uint32_t ttl, void* context) {
- GWS_DCHECK([NSThread isMainThread]);
- @autoreleasepool {
- GCDWebServer* server = (__bridge GCDWebServer*)context;
- if ((errorCode == kDNSServiceErr_NoError) || (errorCode == kDNSServiceErr_DoubleNAT)) {
- struct sockaddr_in addr4;
- bzero(&addr4, sizeof(addr4));
- addr4.sin_len = sizeof(addr4);
- addr4.sin_family = AF_INET;
- addr4.sin_addr.s_addr = externalAddress; // Already in network byte order
- server->_dnsAddress = GCDWebServerStringFromSockAddr((const struct sockaddr*)&addr4, NO);
- server->_dnsPort = ntohs(externalPort);
- GWS_LOG_INFO(@"%@ now publicly reachable at %@", [server class], server.publicServerURL);
- } else {
- GWS_LOG_ERROR(@"DNS service error %i", errorCode);
- server->_dnsAddress = nil;
- server->_dnsPort = 0;
- }
- if ([server.delegate respondsToSelector:@selector(webServerDidUpdateNATPortMapping:)]) {
- [server.delegate webServerDidUpdateNATPortMapping:server];
- }
- }
-}
-
-static void _SocketCallBack(CFSocketRef s, CFSocketCallBackType type, CFDataRef address, const void* data, void* info) {
- GWS_DCHECK([NSThread isMainThread]);
- @autoreleasepool {
- GCDWebServer* server = (__bridge GCDWebServer*)info;
- DNSServiceErrorType status = DNSServiceProcessResult(server->_dnsService);
- if (status != kDNSServiceErr_NoError) {
- GWS_LOG_ERROR(@"DNS service error %i", status);
- }
- }
-}
-
-static inline id _GetOption(NSDictionary* options, NSString* key, id defaultValue) {
- id value = [options objectForKey:key];
- return value ? value : defaultValue;
-}
-
-static inline NSString* _EncodeBase64(NSString* string) {
- NSData* data = [string dataUsingEncoding:NSUTF8StringEncoding];
-#if (TARGET_OS_IPHONE && !(__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_7_0)) || (!TARGET_OS_IPHONE && !(__MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_9))
- if (![data respondsToSelector:@selector(base64EncodedDataWithOptions:)]) {
- return [data base64Encoding];
- }
-#endif
- return [[NSString alloc] initWithData:[data base64EncodedDataWithOptions:0] encoding:NSASCIIStringEncoding];
-}
-
-- (int)_createListeningSocket:(BOOL)useIPv6
- localAddress:(const void*)address
- length:(socklen_t)length
- maxPendingConnections:(NSUInteger)maxPendingConnections
- error:(NSError**)error {
- int listeningSocket = socket(useIPv6 ? PF_INET6 : PF_INET, SOCK_STREAM, IPPROTO_TCP);
- if (listeningSocket > 0) {
- int yes = 1;
- setsockopt(listeningSocket, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes));
-
- if (bind(listeningSocket, address, length) == 0) {
- if (listen(listeningSocket, (int)maxPendingConnections) == 0) {
- GWS_LOG_DEBUG(@"Did open %s listening socket %i", useIPv6 ? "IPv6" : "IPv4", listeningSocket);
- return listeningSocket;
- } else {
- if (error) {
- *error = GCDWebServerMakePosixError(errno);
- }
- GWS_LOG_ERROR(@"Failed starting %s listening socket: %s (%i)", useIPv6 ? "IPv6" : "IPv4", strerror(errno), errno);
- close(listeningSocket);
- }
- } else {
- if (error) {
- *error = GCDWebServerMakePosixError(errno);
- }
- GWS_LOG_ERROR(@"Failed binding %s listening socket: %s (%i)", useIPv6 ? "IPv6" : "IPv4", strerror(errno), errno);
- close(listeningSocket);
- }
-
- } else {
- if (error) {
- *error = GCDWebServerMakePosixError(errno);
- }
- GWS_LOG_ERROR(@"Failed creating %s listening socket: %s (%i)", useIPv6 ? "IPv6" : "IPv4", strerror(errno), errno);
- }
- return -1;
-}
-
-- (dispatch_source_t)_createDispatchSourceWithListeningSocket:(int)listeningSocket isIPv6:(BOOL)isIPv6 {
- dispatch_group_enter(_sourceGroup);
- dispatch_source_t source = dispatch_source_create(DISPATCH_SOURCE_TYPE_READ, listeningSocket, 0, kGCDWebServerGCDQueue);
- dispatch_source_set_cancel_handler(source, ^{
-
- @autoreleasepool {
- int result = close(listeningSocket);
- if (result != 0) {
- GWS_LOG_ERROR(@"Failed closing %s listening socket: %s (%i)", isIPv6 ? "IPv6" : "IPv4", strerror(errno), errno);
- } else {
- GWS_LOG_DEBUG(@"Did close %s listening socket %i", isIPv6 ? "IPv6" : "IPv4", listeningSocket);
- }
- }
- dispatch_group_leave(_sourceGroup);
-
- });
- dispatch_source_set_event_handler(source, ^{
-
- @autoreleasepool {
- struct sockaddr_storage remoteSockAddr;
- socklen_t remoteAddrLen = sizeof(remoteSockAddr);
- int socket = accept(listeningSocket, (struct sockaddr*)&remoteSockAddr, &remoteAddrLen);
- if (socket > 0) {
- NSData* remoteAddress = [NSData dataWithBytes:&remoteSockAddr length:remoteAddrLen];
-
- struct sockaddr_storage localSockAddr;
- socklen_t localAddrLen = sizeof(localSockAddr);
- NSData* localAddress = nil;
- if (getsockname(socket, (struct sockaddr*)&localSockAddr, &localAddrLen) == 0) {
- localAddress = [NSData dataWithBytes:&localSockAddr length:localAddrLen];
- GWS_DCHECK((!isIPv6 && localSockAddr.ss_family == AF_INET) || (isIPv6 && localSockAddr.ss_family == AF_INET6));
- } else {
- GWS_DNOT_REACHED();
- }
-
- int noSigPipe = 1;
- setsockopt(socket, SOL_SOCKET, SO_NOSIGPIPE, &noSigPipe, sizeof(noSigPipe)); // Make sure this socket cannot generate SIG_PIPE
-
- GCDWebServerConnection* connection = [[_connectionClass alloc] initWithServer:self localAddress:localAddress remoteAddress:remoteAddress socket:socket]; // Connection will automatically retain itself while opened
- [connection self]; // Prevent compiler from complaining about unused variable / useless statement
- } else {
- GWS_LOG_ERROR(@"Failed accepting %s socket: %s (%i)", isIPv6 ? "IPv6" : "IPv4", strerror(errno), errno);
- }
- }
-
- });
- return source;
-}
-
-- (BOOL)_start:(NSError**)error {
- GWS_DCHECK(_source4 == NULL);
-
- NSUInteger port = [_GetOption(_options, GCDWebServerOption_Port, @0) unsignedIntegerValue];
- BOOL bindToLocalhost = [_GetOption(_options, GCDWebServerOption_BindToLocalhost, @NO) boolValue];
- NSUInteger maxPendingConnections = [_GetOption(_options, GCDWebServerOption_MaxPendingConnections, @16) unsignedIntegerValue];
-
- struct sockaddr_in addr4;
- bzero(&addr4, sizeof(addr4));
- addr4.sin_len = sizeof(addr4);
- addr4.sin_family = AF_INET;
- addr4.sin_port = htons(port);
- addr4.sin_addr.s_addr = bindToLocalhost ? htonl(INADDR_LOOPBACK) : htonl(INADDR_ANY);
- int listeningSocket4 = [self _createListeningSocket:NO localAddress:&addr4 length:sizeof(addr4) maxPendingConnections:maxPendingConnections error:error];
- if (listeningSocket4 <= 0) {
- return NO;
- }
- if (port == 0) {
- struct sockaddr_in addr;
- socklen_t addrlen = sizeof(addr);
- if (getsockname(listeningSocket4, (struct sockaddr*)&addr, &addrlen) == 0) {
- port = ntohs(addr.sin_port);
- } else {
- GWS_LOG_ERROR(@"Failed retrieving socket address: %s (%i)", strerror(errno), errno);
- }
- }
-
- struct sockaddr_in6 addr6;
- bzero(&addr6, sizeof(addr6));
- addr6.sin6_len = sizeof(addr6);
- addr6.sin6_family = AF_INET6;
- addr6.sin6_port = htons(port);
- addr6.sin6_addr = bindToLocalhost ? in6addr_loopback : in6addr_any;
- int listeningSocket6 = [self _createListeningSocket:YES localAddress:&addr6 length:sizeof(addr6) maxPendingConnections:maxPendingConnections error:error];
- if (listeningSocket6 <= 0) {
- close(listeningSocket4);
- return NO;
- }
-
- _serverName = [_GetOption(_options, GCDWebServerOption_ServerName, NSStringFromClass([self class])) copy];
- NSString* authenticationMethod = _GetOption(_options, GCDWebServerOption_AuthenticationMethod, nil);
- if ([authenticationMethod isEqualToString:GCDWebServerAuthenticationMethod_Basic]) {
- _authenticationRealm = [_GetOption(_options, GCDWebServerOption_AuthenticationRealm, _serverName) copy];
- _authenticationBasicAccounts = [[NSMutableDictionary alloc] init];
- NSDictionary* accounts = _GetOption(_options, GCDWebServerOption_AuthenticationAccounts, @{});
- [accounts enumerateKeysAndObjectsUsingBlock:^(NSString* username, NSString* password, BOOL* stop) {
- [_authenticationBasicAccounts setObject:_EncodeBase64([NSString stringWithFormat:@"%@:%@", username, password]) forKey:username];
- }];
- } else if ([authenticationMethod isEqualToString:GCDWebServerAuthenticationMethod_DigestAccess]) {
- _authenticationRealm = [_GetOption(_options, GCDWebServerOption_AuthenticationRealm, _serverName) copy];
- _authenticationDigestAccounts = [[NSMutableDictionary alloc] init];
- NSDictionary* accounts = _GetOption(_options, GCDWebServerOption_AuthenticationAccounts, @{});
- [accounts enumerateKeysAndObjectsUsingBlock:^(NSString* username, NSString* password, BOOL* stop) {
- [_authenticationDigestAccounts setObject:GCDWebServerComputeMD5Digest(@"%@:%@:%@", username, _authenticationRealm, password) forKey:username];
- }];
- }
- _connectionClass = _GetOption(_options, GCDWebServerOption_ConnectionClass, [GCDWebServerConnection class]);
- _mapHEADToGET = [_GetOption(_options, GCDWebServerOption_AutomaticallyMapHEADToGET, @YES) boolValue];
- _disconnectDelay = [_GetOption(_options, GCDWebServerOption_ConnectedStateCoalescingInterval, @1.0) doubleValue];
-
- _source4 = [self _createDispatchSourceWithListeningSocket:listeningSocket4 isIPv6:NO];
- _source6 = [self _createDispatchSourceWithListeningSocket:listeningSocket6 isIPv6:YES];
- _port = port;
- _bindToLocalhost = bindToLocalhost;
-
- NSString* bonjourName = _GetOption(_options, GCDWebServerOption_BonjourName, nil);
- NSString* bonjourType = _GetOption(_options, GCDWebServerOption_BonjourType, @"_http._tcp");
- if (bonjourName) {
- _registrationService = CFNetServiceCreate(kCFAllocatorDefault, CFSTR("local."), (__bridge CFStringRef)bonjourType, (__bridge CFStringRef)(bonjourName.length ? bonjourName : _serverName), (SInt32)_port);
- if (_registrationService) {
- CFNetServiceClientContext context = {0, (__bridge void*)self, NULL, NULL, NULL};
-
- CFNetServiceSetClient(_registrationService, _NetServiceRegisterCallBack, &context);
- CFNetServiceScheduleWithRunLoop(_registrationService, CFRunLoopGetMain(), kCFRunLoopCommonModes);
- CFStreamError streamError = {0};
- CFNetServiceRegisterWithOptions(_registrationService, 0, &streamError);
-
- _resolutionService = CFNetServiceCreateCopy(kCFAllocatorDefault, _registrationService);
- if (_resolutionService) {
- CFNetServiceSetClient(_resolutionService, _NetServiceResolveCallBack, &context);
- CFNetServiceScheduleWithRunLoop(_resolutionService, CFRunLoopGetMain(), kCFRunLoopCommonModes);
- } else {
- GWS_LOG_ERROR(@"Failed creating CFNetService for resolution");
- }
- } else {
- GWS_LOG_ERROR(@"Failed creating CFNetService for registration");
- }
- }
-
- if ([_GetOption(_options, GCDWebServerOption_RequestNATPortMapping, @NO) boolValue]) {
- DNSServiceErrorType status = DNSServiceNATPortMappingCreate(&_dnsService, 0, 0, kDNSServiceProtocol_TCP, htons(port), htons(port), 0, _DNSServiceCallBack, (__bridge void*)self);
- if (status == kDNSServiceErr_NoError) {
- CFSocketContext context = {0, (__bridge void*)self, NULL, NULL, NULL};
- _dnsSocket = CFSocketCreateWithNative(kCFAllocatorDefault, DNSServiceRefSockFD(_dnsService), kCFSocketReadCallBack, _SocketCallBack, &context);
- if (_dnsSocket) {
- CFSocketSetSocketFlags(_dnsSocket, CFSocketGetSocketFlags(_dnsSocket) & ~kCFSocketCloseOnInvalidate);
- _dnsSource = CFSocketCreateRunLoopSource(kCFAllocatorDefault, _dnsSocket, 0);
- if (_dnsSource) {
- CFRunLoopAddSource(CFRunLoopGetMain(), _dnsSource, kCFRunLoopCommonModes);
- } else {
- GWS_LOG_ERROR(@"Failed creating CFRunLoopSource");
- GWS_DNOT_REACHED();
- }
- } else {
- GWS_LOG_ERROR(@"Failed creating CFSocket");
- GWS_DNOT_REACHED();
- }
- } else {
- GWS_LOG_ERROR(@"Failed creating NAT port mapping (%i)", status);
- }
- }
-
- dispatch_resume(_source4);
- dispatch_resume(_source6);
- GWS_LOG_INFO(@"%@ started on port %i and reachable at %@", [self class], (int)_port, self.serverURL);
- if ([_delegate respondsToSelector:@selector(webServerDidStart:)]) {
- dispatch_async(dispatch_get_main_queue(), ^{
- [_delegate webServerDidStart:self];
- });
- }
-
- return YES;
-}
-
-- (void)_stop {
- GWS_DCHECK(_source4 != NULL);
-
- if (_dnsService) {
- _dnsAddress = nil;
- _dnsPort = 0;
- if (_dnsSource) {
- CFRunLoopSourceInvalidate(_dnsSource);
- CFRelease(_dnsSource);
- _dnsSource = NULL;
- }
- if (_dnsSocket) {
- CFRelease(_dnsSocket);
- _dnsSocket = NULL;
- }
- DNSServiceRefDeallocate(_dnsService);
- _dnsService = NULL;
- }
-
- if (_registrationService) {
- if (_resolutionService) {
- CFNetServiceUnscheduleFromRunLoop(_resolutionService, CFRunLoopGetMain(), kCFRunLoopCommonModes);
- CFNetServiceSetClient(_resolutionService, NULL, NULL);
- CFNetServiceCancel(_resolutionService);
- CFRelease(_resolutionService);
- _resolutionService = NULL;
- }
- CFNetServiceUnscheduleFromRunLoop(_registrationService, CFRunLoopGetMain(), kCFRunLoopCommonModes);
- CFNetServiceSetClient(_registrationService, NULL, NULL);
- CFNetServiceCancel(_registrationService);
- CFRelease(_registrationService);
- _registrationService = NULL;
- }
-
- dispatch_source_cancel(_source6);
- dispatch_source_cancel(_source4);
- dispatch_group_wait(_sourceGroup, DISPATCH_TIME_FOREVER); // Wait until the cancellation handlers have been called which guarantees the listening sockets are closed
-#if !OS_OBJECT_USE_OBJC_RETAIN_RELEASE
- dispatch_release(_source6);
-#endif
- _source6 = NULL;
-#if !OS_OBJECT_USE_OBJC_RETAIN_RELEASE
- dispatch_release(_source4);
-#endif
- _source4 = NULL;
- _port = 0;
- _bindToLocalhost = NO;
-
- _serverName = nil;
- _authenticationRealm = nil;
- _authenticationBasicAccounts = nil;
- _authenticationDigestAccounts = nil;
-
- dispatch_async(dispatch_get_main_queue(), ^{
- if (_disconnectTimer) {
- CFRunLoopTimerInvalidate(_disconnectTimer);
- CFRelease(_disconnectTimer);
- _disconnectTimer = NULL;
- [self _didDisconnect];
- }
- });
-
- GWS_LOG_INFO(@"%@ stopped", [self class]);
- if ([_delegate respondsToSelector:@selector(webServerDidStop:)]) {
- dispatch_async(dispatch_get_main_queue(), ^{
- [_delegate webServerDidStop:self];
- });
- }
-}
-
-#if TARGET_OS_IPHONE
-
-- (void)_didEnterBackground:(NSNotification*)notification {
- GWS_DCHECK([NSThread isMainThread]);
- GWS_LOG_DEBUG(@"Did enter background");
- if ((_backgroundTask == UIBackgroundTaskInvalid) && _source4) {
- [self _stop];
- }
-}
-
-- (void)_willEnterForeground:(NSNotification*)notification {
- GWS_DCHECK([NSThread isMainThread]);
- GWS_LOG_DEBUG(@"Will enter foreground");
- if (!_source4) {
- [self _start:NULL]; // TODO: There's probably nothing we can do on failure
- }
-}
-
-#endif
-
-- (BOOL)startWithOptions:(NSDictionary*)options error:(NSError**)error {
- if (_options == nil) {
- _options = options ? [options copy] : @{};
-#if TARGET_OS_IPHONE
- _suspendInBackground = [_GetOption(_options, GCDWebServerOption_AutomaticallySuspendInBackground, @YES) boolValue];
- if (((_suspendInBackground == NO) || ([[UIApplication sharedApplication] applicationState] != UIApplicationStateBackground)) && ![self _start:error])
-#else
- if (![self _start:error])
-#endif
- {
- _options = nil;
- return NO;
- }
-#if TARGET_OS_IPHONE
- if (_suspendInBackground) {
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_didEnterBackground:) name:UIApplicationDidEnterBackgroundNotification object:nil];
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_willEnterForeground:) name:UIApplicationWillEnterForegroundNotification object:nil];
- }
-#endif
- return YES;
- } else {
- GWS_DNOT_REACHED();
- }
- return NO;
-}
-
-- (BOOL)isRunning {
- return (_options ? YES : NO);
-}
-
-- (void)stop {
- if (_options) {
-#if TARGET_OS_IPHONE
- if (_suspendInBackground) {
- [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidEnterBackgroundNotification object:nil];
- [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationWillEnterForegroundNotification object:nil];
- }
-#endif
- if (_source4) {
- [self _stop];
- }
- _options = nil;
- } else {
- GWS_DNOT_REACHED();
- }
-}
-
-@end
-
-@implementation GCDWebServer (Extensions)
-
-- (NSURL*)serverURL {
- if (_source4) {
- NSString* ipAddress = _bindToLocalhost ? @"localhost" : GCDWebServerGetPrimaryIPAddress(NO); // We can't really use IPv6 anyway as it doesn't work great with HTTP URLs in practice
- if (ipAddress) {
- if (_port != 80) {
- return [NSURL URLWithString:[NSString stringWithFormat:@"http://%@:%i/", ipAddress, (int)_port]];
- } else {
- return [NSURL URLWithString:[NSString stringWithFormat:@"http://%@/", ipAddress]];
- }
- }
- }
- return nil;
-}
-
-- (NSURL*)bonjourServerURL {
- if (_source4 && _resolutionService) {
- NSString* name = (__bridge NSString*)CFNetServiceGetTargetHost(_resolutionService);
- if (name.length) {
- name = [name substringToIndex:(name.length - 1)]; // Strip trailing period at end of domain
- if (_port != 80) {
- return [NSURL URLWithString:[NSString stringWithFormat:@"http://%@:%i/", name, (int)_port]];
- } else {
- return [NSURL URLWithString:[NSString stringWithFormat:@"http://%@/", name]];
- }
- }
- }
- return nil;
-}
-
-- (NSURL*)publicServerURL {
- if (_source4 && _dnsService && _dnsAddress && _dnsPort) {
- if (_dnsPort != 80) {
- return [NSURL URLWithString:[NSString stringWithFormat:@"http://%@:%i/", _dnsAddress, (int)_dnsPort]];
- } else {
- return [NSURL URLWithString:[NSString stringWithFormat:@"http://%@/", _dnsAddress]];
- }
- }
- return nil;
-}
-
-- (BOOL)start {
- return [self startWithPort:kDefaultPort bonjourName:@""];
-}
-
-- (BOOL)startWithPort:(NSUInteger)port bonjourName:(NSString*)name {
- NSMutableDictionary* options = [NSMutableDictionary dictionary];
- [options setObject:[NSNumber numberWithInteger:port] forKey:GCDWebServerOption_Port];
- [options setValue:name forKey:GCDWebServerOption_BonjourName];
- return [self startWithOptions:options error:NULL];
-}
-
-#if !TARGET_OS_IPHONE
-
-- (BOOL)runWithPort:(NSUInteger)port bonjourName:(NSString*)name {
- NSMutableDictionary* options = [NSMutableDictionary dictionary];
- [options setObject:[NSNumber numberWithInteger:port] forKey:GCDWebServerOption_Port];
- [options setValue:name forKey:GCDWebServerOption_BonjourName];
- return [self runWithOptions:options error:NULL];
-}
-
-- (BOOL)runWithOptions:(NSDictionary*)options error:(NSError**)error {
- GWS_DCHECK([NSThread isMainThread]);
- BOOL success = NO;
- _run = YES;
- void (*termHandler)(int) = signal(SIGTERM, _SignalHandler);
- void (*intHandler)(int) = signal(SIGINT, _SignalHandler);
- if ((termHandler != SIG_ERR) && (intHandler != SIG_ERR)) {
- if ([self startWithOptions:options error:error]) {
- while (_run) {
- CFRunLoopRunInMode(kCFRunLoopDefaultMode, 1.0, true);
- }
- [self stop];
- success = YES;
- }
- _ExecuteMainThreadRunLoopSources();
- signal(SIGINT, intHandler);
- signal(SIGTERM, termHandler);
- }
- return success;
-}
-
-#endif
-
-@end
-
-@implementation GCDWebServer (Handlers)
-
-- (void)addDefaultHandlerForMethod:(NSString*)method requestClass:(Class)aClass processBlock:(GCDWebServerProcessBlock)block {
- [self addDefaultHandlerForMethod:method requestClass:aClass asyncProcessBlock:^(GCDWebServerRequest* request, GCDWebServerCompletionBlock completionBlock) {
- completionBlock(block(request));
- }];
-}
-
-- (void)addDefaultHandlerForMethod:(NSString*)method requestClass:(Class)aClass asyncProcessBlock:(GCDWebServerAsyncProcessBlock)block {
- [self addHandlerWithMatchBlock:^GCDWebServerRequest *(NSString* requestMethod, NSURL* requestURL, NSDictionary* requestHeaders, NSString* urlPath, NSDictionary* urlQuery) {
-
- if (![requestMethod isEqualToString:method]) {
- return nil;
- }
- return [[aClass alloc] initWithMethod:requestMethod url:requestURL headers:requestHeaders path:urlPath query:urlQuery];
-
- } asyncProcessBlock:block];
-}
-
-- (void)addHandlerForMethod:(NSString*)method path:(NSString*)path requestClass:(Class)aClass processBlock:(GCDWebServerProcessBlock)block {
- [self addHandlerForMethod:method path:path requestClass:aClass asyncProcessBlock:^(GCDWebServerRequest* request, GCDWebServerCompletionBlock completionBlock) {
- completionBlock(block(request));
- }];
-}
-
-- (void)addHandlerForMethod:(NSString*)method path:(NSString*)path requestClass:(Class)aClass asyncProcessBlock:(GCDWebServerAsyncProcessBlock)block {
- if ([path hasPrefix:@"/"] && [aClass isSubclassOfClass:[GCDWebServerRequest class]]) {
- [self addHandlerWithMatchBlock:^GCDWebServerRequest *(NSString* requestMethod, NSURL* requestURL, NSDictionary* requestHeaders, NSString* urlPath, NSDictionary* urlQuery) {
-
- if (![requestMethod isEqualToString:method]) {
- return nil;
- }
- if ([urlPath caseInsensitiveCompare:path] != NSOrderedSame) {
- return nil;
- }
- return [[aClass alloc] initWithMethod:requestMethod url:requestURL headers:requestHeaders path:urlPath query:urlQuery];
-
- } asyncProcessBlock:block];
- } else {
- GWS_DNOT_REACHED();
- }
-}
-
-- (void)addHandlerForMethod:(NSString*)method pathRegex:(NSString*)regex requestClass:(Class)aClass processBlock:(GCDWebServerProcessBlock)block {
- [self addHandlerForMethod:method pathRegex:regex requestClass:aClass asyncProcessBlock:^(GCDWebServerRequest* request, GCDWebServerCompletionBlock completionBlock) {
- completionBlock(block(request));
- }];
-}
-
-- (void)addHandlerForMethod:(NSString*)method pathRegex:(NSString*)regex requestClass:(Class)aClass asyncProcessBlock:(GCDWebServerAsyncProcessBlock)block {
- NSRegularExpression* expression = [NSRegularExpression regularExpressionWithPattern:regex options:NSRegularExpressionCaseInsensitive error:NULL];
- if (expression && [aClass isSubclassOfClass:[GCDWebServerRequest class]]) {
- [self addHandlerWithMatchBlock:^GCDWebServerRequest *(NSString* requestMethod, NSURL* requestURL, NSDictionary* requestHeaders, NSString* urlPath, NSDictionary* urlQuery) {
-
- if (![requestMethod isEqualToString:method]) {
- return nil;
- }
-
- NSArray* matches = [expression matchesInString:urlPath options:0 range:NSMakeRange(0, urlPath.length)];
- if (matches.count == 0) {
- return nil;
- }
-
- NSMutableArray* captures = [NSMutableArray array];
- for (NSTextCheckingResult* result in matches) {
- // Start at 1; index 0 is the whole string
- for (NSUInteger i = 1; i < result.numberOfRanges; i++) {
- NSRange range = [result rangeAtIndex:i];
- // range is {NSNotFound, 0} "if one of the capture groups did not participate in this particular match"
- // see discussion in -[NSRegularExpression firstMatchInString:options:range:]
- if (range.location != NSNotFound) {
- [captures addObject:[urlPath substringWithRange:range]];
- }
- }
- }
-
- GCDWebServerRequest* request = [[aClass alloc] initWithMethod:requestMethod url:requestURL headers:requestHeaders path:urlPath query:urlQuery];
- [request setAttribute:captures forKey:GCDWebServerRequestAttribute_RegexCaptures];
- return request;
-
- } asyncProcessBlock:block];
- } else {
- GWS_DNOT_REACHED();
- }
-}
-
-@end
-
-@implementation GCDWebServer (GETHandlers)
-
-- (void)addGETHandlerForPath:(NSString*)path staticData:(NSData*)staticData contentType:(NSString*)contentType cacheAge:(NSUInteger)cacheAge {
- [self addHandlerForMethod:@"GET" path:path requestClass:[GCDWebServerRequest class] processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) {
-
- GCDWebServerResponse* response = [GCDWebServerDataResponse responseWithData:staticData contentType:contentType];
- response.cacheControlMaxAge = cacheAge;
- return response;
-
- }];
-}
-
-- (void)addGETHandlerForPath:(NSString*)path filePath:(NSString*)filePath isAttachment:(BOOL)isAttachment cacheAge:(NSUInteger)cacheAge allowRangeRequests:(BOOL)allowRangeRequests {
- [self addHandlerForMethod:@"GET" path:path requestClass:[GCDWebServerRequest class] processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) {
-
- GCDWebServerResponse* response = nil;
- if (allowRangeRequests) {
- response = [GCDWebServerFileResponse responseWithFile:filePath byteRange:request.byteRange isAttachment:isAttachment];
- [response setValue:@"bytes" forAdditionalHeader:@"Accept-Ranges"];
- } else {
- response = [GCDWebServerFileResponse responseWithFile:filePath isAttachment:isAttachment];
- }
- response.cacheControlMaxAge = cacheAge;
- return response;
-
- }];
-}
-
-- (GCDWebServerResponse*)_responseWithContentsOfDirectory:(NSString*)path {
- NSDirectoryEnumerator* enumerator = [[NSFileManager defaultManager] enumeratorAtPath:path];
- if (enumerator == nil) {
- return nil;
- }
- NSMutableString* html = [NSMutableString string];
- [html appendString:@"<!DOCTYPE html>\n"];
- [html appendString:@"<html><head><meta charset=\"utf-8\"></head><body>\n"];
- [html appendString:@"<ul>\n"];
- for (NSString* file in enumerator) {
- if (![file hasPrefix:@"."]) {
- NSString* type = [[enumerator fileAttributes] objectForKey:NSFileType];
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- NSString* escapedFile = [file stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
-#pragma clang diagnostic pop
- GWS_DCHECK(escapedFile);
- if ([type isEqualToString:NSFileTypeRegular]) {
- [html appendFormat:@"<li><a href=\"%@\">%@</a></li>\n", escapedFile, file];
- } else if ([type isEqualToString:NSFileTypeDirectory]) {
- [html appendFormat:@"<li><a href=\"%@/\">%@/</a></li>\n", escapedFile, file];
- }
- }
- [enumerator skipDescendents];
- }
- [html appendString:@"</ul>\n"];
- [html appendString:@"</body></html>\n"];
- return [GCDWebServerDataResponse responseWithHTML:html];
-}
-
-- (void)addGETHandlerForBasePath:(NSString*)basePath directoryPath:(NSString*)directoryPath indexFilename:(NSString*)indexFilename cacheAge:(NSUInteger)cacheAge allowRangeRequests:(BOOL)allowRangeRequests {
- if ([basePath hasPrefix:@"/"] && [basePath hasSuffix:@"/"]) {
- GCDWebServer* __unsafe_unretained server = self;
- [self addHandlerWithMatchBlock:^GCDWebServerRequest *(NSString* requestMethod, NSURL* requestURL, NSDictionary* requestHeaders, NSString* urlPath, NSDictionary* urlQuery) {
-
- if (![requestMethod isEqualToString:@"GET"]) {
- return nil;
- }
- if (![urlPath hasPrefix:basePath]) {
- return nil;
- }
- return [[GCDWebServerRequest alloc] initWithMethod:requestMethod url:requestURL headers:requestHeaders path:urlPath query:urlQuery];
-
- } processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) {
-
- GCDWebServerResponse* response = nil;
- NSString* filePath = [directoryPath stringByAppendingPathComponent:[request.path substringFromIndex:basePath.length]];
- NSString* fileType = [[[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:NULL] fileType];
- if (fileType) {
- if ([fileType isEqualToString:NSFileTypeDirectory]) {
- if (indexFilename) {
- NSString* indexPath = [filePath stringByAppendingPathComponent:indexFilename];
- NSString* indexType = [[[NSFileManager defaultManager] attributesOfItemAtPath:indexPath error:NULL] fileType];
- if ([indexType isEqualToString:NSFileTypeRegular]) {
- return [GCDWebServerFileResponse responseWithFile:indexPath];
- }
- }
- response = [server _responseWithContentsOfDirectory:filePath];
- } else if ([fileType isEqualToString:NSFileTypeRegular]) {
- if (allowRangeRequests) {
- response = [GCDWebServerFileResponse responseWithFile:filePath byteRange:request.byteRange];
- [response setValue:@"bytes" forAdditionalHeader:@"Accept-Ranges"];
- } else {
- response = [GCDWebServerFileResponse responseWithFile:filePath];
- }
- }
- }
- if (response) {
- response.cacheControlMaxAge = cacheAge;
- } else {
- response = [GCDWebServerResponse responseWithStatusCode:kGCDWebServerHTTPStatusCode_NotFound];
- }
- return response;
-
- }];
- } else {
- GWS_DNOT_REACHED();
- }
-}
-
-@end
-
-@implementation GCDWebServer (Logging)
-
-+ (void)setLogLevel:(int)level {
-#if defined(__GCDWEBSERVER_LOGGING_FACILITY_XLFACILITY__)
- [XLSharedFacility setMinLogLevel:level];
-#elif defined(__GCDWEBSERVER_LOGGING_FACILITY_COCOALUMBERJACK__)
- GCDWebServerLogLevel = level;
-#elif defined(__GCDWEBSERVER_LOGGING_FACILITY_BUILTIN__)
- GCDWebServerLogLevel = level;
-#endif
-}
-
-- (void)logVerbose:(NSString*)format, ... {
- va_list arguments;
- va_start(arguments, format);
- GWS_LOG_VERBOSE(@"%@", [[NSString alloc] initWithFormat:format arguments:arguments]);
- va_end(arguments);
-}
-
-- (void)logInfo:(NSString*)format, ... {
- va_list arguments;
- va_start(arguments, format);
- GWS_LOG_INFO(@"%@", [[NSString alloc] initWithFormat:format arguments:arguments]);
- va_end(arguments);
-}
-
-- (void)logWarning:(NSString*)format, ... {
- va_list arguments;
- va_start(arguments, format);
- GWS_LOG_WARNING(@"%@", [[NSString alloc] initWithFormat:format arguments:arguments]);
- va_end(arguments);
-}
-
-- (void)logError:(NSString*)format, ... {
- va_list arguments;
- va_start(arguments, format);
- GWS_LOG_ERROR(@"%@", [[NSString alloc] initWithFormat:format arguments:arguments]);
- va_end(arguments);
-}
-
-- (void)logException:(NSException*)exception {
- GWS_LOG_EXCEPTION(exception);
-}
-
-@end
-
-#ifdef __GCDWEBSERVER_ENABLE_TESTING__
-
-@implementation GCDWebServer (Testing)
-
-- (void)setRecordingEnabled:(BOOL)flag {
- _recording = flag;
-}
-
-- (BOOL)isRecordingEnabled {
- return _recording;
-}
-
-static CFHTTPMessageRef _CreateHTTPMessageFromData(NSData* data, BOOL isRequest) {
- CFHTTPMessageRef message = CFHTTPMessageCreateEmpty(kCFAllocatorDefault, isRequest);
- if (CFHTTPMessageAppendBytes(message, data.bytes, data.length)) {
- return message;
- }
- CFRelease(message);
- return NULL;
-}
-
-static CFHTTPMessageRef _CreateHTTPMessageFromPerformingRequest(NSData* inData, NSUInteger port) {
- CFHTTPMessageRef response = NULL;
- int httpSocket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
- if (httpSocket > 0) {
- struct sockaddr_in addr4;
- bzero(&addr4, sizeof(addr4));
- addr4.sin_len = sizeof(port);
- addr4.sin_family = AF_INET;
- addr4.sin_port = htons(8080);
- addr4.sin_addr.s_addr = htonl(INADDR_ANY);
- if (connect(httpSocket, (void*)&addr4, sizeof(addr4)) == 0) {
- if (write(httpSocket, inData.bytes, inData.length) == (ssize_t)inData.length) {
- NSMutableData* outData = [[NSMutableData alloc] initWithLength:(256 * 1024)];
- NSUInteger length = 0;
- while (1) {
- ssize_t result = read(httpSocket, (char*)outData.mutableBytes + length, outData.length - length);
- if (result < 0) {
- length = NSUIntegerMax;
- break;
- } else if (result == 0) {
- break;
- }
- length += result;
- if (length >= outData.length) {
- outData.length = 2 * outData.length;
- }
- }
- if (length != NSUIntegerMax) {
- outData.length = length;
- response = _CreateHTTPMessageFromData(outData, NO);
- } else {
- GWS_DNOT_REACHED();
- }
- }
- }
- close(httpSocket);
- }
- return response;
-}
-
-static void _LogResult(NSString* format, ...) {
- va_list arguments;
- va_start(arguments, format);
- NSString* message = [[NSString alloc] initWithFormat:format arguments:arguments];
- va_end(arguments);
- fprintf(stdout, "%s\n", [message UTF8String]);
-}
-
-- (NSInteger)runTestsWithOptions:(NSDictionary*)options inDirectory:(NSString*)path {
- GWS_DCHECK([NSThread isMainThread]);
- NSArray* ignoredHeaders = @[@"Date", @"Etag"]; // Dates are always different by definition and ETags depend on file system node IDs
- NSInteger result = -1;
- if ([self startWithOptions:options error:NULL]) {
- _ExecuteMainThreadRunLoopSources();
-
- result = 0;
- NSArray* files = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:path error:NULL];
- for (NSString* requestFile in files) {
- if (![requestFile hasSuffix:@".request"]) {
- continue;
- }
- @autoreleasepool {
- NSString* index = [[requestFile componentsSeparatedByString:@"-"] firstObject];
- BOOL success = NO;
- NSData* requestData = [NSData dataWithContentsOfFile:[path stringByAppendingPathComponent:requestFile]];
- if (requestData) {
- CFHTTPMessageRef request = _CreateHTTPMessageFromData(requestData, YES);
- if (request) {
- NSString* requestMethod = CFBridgingRelease(CFHTTPMessageCopyRequestMethod(request));
- NSURL* requestURL = CFBridgingRelease(CFHTTPMessageCopyRequestURL(request));
- _LogResult(@"[%i] %@ %@", (int)[index integerValue], requestMethod, requestURL.path);
- NSString* prefix = [index stringByAppendingString:@"-"];
- for (NSString* responseFile in files) {
- if ([responseFile hasPrefix:prefix] && [responseFile hasSuffix:@".response"]) {
- NSData* responseData = [NSData dataWithContentsOfFile:[path stringByAppendingPathComponent:responseFile]];
- if (responseData) {
- CFHTTPMessageRef expectedResponse = _CreateHTTPMessageFromData(responseData, NO);
- if (expectedResponse) {
- CFHTTPMessageRef actualResponse = _CreateHTTPMessageFromPerformingRequest(requestData, self.port);
- if (actualResponse) {
- success = YES;
-
- CFIndex expectedStatusCode = CFHTTPMessageGetResponseStatusCode(expectedResponse);
- CFIndex actualStatusCode = CFHTTPMessageGetResponseStatusCode(actualResponse);
- if (actualStatusCode != expectedStatusCode) {
- _LogResult(@" Status code not matching:\n Expected: %i\n Actual: %i", (int)expectedStatusCode, (int)actualStatusCode);
- success = NO;
- }
-
- NSDictionary* expectedHeaders = CFBridgingRelease(CFHTTPMessageCopyAllHeaderFields(expectedResponse));
- NSDictionary* actualHeaders = CFBridgingRelease(CFHTTPMessageCopyAllHeaderFields(actualResponse));
- for (NSString* expectedHeader in expectedHeaders) {
- if ([ignoredHeaders containsObject:expectedHeader]) {
- continue;
- }
- NSString* expectedValue = [expectedHeaders objectForKey:expectedHeader];
- NSString* actualValue = [actualHeaders objectForKey:expectedHeader];
- if (![actualValue isEqualToString:expectedValue]) {
- _LogResult(@" Header '%@' not matching:\n Expected: \"%@\"\n Actual: \"%@\"", expectedHeader, expectedValue, actualValue);
- success = NO;
- }
- }
- for (NSString* actualHeader in actualHeaders) {
- if (![expectedHeaders objectForKey:actualHeader]) {
- _LogResult(@" Header '%@' not matching:\n Expected: \"%@\"\n Actual: \"%@\"", actualHeader, nil, [actualHeaders objectForKey:actualHeader]);
- success = NO;
- }
- }
-
- NSString* expectedContentLength = CFBridgingRelease(CFHTTPMessageCopyHeaderFieldValue(expectedResponse, CFSTR("Content-Length")));
- NSData* expectedBody = CFBridgingRelease(CFHTTPMessageCopyBody(expectedResponse));
- NSString* actualContentLength = CFBridgingRelease(CFHTTPMessageCopyHeaderFieldValue(actualResponse, CFSTR("Content-Length")));
- NSData* actualBody = CFBridgingRelease(CFHTTPMessageCopyBody(actualResponse));
- if ([actualContentLength isEqualToString:expectedContentLength] && (actualBody.length > expectedBody.length)) { // Handle web browser closing connection before retrieving entire body (e.g. when playing a video file)
- actualBody = [actualBody subdataWithRange:NSMakeRange(0, expectedBody.length)];
- }
- if (![actualBody isEqualToData:expectedBody]) {
- _LogResult(@" Bodies not matching:\n Expected: %lu bytes\n Actual: %lu bytes", (unsigned long)expectedBody.length, (unsigned long)actualBody.length);
- success = NO;
-#if !TARGET_OS_IPHONE
-#if DEBUG
- if (GCDWebServerIsTextContentType([expectedHeaders objectForKey:@"Content-Type"])) {
- NSString* expectedPath = [NSTemporaryDirectory() stringByAppendingPathComponent:[[[NSProcessInfo processInfo] globallyUniqueString] stringByAppendingPathExtension:@"txt"]];
- NSString* actualPath = [NSTemporaryDirectory() stringByAppendingPathComponent:[[[NSProcessInfo processInfo] globallyUniqueString] stringByAppendingPathExtension:@"txt"]];
- if ([expectedBody writeToFile:expectedPath atomically:YES] && [actualBody writeToFile:actualPath atomically:YES]) {
- NSTask* task = [[NSTask alloc] init];
- [task setLaunchPath:@"/usr/bin/opendiff"];
- [task setArguments:@[expectedPath, actualPath]];
- [task launch];
- }
- }
-#endif
-#endif
- }
-
- CFRelease(actualResponse);
- }
- CFRelease(expectedResponse);
- }
- } else {
- GWS_DNOT_REACHED();
- }
- break;
- }
- }
- CFRelease(request);
- }
- } else {
- GWS_DNOT_REACHED();
- }
- _LogResult(@"");
- if (!success) {
- ++result;
- }
- }
- _ExecuteMainThreadRunLoopSources();
- }
-
- [self stop];
-
- _ExecuteMainThreadRunLoopSources();
- }
- return result;
-}
-
-@end
-
-#endif
diff --git a/local-webserver/src/ios/GCDWebServer/GCDWebServer/Core/GCDWebServerConnection.h b/local-webserver/src/ios/GCDWebServer/GCDWebServer/Core/GCDWebServerConnection.h
deleted file mode 100644
index d353c8b..0000000
--- a/local-webserver/src/ios/GCDWebServer/GCDWebServer/Core/GCDWebServerConnection.h
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- 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 "GCDWebServer.h"
-
-@class GCDWebServerHandler;
-
-/**
- * The GCDWebServerConnection class 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 made public so you can
- * subclass it to override some hooks. Use the GCDWebServerOption_ConnectionClass
- * option for GCDWebServer to install your custom subclass.
- *
- * @warning The GCDWebServerConnection retains the GCDWebServer until the
- * connection is closed.
- */
-@interface GCDWebServerConnection : NSObject
-
-/**
- * Returns the GCDWebServer that owns the connection.
- */
-@property(nonatomic, readonly) GCDWebServer* server;
-
-/**
- * Returns YES if the connection is using IPv6.
- */
-@property(nonatomic, readonly, getter=isUsingIPv6) BOOL usingIPv6;
-
-/**
- * Returns the address of the local peer (i.e. server) of the connection
- * as a raw "struct sockaddr".
- */
-@property(nonatomic, readonly) NSData* localAddressData;
-
-/**
- * Returns the address of the local peer (i.e. server) of the connection
- * as a string.
- */
-@property(nonatomic, readonly) NSString* localAddressString;
-
-/**
- * Returns the address of the remote peer (i.e. client) of the connection
- * as a raw "struct sockaddr".
- */
-@property(nonatomic, readonly) NSData* remoteAddressData;
-
-/**
- * Returns the address of the remote peer (i.e. client) of the connection
- * as a string.
- */
-@property(nonatomic, readonly) NSString* remoteAddressString;
-
-/**
- * Returns the total number of bytes received from the remote peer (i.e. client)
- * so far.
- */
-@property(nonatomic, readonly) NSUInteger totalBytesRead;
-
-/**
- * Returns the total number of bytes sent to the remote peer (i.e. client) so far.
- */
-@property(nonatomic, readonly) NSUInteger totalBytesWritten;
-
-@end
-
-/**
- * Hooks to customize the behavior of GCDWebServer HTTP connections.
- *
- * @warning These methods can be called on any GCD thread.
- * Be sure to also call "super" when overriding them.
- */
-@interface GCDWebServerConnection (Subclassing)
-
-/**
- * This method is called when the connection is opened.
- *
- * Return NO to reject the connection e.g. after validating the local
- * or remote address.
- */
-- (BOOL)open;
-
-/**
- * This method is called whenever data has been received
- * from the remote peer (i.e. client).
- *
- * @warning Do not attempt to modify this data.
- */
-- (void)didReadBytes:(const void*)bytes length:(NSUInteger)length;
-
-/**
- * This method is called whenever data has been sent
- * to the remote peer (i.e. client).
- *
- * @warning Do not attempt to modify this data.
- */
-- (void)didWriteBytes:(const void*)bytes length:(NSUInteger)length;
-
-/**
- * This method is called after the HTTP headers have been received to
- * allow replacing the request URL by another one.
- *
- * The default implementation returns the original URL.
- */
-- (NSURL*)rewriteRequestURL:(NSURL*)url withMethod:(NSString*)method headers:(NSDictionary*)headers;
-
-/**
- * Assuming a valid HTTP request was received, this method is called before
- * the request is processed.
- *
- * Return a non-nil GCDWebServerResponse to bypass the request processing entirely.
- *
- * The default implementation checks for HTTP authentication if applicable
- * and returns a barebone 401 status code response if authentication failed.
- */
-- (GCDWebServerResponse*)preflightRequest:(GCDWebServerRequest*)request;
-
-/**
- * Assuming a valid HTTP request was received and -preflightRequest: returned nil,
- * this method is called to process the request by executing the handler's
- * process block.
- */
-- (void)processRequest:(GCDWebServerRequest*)request completion:(GCDWebServerCompletionBlock)completion;
-
-/**
- * Assuming a valid HTTP request was received and either -preflightRequest:
- * or -processRequest:completion: returned a non-nil GCDWebServerResponse,
- * this method is called to override the response.
- *
- * You can either modify the current response and return it, or return a
- * completely new one.
- *
- * The default implementation replaces any response matching the "ETag" or
- * "Last-Modified-Date" header of the request by a barebone "Not-Modified" (304)
- * one.
- */
-- (GCDWebServerResponse*)overrideResponse:(GCDWebServerResponse*)response forRequest:(GCDWebServerRequest*)request;
-
-/**
- * This method is called if any error happens while validing or processing
- * the request or if no GCDWebServerResponse was generated during processing.
- *
- * @warning If the request was invalid (e.g. the HTTP headers were malformed),
- * the "request" argument will be nil.
- */
-- (void)abortRequest:(GCDWebServerRequest*)request withStatusCode:(NSInteger)statusCode;
-
-/**
- * Called when the connection is closed.
- */
-- (void)close;
-
-@end
diff --git a/local-webserver/src/ios/GCDWebServer/GCDWebServer/Core/GCDWebServerConnection.m b/local-webserver/src/ios/GCDWebServer/GCDWebServer/Core/GCDWebServerConnection.m
deleted file mode 100644
index d6c369e..0000000
--- a/local-webserver/src/ios/GCDWebServer/GCDWebServer/Core/GCDWebServerConnection.m
+++ /dev/null
@@ -1,851 +0,0 @@
-/*
- 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.
- */
-
-#if !__has_feature(objc_arc)
-#error GCDWebServer requires ARC
-#endif
-
-#import <TargetConditionals.h>
-#import <netdb.h>
-#ifdef __GCDWEBSERVER_ENABLE_TESTING__
-#import <libkern/OSAtomic.h>
-#endif
-
-#import "GCDWebServerPrivate.h"
-
-#define kHeadersReadCapacity (1 * 1024)
-#define kBodyReadCapacity (256 * 1024)
-
-typedef void (^ReadDataCompletionBlock)(BOOL success);
-typedef void (^ReadHeadersCompletionBlock)(NSData* extraData);
-typedef void (^ReadBodyCompletionBlock)(BOOL success);
-
-typedef void (^WriteDataCompletionBlock)(BOOL success);
-typedef void (^WriteHeadersCompletionBlock)(BOOL success);
-typedef void (^WriteBodyCompletionBlock)(BOOL success);
-
-static NSData* _CRLFData = nil;
-static NSData* _CRLFCRLFData = nil;
-static NSData* _continueData = nil;
-static NSData* _lastChunkData = nil;
-static NSString* _digestAuthenticationNonce = nil;
-#ifdef __GCDWEBSERVER_ENABLE_TESTING__
-static int32_t _connectionCounter = 0;
-#endif
-
-@interface GCDWebServerConnection () {
-@private
- GCDWebServer* _server;
- NSData* _localAddress;
- NSData* _remoteAddress;
- CFSocketNativeHandle _socket;
- NSUInteger _bytesRead;
- NSUInteger _bytesWritten;
- BOOL _virtualHEAD;
-
- CFHTTPMessageRef _requestMessage;
- GCDWebServerRequest* _request;
- GCDWebServerHandler* _handler;
- CFHTTPMessageRef _responseMessage;
- GCDWebServerResponse* _response;
- NSInteger _statusCode;
-
- BOOL _opened;
-#ifdef __GCDWEBSERVER_ENABLE_TESTING__
- NSUInteger _connectionIndex;
- NSString* _requestPath;
- int _requestFD;
- NSString* _responsePath;
- int _responseFD;
-#endif
-}
-@end
-
-@implementation GCDWebServerConnection (Read)
-
-- (void)_readData:(NSMutableData*)data withLength:(NSUInteger)length completionBlock:(ReadDataCompletionBlock)block {
- dispatch_read(_socket, length, kGCDWebServerGCDQueue, ^(dispatch_data_t buffer, int error) {
-
- @autoreleasepool {
- if (error == 0) {
- size_t size = dispatch_data_get_size(buffer);
- if (size > 0) {
- NSUInteger originalLength = data.length;
- dispatch_data_apply(buffer, ^bool(dispatch_data_t region, size_t chunkOffset, const void* chunkBytes, size_t chunkSize) {
- [data appendBytes:chunkBytes length:chunkSize];
- return true;
- });
- [self didReadBytes:((char*)data.bytes + originalLength) length:(data.length - originalLength)];
- block(YES);
- } else {
- if (_bytesRead > 0) {
- GWS_LOG_ERROR(@"No more data available on socket %i", _socket);
- } else {
- GWS_LOG_WARNING(@"No data received from socket %i", _socket);
- }
- block(NO);
- }
- } else {
- GWS_LOG_ERROR(@"Error while reading from socket %i: %s (%i)", _socket, strerror(error), error);
- block(NO);
- }
- }
-
- });
-}
-
-- (void)_readHeaders:(NSMutableData*)headersData withCompletionBlock:(ReadHeadersCompletionBlock)block {
- GWS_DCHECK(_requestMessage);
- [self _readData:headersData withLength:NSUIntegerMax completionBlock:^(BOOL success) {
-
- if (success) {
- NSRange range = [headersData rangeOfData:_CRLFCRLFData options:0 range:NSMakeRange(0, headersData.length)];
- if (range.location == NSNotFound) {
- [self _readHeaders:headersData withCompletionBlock:block];
- } else {
- NSUInteger length = range.location + range.length;
- if (CFHTTPMessageAppendBytes(_requestMessage, headersData.bytes, length)) {
- if (CFHTTPMessageIsHeaderComplete(_requestMessage)) {
- block([headersData subdataWithRange:NSMakeRange(length, headersData.length - length)]);
- } else {
- GWS_LOG_ERROR(@"Failed parsing request headers from socket %i", _socket);
- block(nil);
- }
- } else {
- GWS_LOG_ERROR(@"Failed appending request headers data from socket %i", _socket);
- block(nil);
- }
- }
- } else {
- block(nil);
- }
-
- }];
-}
-
-- (void)_readBodyWithRemainingLength:(NSUInteger)length completionBlock:(ReadBodyCompletionBlock)block {
- GWS_DCHECK([_request hasBody] && ![_request usesChunkedTransferEncoding]);
- NSMutableData* bodyData = [[NSMutableData alloc] initWithCapacity:kBodyReadCapacity];
- [self _readData:bodyData withLength:length completionBlock:^(BOOL success) {
-
- if (success) {
- if (bodyData.length <= length) {
- NSError* error = nil;
- if ([_request performWriteData:bodyData error:&error]) {
- NSUInteger remainingLength = length - bodyData.length;
- if (remainingLength) {
- [self _readBodyWithRemainingLength:remainingLength completionBlock:block];
- } else {
- block(YES);
- }
- } else {
- GWS_LOG_ERROR(@"Failed writing request body on socket %i: %@", _socket, error);
- block(NO);
- }
- } else {
- GWS_LOG_ERROR(@"Unexpected extra content reading request body on socket %i", _socket);
- block(NO);
- GWS_DNOT_REACHED();
- }
- } else {
- block(NO);
- }
-
- }];
-}
-
-static inline NSUInteger _ScanHexNumber(const void* bytes, NSUInteger size) {
- char buffer[size + 1];
- bcopy(bytes, buffer, size);
- buffer[size] = 0;
- char* end = NULL;
- long result = strtol(buffer, &end, 16);
- return ((end != NULL) && (*end == 0) && (result >= 0) ? result : NSNotFound);
-}
-
-- (void)_readNextBodyChunk:(NSMutableData*)chunkData completionBlock:(ReadBodyCompletionBlock)block {
- GWS_DCHECK([_request hasBody] && [_request usesChunkedTransferEncoding]);
-
- while (1) {
- NSRange range = [chunkData rangeOfData:_CRLFData options:0 range:NSMakeRange(0, chunkData.length)];
- if (range.location == NSNotFound) {
- break;
- }
- NSRange extensionRange = [chunkData rangeOfData:[NSData dataWithBytes:";" length:1] options:0 range:NSMakeRange(0, range.location)]; // Ignore chunk extensions
- NSUInteger length = _ScanHexNumber((char*)chunkData.bytes, extensionRange.location != NSNotFound ? extensionRange.location : range.location);
- if (length != NSNotFound) {
- if (length) {
- if (chunkData.length < range.location + range.length + length + 2) {
- break;
- }
- const char* ptr = (char*)chunkData.bytes + range.location + range.length + length;
- if ((*ptr == '\r') && (*(ptr + 1) == '\n')) {
- NSError* error = nil;
- if ([_request performWriteData:[chunkData subdataWithRange:NSMakeRange(range.location + range.length, length)] error:&error]) {
- [chunkData replaceBytesInRange:NSMakeRange(0, range.location + range.length + length + 2) withBytes:NULL length:0];
- } else {
- GWS_LOG_ERROR(@"Failed writing request body on socket %i: %@", _socket, error);
- block(NO);
- return;
- }
- } else {
- GWS_LOG_ERROR(@"Missing terminating CRLF sequence for chunk reading request body on socket %i", _socket);
- block(NO);
- return;
- }
- } else {
- NSRange trailerRange = [chunkData rangeOfData:_CRLFCRLFData options:0 range:NSMakeRange(range.location, chunkData.length - range.location)]; // Ignore trailers
- if (trailerRange.location != NSNotFound) {
- block(YES);
- return;
- }
- }
- } else {
- GWS_LOG_ERROR(@"Invalid chunk length reading request body on socket %i", _socket);
- block(NO);
- return;
- }
- }
-
- [self _readData:chunkData withLength:NSUIntegerMax completionBlock:^(BOOL success) {
-
- if (success) {
- [self _readNextBodyChunk:chunkData completionBlock:block];
- } else {
- block(NO);
- }
-
- }];
-}
-
-@end
-
-@implementation GCDWebServerConnection (Write)
-
-- (void)_writeData:(NSData*)data withCompletionBlock:(WriteDataCompletionBlock)block {
- dispatch_data_t buffer = dispatch_data_create(data.bytes, data.length, kGCDWebServerGCDQueue, ^{
- [data self]; // Keeps ARC from releasing data too early
- });
- dispatch_write(_socket, buffer, kGCDWebServerGCDQueue, ^(dispatch_data_t remainingData, int error) {
-
- @autoreleasepool {
- if (error == 0) {
- GWS_DCHECK(remainingData == NULL);
- [self didWriteBytes:data.bytes length:data.length];
- block(YES);
- } else {
- GWS_LOG_ERROR(@"Error while writing to socket %i: %s (%i)", _socket, strerror(error), error);
- block(NO);
- }
- }
-
- });
-#if !OS_OBJECT_USE_OBJC_RETAIN_RELEASE
- dispatch_release(buffer);
-#endif
-}
-
-- (void)_writeHeadersWithCompletionBlock:(WriteHeadersCompletionBlock)block {
- GWS_DCHECK(_responseMessage);
- CFDataRef data = CFHTTPMessageCopySerializedMessage(_responseMessage);
- [self _writeData:(__bridge NSData*)data withCompletionBlock:block];
- CFRelease(data);
-}
-
-- (void)_writeBodyWithCompletionBlock:(WriteBodyCompletionBlock)block {
- GWS_DCHECK([_response hasBody]);
- [_response performReadDataWithCompletion:^(NSData* data, NSError* error) {
-
- if (data) {
- if (data.length) {
- if (_response.usesChunkedTransferEncoding) {
- const char* hexString = [[NSString stringWithFormat:@"%lx", (unsigned long)data.length] UTF8String];
- size_t hexLength = strlen(hexString);
- NSData* chunk = [NSMutableData dataWithLength:(hexLength + 2 + data.length + 2)];
- if (chunk == nil) {
- GWS_LOG_ERROR(@"Failed allocating memory for response body chunk for socket %i: %@", _socket, error);
- block(NO);
- return;
- }
- char* ptr = (char*)[(NSMutableData*)chunk mutableBytes];
- bcopy(hexString, ptr, hexLength);
- ptr += hexLength;
- *ptr++ = '\r';
- *ptr++ = '\n';
- bcopy(data.bytes, ptr, data.length);
- ptr += data.length;
- *ptr++ = '\r';
- *ptr = '\n';
- data = chunk;
- }
- [self _writeData:data withCompletionBlock:^(BOOL success) {
-
- if (success) {
- [self _writeBodyWithCompletionBlock:block];
- } else {
- block(NO);
- }
-
- }];
- } else {
- if (_response.usesChunkedTransferEncoding) {
- [self _writeData:_lastChunkData withCompletionBlock:^(BOOL success) {
-
- block(success);
-
- }];
- } else {
- block(YES);
- }
- }
- } else {
- GWS_LOG_ERROR(@"Failed reading response body for socket %i: %@", _socket, error);
- block(NO);
- }
-
- }];
-}
-
-@end
-
-@implementation GCDWebServerConnection
-
-@synthesize server=_server, localAddressData=_localAddress, remoteAddressData=_remoteAddress, totalBytesRead=_bytesRead, totalBytesWritten=_bytesWritten;
-
-+ (void)initialize {
- if (_CRLFData == nil) {
- _CRLFData = [[NSData alloc] initWithBytes:"\r\n" length:2];
- GWS_DCHECK(_CRLFData);
- }
- if (_CRLFCRLFData == nil) {
- _CRLFCRLFData = [[NSData alloc] initWithBytes:"\r\n\r\n" length:4];
- GWS_DCHECK(_CRLFCRLFData);
- }
- if (_continueData == nil) {
- CFHTTPMessageRef message = CFHTTPMessageCreateResponse(kCFAllocatorDefault, 100, NULL, kCFHTTPVersion1_1);
- _continueData = CFBridgingRelease(CFHTTPMessageCopySerializedMessage(message));
- CFRelease(message);
- GWS_DCHECK(_continueData);
- }
- if (_lastChunkData == nil) {
- _lastChunkData = [[NSData alloc] initWithBytes:"0\r\n\r\n" length:5];
- }
- if (_digestAuthenticationNonce == nil) {
- CFUUIDRef uuid = CFUUIDCreate(kCFAllocatorDefault);
- _digestAuthenticationNonce = GCDWebServerComputeMD5Digest(@"%@", CFBridgingRelease(CFUUIDCreateString(kCFAllocatorDefault, uuid)));
- CFRelease(uuid);
- }
-}
-
-- (BOOL)isUsingIPv6 {
- const struct sockaddr* localSockAddr = _localAddress.bytes;
- return (localSockAddr->sa_family == AF_INET6);
-}
-
-- (void)_initializeResponseHeadersWithStatusCode:(NSInteger)statusCode {
- _statusCode = statusCode;
- _responseMessage = CFHTTPMessageCreateResponse(kCFAllocatorDefault, statusCode, NULL, kCFHTTPVersion1_1);
- CFHTTPMessageSetHeaderFieldValue(_responseMessage, CFSTR("Connection"), CFSTR("Close"));
- CFHTTPMessageSetHeaderFieldValue(_responseMessage, CFSTR("Server"), (__bridge CFStringRef)_server.serverName);
- CFHTTPMessageSetHeaderFieldValue(_responseMessage, CFSTR("Date"), (__bridge CFStringRef)GCDWebServerFormatRFC822([NSDate date]));
-}
-
-- (void)_startProcessingRequest {
- GWS_DCHECK(_responseMessage == NULL);
-
- GCDWebServerResponse* preflightResponse = [self preflightRequest:_request];
- if (preflightResponse) {
- [self _finishProcessingRequest:preflightResponse];
- } else {
- [self processRequest:_request completion:^(GCDWebServerResponse* processResponse) {
- [self _finishProcessingRequest:processResponse];
- }];
- }
-}
-
-// http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
-- (void)_finishProcessingRequest:(GCDWebServerResponse*)response {
- GWS_DCHECK(_responseMessage == NULL);
- BOOL hasBody = NO;
-
- if (response) {
- response = [self overrideResponse:response forRequest:_request];
- }
- if (response) {
- if ([response hasBody]) {
- [response prepareForReading];
- hasBody = !_virtualHEAD;
- }
- NSError* error = nil;
- if (hasBody && ![response performOpen:&error]) {
- GWS_LOG_ERROR(@"Failed opening response body for socket %i: %@", _socket, error);
- } else {
- _response = response;
- }
- }
-
- if (_response) {
- [self _initializeResponseHeadersWithStatusCode:_response.statusCode];
- if (_response.lastModifiedDate) {
- CFHTTPMessageSetHeaderFieldValue(_responseMessage, CFSTR("Last-Modified"), (__bridge CFStringRef)GCDWebServerFormatRFC822(_response.lastModifiedDate));
- }
- if (_response.eTag) {
- CFHTTPMessageSetHeaderFieldValue(_responseMessage, CFSTR("ETag"), (__bridge CFStringRef)_response.eTag);
- }
- if ((_response.statusCode >= 200) && (_response.statusCode < 300)) {
- if (_response.cacheControlMaxAge > 0) {
- CFHTTPMessageSetHeaderFieldValue(_responseMessage, CFSTR("Cache-Control"), (__bridge CFStringRef)[NSString stringWithFormat:@"max-age=%i, public", (int)_response.cacheControlMaxAge]);
- } else {
- CFHTTPMessageSetHeaderFieldValue(_responseMessage, CFSTR("Cache-Control"), CFSTR("no-cache"));
- }
- }
- if (_response.contentType != nil) {
- CFHTTPMessageSetHeaderFieldValue(_responseMessage, CFSTR("Content-Type"), (__bridge CFStringRef)GCDWebServerNormalizeHeaderValue(_response.contentType));
- }
- if (_response.contentLength != NSUIntegerMax) {
- CFHTTPMessageSetHeaderFieldValue(_responseMessage, CFSTR("Content-Length"), (__bridge CFStringRef)[NSString stringWithFormat:@"%lu", (unsigned long)_response.contentLength]);
- }
- if (_response.usesChunkedTransferEncoding) {
- CFHTTPMessageSetHeaderFieldValue(_responseMessage, CFSTR("Transfer-Encoding"), CFSTR("chunked"));
- }
- [_response.additionalHeaders enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL* stop) {
- CFHTTPMessageSetHeaderFieldValue(_responseMessage, (__bridge CFStringRef)key, (__bridge CFStringRef)obj);
- }];
- [self _writeHeadersWithCompletionBlock:^(BOOL success) {
-
- if (success) {
- if (hasBody) {
- [self _writeBodyWithCompletionBlock:^(BOOL successInner) {
-
- [_response performClose]; // TODO: There's nothing we can do on failure as headers have already been sent
-
- }];
- }
- } else if (hasBody) {
- [_response performClose];
- }
-
- }];
- } else {
- [self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError];
- }
-
-}
-
-- (void)_readBodyWithLength:(NSUInteger)length initialData:(NSData*)initialData {
- NSError* error = nil;
- if (![_request performOpen:&error]) {
- GWS_LOG_ERROR(@"Failed opening request body for socket %i: %@", _socket, error);
- [self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError];
- return;
- }
-
- if (initialData.length) {
- if (![_request performWriteData:initialData error:&error]) {
- GWS_LOG_ERROR(@"Failed writing request body on socket %i: %@", _socket, error);
- if (![_request performClose:&error]) {
- GWS_LOG_ERROR(@"Failed closing request body for socket %i: %@", _socket, error);
- }
- [self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError];
- return;
- }
- length -= initialData.length;
- }
-
- if (length) {
- [self _readBodyWithRemainingLength:length completionBlock:^(BOOL success) {
-
- NSError* localError = nil;
- if ([_request performClose:&localError]) {
- [self _startProcessingRequest];
- } else {
- GWS_LOG_ERROR(@"Failed closing request body for socket %i: %@", _socket, error);
- [self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError];
- }
-
- }];
- } else {
- if ([_request performClose:&error]) {
- [self _startProcessingRequest];
- } else {
- GWS_LOG_ERROR(@"Failed closing request body for socket %i: %@", _socket, error);
- [self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError];
- }
- }
-}
-
-- (void)_readChunkedBodyWithInitialData:(NSData*)initialData {
- NSError* error = nil;
- if (![_request performOpen:&error]) {
- GWS_LOG_ERROR(@"Failed opening request body for socket %i: %@", _socket, error);
- [self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError];
- return;
- }
-
- NSMutableData* chunkData = [[NSMutableData alloc] initWithData:initialData];
- [self _readNextBodyChunk:chunkData completionBlock:^(BOOL success) {
-
- NSError* localError = nil;
- if ([_request performClose:&localError]) {
- [self _startProcessingRequest];
- } else {
- GWS_LOG_ERROR(@"Failed closing request body for socket %i: %@", _socket, error);
- [self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError];
- }
-
- }];
-}
-
-- (void)_readRequestHeaders {
- _requestMessage = CFHTTPMessageCreateEmpty(kCFAllocatorDefault, true);
- NSMutableData* headersData = [[NSMutableData alloc] initWithCapacity:kHeadersReadCapacity];
- [self _readHeaders:headersData withCompletionBlock:^(NSData* extraData) {
-
- if (extraData) {
- NSString* requestMethod = CFBridgingRelease(CFHTTPMessageCopyRequestMethod(_requestMessage)); // Method verbs are case-sensitive and uppercase
- if (_server.shouldAutomaticallyMapHEADToGET && [requestMethod isEqualToString:@"HEAD"]) {
- requestMethod = @"GET";
- _virtualHEAD = YES;
- }
- NSDictionary* requestHeaders = CFBridgingRelease(CFHTTPMessageCopyAllHeaderFields(_requestMessage)); // Header names are case-insensitive but CFHTTPMessageCopyAllHeaderFields() will standardize the common ones
- NSURL* requestURL = CFBridgingRelease(CFHTTPMessageCopyRequestURL(_requestMessage));
- if (requestURL) {
- requestURL = [self rewriteRequestURL:requestURL withMethod:requestMethod headers:requestHeaders];
- GWS_DCHECK(requestURL);
- }
- NSString* requestPath = requestURL ? GCDWebServerUnescapeURLString(CFBridgingRelease(CFURLCopyPath((CFURLRef)requestURL))) : nil; // Don't use -[NSURL path] which strips the ending slash
- NSString* queryString = requestURL ? CFBridgingRelease(CFURLCopyQueryString((CFURLRef)requestURL, NULL)) : nil; // Don't use -[NSURL query] to make sure query is not unescaped;
- NSDictionary* requestQuery = queryString ? GCDWebServerParseURLEncodedForm(queryString) : @{};
- if (requestMethod && requestURL && requestHeaders && requestPath && requestQuery) {
- for (_handler in _server.handlers) {
- _request = _handler.matchBlock(requestMethod, requestURL, requestHeaders, requestPath, requestQuery);
- if (_request) {
- break;
- }
- }
- if (_request) {
- _request.localAddressData = self.localAddressData;
- _request.remoteAddressData = self.remoteAddressData;
- if ([_request hasBody]) {
- [_request prepareForWriting];
- if (_request.usesChunkedTransferEncoding || (extraData.length <= _request.contentLength)) {
- NSString* expectHeader = [requestHeaders objectForKey:@"Expect"];
- if (expectHeader) {
- if ([expectHeader caseInsensitiveCompare:@"100-continue"] == NSOrderedSame) { // TODO: Actually validate request before continuing
- [self _writeData:_continueData withCompletionBlock:^(BOOL success) {
-
- if (success) {
- if (_request.usesChunkedTransferEncoding) {
- [self _readChunkedBodyWithInitialData:extraData];
- } else {
- [self _readBodyWithLength:_request.contentLength initialData:extraData];
- }
- }
-
- }];
- } else {
- GWS_LOG_ERROR(@"Unsupported 'Expect' / 'Content-Length' header combination on socket %i", _socket);
- [self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_ExpectationFailed];
- }
- } else {
- if (_request.usesChunkedTransferEncoding) {
- [self _readChunkedBodyWithInitialData:extraData];
- } else {
- [self _readBodyWithLength:_request.contentLength initialData:extraData];
- }
- }
- } else {
- GWS_LOG_ERROR(@"Unexpected 'Content-Length' header value on socket %i", _socket);
- [self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_BadRequest];
- }
- } else {
- [self _startProcessingRequest];
- }
- } else {
- _request = [[GCDWebServerRequest alloc] initWithMethod:requestMethod url:requestURL headers:requestHeaders path:requestPath query:requestQuery];
- GWS_DCHECK(_request);
- [self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_MethodNotAllowed];
- }
- } else {
- [self abortRequest:nil withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError];
- GWS_DNOT_REACHED();
- }
- } else {
- [self abortRequest:nil withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError];
- }
-
- }];
-}
-
-- (id)initWithServer:(GCDWebServer*)server localAddress:(NSData*)localAddress remoteAddress:(NSData*)remoteAddress socket:(CFSocketNativeHandle)socket {
- if ((self = [super init])) {
- _server = server;
- _localAddress = localAddress;
- _remoteAddress = remoteAddress;
- _socket = socket;
- GWS_LOG_DEBUG(@"Did open connection on socket %i", _socket);
-
- [_server willStartConnection:self];
-
- if (![self open]) {
- close(_socket);
- return nil;
- }
- _opened = YES;
-
- [self _readRequestHeaders];
- }
- return self;
-}
-
-- (NSString*)localAddressString {
- return GCDWebServerStringFromSockAddr(_localAddress.bytes, YES);
-}
-
-- (NSString*)remoteAddressString {
- return GCDWebServerStringFromSockAddr(_remoteAddress.bytes, YES);
-}
-
-- (void)dealloc {
- int result = close(_socket);
- if (result != 0) {
- GWS_LOG_ERROR(@"Failed closing socket %i for connection: %s (%i)", _socket, strerror(errno), errno);
- } else {
- GWS_LOG_DEBUG(@"Did close connection on socket %i", _socket);
- }
-
- if (_opened) {
- [self close];
- }
-
- [_server didEndConnection:self];
-
- if (_requestMessage) {
- CFRelease(_requestMessage);
- }
-
- if (_responseMessage) {
- CFRelease(_responseMessage);
- }
-}
-
-@end
-
-@implementation GCDWebServerConnection (Subclassing)
-
-- (BOOL)open {
-#ifdef __GCDWEBSERVER_ENABLE_TESTING__
- if (_server.recordingEnabled) {
- _connectionIndex = OSAtomicIncrement32(&_connectionCounter);
-
- _requestPath = [NSTemporaryDirectory() stringByAppendingPathComponent:[[NSProcessInfo processInfo] globallyUniqueString]];
- _requestFD = open([_requestPath fileSystemRepresentation], O_CREAT | O_TRUNC | O_WRONLY, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
- GWS_DCHECK(_requestFD > 0);
-
- _responsePath = [NSTemporaryDirectory() stringByAppendingPathComponent:[[NSProcessInfo processInfo] globallyUniqueString]];
- _responseFD = open([_responsePath fileSystemRepresentation], O_CREAT | O_TRUNC | O_WRONLY, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
- GWS_DCHECK(_responseFD > 0);
- }
-#endif
-
- return YES;
-}
-
-- (void)didReadBytes:(const void*)bytes length:(NSUInteger)length {
- GWS_LOG_DEBUG(@"Connection received %lu bytes on socket %i", (unsigned long)length, _socket);
- _bytesRead += length;
-
-#ifdef __GCDWEBSERVER_ENABLE_TESTING__
- if ((_requestFD > 0) && (write(_requestFD, bytes, length) != (ssize_t)length)) {
- GWS_LOG_ERROR(@"Failed recording request data: %s (%i)", strerror(errno), errno);
- close(_requestFD);
- _requestFD = 0;
- }
-#endif
-}
-
-- (void)didWriteBytes:(const void*)bytes length:(NSUInteger)length {
- GWS_LOG_DEBUG(@"Connection sent %lu bytes on socket %i", (unsigned long)length, _socket);
- _bytesWritten += length;
-
-#ifdef __GCDWEBSERVER_ENABLE_TESTING__
- if ((_responseFD > 0) && (write(_responseFD, bytes, length) != (ssize_t)length)) {
- GWS_LOG_ERROR(@"Failed recording response data: %s (%i)", strerror(errno), errno);
- close(_responseFD);
- _responseFD = 0;
- }
-#endif
-}
-
-- (NSURL*)rewriteRequestURL:(NSURL*)url withMethod:(NSString*)method headers:(NSDictionary*)headers {
- return url;
-}
-
-// https://tools.ietf.org/html/rfc2617
-- (GCDWebServerResponse*)preflightRequest:(GCDWebServerRequest*)request {
- GWS_LOG_DEBUG(@"Connection on socket %i preflighting request \"%@ %@\" with %lu bytes body", _socket, _virtualHEAD ? @"HEAD" : _request.method, _request.path, (unsigned long)_bytesRead);
- GCDWebServerResponse* response = nil;
- if (_server.authenticationBasicAccounts) {
- __block BOOL authenticated = NO;
- NSString* authorizationHeader = [request.headers objectForKey:@"Authorization"];
- if ([authorizationHeader hasPrefix:@"Basic "]) {
- NSString* basicAccount = [authorizationHeader substringFromIndex:6];
- [_server.authenticationBasicAccounts enumerateKeysAndObjectsUsingBlock:^(NSString* username, NSString* digest, BOOL* stop) {
- if ([basicAccount isEqualToString:digest]) {
- authenticated = YES;
- *stop = YES;
- }
- }];
- }
- if (!authenticated) {
- response = [GCDWebServerResponse responseWithStatusCode:kGCDWebServerHTTPStatusCode_Unauthorized];
- [response setValue:[NSString stringWithFormat:@"Basic realm=\"%@\"", _server.authenticationRealm] forAdditionalHeader:@"WWW-Authenticate"];
- }
- } else if (_server.authenticationDigestAccounts) {
- BOOL authenticated = NO;
- BOOL isStaled = NO;
- NSString* authorizationHeader = [request.headers objectForKey:@"Authorization"];
- if ([authorizationHeader hasPrefix:@"Digest "]) {
- NSString* realm = GCDWebServerExtractHeaderValueParameter(authorizationHeader, @"realm");
- if ([realm isEqualToString:_server.authenticationRealm]) {
- NSString* nonce = GCDWebServerExtractHeaderValueParameter(authorizationHeader, @"nonce");
- if ([nonce isEqualToString:_digestAuthenticationNonce]) {
- NSString* username = GCDWebServerExtractHeaderValueParameter(authorizationHeader, @"username");
- NSString* uri = GCDWebServerExtractHeaderValueParameter(authorizationHeader, @"uri");
- NSString* actualResponse = GCDWebServerExtractHeaderValueParameter(authorizationHeader, @"response");
- NSString* ha1 = [_server.authenticationDigestAccounts objectForKey:username];
- NSString* ha2 = GCDWebServerComputeMD5Digest(@"%@:%@", request.method, uri); // We cannot use "request.path" as the query string is required
- NSString* expectedResponse = GCDWebServerComputeMD5Digest(@"%@:%@:%@", ha1, _digestAuthenticationNonce, ha2);
- if ([actualResponse isEqualToString:expectedResponse]) {
- authenticated = YES;
- }
- } else if (nonce.length) {
- isStaled = YES;
- }
- }
- }
- if (!authenticated) {
- response = [GCDWebServerResponse responseWithStatusCode:kGCDWebServerHTTPStatusCode_Unauthorized];
- [response setValue:[NSString stringWithFormat:@"Digest realm=\"%@\", nonce=\"%@\"%@", _server.authenticationRealm, _digestAuthenticationNonce, isStaled ? @", stale=TRUE" : @""] forAdditionalHeader:@"WWW-Authenticate"]; // TODO: Support Quality of Protection ("qop")
- }
- }
- return response;
-}
-
-- (void)processRequest:(GCDWebServerRequest*)request completion:(GCDWebServerCompletionBlock)completion {
- GWS_LOG_DEBUG(@"Connection on socket %i processing request \"%@ %@\" with %lu bytes body", _socket, _virtualHEAD ? @"HEAD" : _request.method, _request.path, (unsigned long)_bytesRead);
- @try {
- _handler.asyncProcessBlock(request, [completion copy]);
- }
- @catch (NSException* exception) {
- GWS_LOG_EXCEPTION(exception);
- }
-}
-
-// http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.25
-// http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.26
-static inline BOOL _CompareResources(NSString* responseETag, NSString* requestETag, NSDate* responseLastModified, NSDate* requestLastModified) {
- if (requestLastModified && responseLastModified) {
- if ([responseLastModified compare:requestLastModified] != NSOrderedDescending) {
- return YES;
- }
- }
- if (requestETag && responseETag) { // Per the specs "If-None-Match" must be checked after "If-Modified-Since"
- if ([requestETag isEqualToString:@"*"]) {
- return YES;
- }
- if ([responseETag isEqualToString:requestETag]) {
- return YES;
- }
- }
- return NO;
-}
-
-- (GCDWebServerResponse*)overrideResponse:(GCDWebServerResponse*)response forRequest:(GCDWebServerRequest*)request {
- if ((response.statusCode >= 200) && (response.statusCode < 300) && _CompareResources(response.eTag, request.ifNoneMatch, response.lastModifiedDate, request.ifModifiedSince)) {
- NSInteger code = [request.method isEqualToString:@"HEAD"] || [request.method isEqualToString:@"GET"] ? kGCDWebServerHTTPStatusCode_NotModified : kGCDWebServerHTTPStatusCode_PreconditionFailed;
- GCDWebServerResponse* newResponse = [GCDWebServerResponse responseWithStatusCode:code];
- newResponse.cacheControlMaxAge = response.cacheControlMaxAge;
- newResponse.lastModifiedDate = response.lastModifiedDate;
- newResponse.eTag = response.eTag;
- GWS_DCHECK(newResponse);
- return newResponse;
- }
- return response;
-}
-
-- (void)abortRequest:(GCDWebServerRequest*)request withStatusCode:(NSInteger)statusCode {
- GWS_DCHECK(_responseMessage == NULL);
- GWS_DCHECK((statusCode >= 400) && (statusCode < 600));
- [self _initializeResponseHeadersWithStatusCode:statusCode];
- [self _writeHeadersWithCompletionBlock:^(BOOL success) {
- ; // Nothing more to do
- }];
- GWS_LOG_DEBUG(@"Connection aborted with status code %i on socket %i", (int)statusCode, _socket);
-}
-
-- (void)close {
-#ifdef __GCDWEBSERVER_ENABLE_TESTING__
- if (_requestPath) {
- BOOL success = NO;
- NSError* error = nil;
- if (_requestFD > 0) {
- close(_requestFD);
- NSString* name = [NSString stringWithFormat:@"%03lu-%@.request", (unsigned long)_connectionIndex, _virtualHEAD ? @"HEAD" : _request.method];
- success = [[NSFileManager defaultManager] moveItemAtPath:_requestPath toPath:[[[NSFileManager defaultManager] currentDirectoryPath] stringByAppendingPathComponent:name] error:&error];
- }
- if (!success) {
- GWS_LOG_ERROR(@"Failed saving recorded request: %@", error);
- GWS_DNOT_REACHED();
- }
- unlink([_requestPath fileSystemRepresentation]);
- }
-
- if (_responsePath) {
- BOOL success = NO;
- NSError* error = nil;
- if (_responseFD > 0) {
- close(_responseFD);
- NSString* name = [NSString stringWithFormat:@"%03lu-%i.response", (unsigned long)_connectionIndex, (int)_statusCode];
- success = [[NSFileManager defaultManager] moveItemAtPath:_responsePath toPath:[[[NSFileManager defaultManager] currentDirectoryPath] stringByAppendingPathComponent:name] error:&error];
- }
- if (!success) {
- GWS_LOG_ERROR(@"Failed saving recorded response: %@", error);
- GWS_DNOT_REACHED();
- }
- unlink([_responsePath fileSystemRepresentation]);
- }
-#endif
-
- if (_request) {
- GWS_LOG_VERBOSE(@"[%@] %@ %i \"%@ %@\" (%lu | %lu)", self.localAddressString, self.remoteAddressString, (int)_statusCode, _virtualHEAD ? @"HEAD" : _request.method, _request.path, (unsigned long)_bytesRead, (unsigned long)_bytesWritten);
- } else {
- GWS_LOG_VERBOSE(@"[%@] %@ %i \"(invalid request)\" (%lu | %lu)", self.localAddressString, self.remoteAddressString, (int)_statusCode, (unsigned long)_bytesRead, (unsigned long)_bytesWritten);
- }
-}
-
-@end
diff --git a/local-webserver/src/ios/GCDWebServer/GCDWebServer/Core/GCDWebServerFunctions.h b/local-webserver/src/ios/GCDWebServer/GCDWebServer/Core/GCDWebServerFunctions.h
deleted file mode 100644
index e5be05c..0000000
--- a/local-webserver/src/ios/GCDWebServer/GCDWebServer/Core/GCDWebServerFunctions.h
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- 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 <Foundation/Foundation.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * Converts a file extension to the corresponding MIME type.
- * If there is no match, "application/octet-stream" is returned.
- */
-NSString* GCDWebServerGetMimeTypeForExtension(NSString* extension);
-
-/**
- * Add percent-escapes to a string so it can be used in a URL.
- * The legal characters ":@/?&=+" are also escaped to ensure compatibility
- * with URL encoded forms and URL queries.
- */
-NSString* GCDWebServerEscapeURLString(NSString* string);
-
-/**
- * Unescapes a URL percent-encoded string.
- */
-NSString* GCDWebServerUnescapeURLString(NSString* string);
-
-/**
- * Extracts the unescaped names and values from an
- * "application/x-www-form-urlencoded" form.
- * http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1
- */
-NSDictionary* GCDWebServerParseURLEncodedForm(NSString* form);
-
-/**
- * On OS X, returns the IPv4 or IPv6 address as a string of the primary
- * connected service or nil if not available.
- *
- * On iOS, returns the IPv4 or IPv6 address as a string of the WiFi
- * interface if connected or nil otherwise.
- */
-NSString* GCDWebServerGetPrimaryIPAddress(BOOL useIPv6);
-
-/**
- * Converts a date into a string using RFC822 formatting.
- * https://tools.ietf.org/html/rfc822#section-5
- * https://tools.ietf.org/html/rfc1123#section-5.2.14
- */
-NSString* GCDWebServerFormatRFC822(NSDate* date);
-
-/**
- * Converts a RFC822 formatted string into a date.
- * https://tools.ietf.org/html/rfc822#section-5
- * https://tools.ietf.org/html/rfc1123#section-5.2.14
- *
- * @warning Timezones other than GMT are not supported by this function.
- */
-NSDate* GCDWebServerParseRFC822(NSString* string);
-
-/**
- * Converts a date into a string using IOS 8601 formatting.
- * http://tools.ietf.org/html/rfc3339#section-5.6
- */
-NSString* GCDWebServerFormatISO8601(NSDate* date);
-
-/**
- * Converts a ISO 8601 formatted string into a date.
- * http://tools.ietf.org/html/rfc3339#section-5.6
- *
- * @warning Only "calendar" variant is supported at this time and timezones
- * other than GMT are not supported either.
- */
-NSDate* GCDWebServerParseISO8601(NSString* string);
-
-#ifdef __cplusplus
-}
-#endif
diff --git a/local-webserver/src/ios/GCDWebServer/GCDWebServer/Core/GCDWebServerFunctions.m b/local-webserver/src/ios/GCDWebServer/GCDWebServer/Core/GCDWebServerFunctions.m
deleted file mode 100644
index 25e41ca..0000000
--- a/local-webserver/src/ios/GCDWebServer/GCDWebServer/Core/GCDWebServerFunctions.m
+++ /dev/null
@@ -1,307 +0,0 @@
-/*
- 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.
- */
-
-#if !__has_feature(objc_arc)
-#error GCDWebServer requires ARC
-#endif
-
-#import <TargetConditionals.h>
-#if TARGET_OS_IPHONE
-#import <MobileCoreServices/MobileCoreServices.h>
-#else
-#import <SystemConfiguration/SystemConfiguration.h>
-#endif
-#import <CommonCrypto/CommonDigest.h>
-
-#import <ifaddrs.h>
-#import <net/if.h>
-#import <netdb.h>
-
-#import "GCDWebServerPrivate.h"
-
-static NSDateFormatter* _dateFormatterRFC822 = nil;
-static NSDateFormatter* _dateFormatterISO8601 = nil;
-static dispatch_queue_t _dateFormatterQueue = NULL;
-
-// TODO: Handle RFC 850 and ANSI C's asctime() format
-void GCDWebServerInitializeFunctions() {
- GWS_DCHECK([NSThread isMainThread]); // NSDateFormatter should be initialized on main thread
- if (_dateFormatterRFC822 == nil) {
- _dateFormatterRFC822 = [[NSDateFormatter alloc] init];
- _dateFormatterRFC822.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
- _dateFormatterRFC822.dateFormat = @"EEE',' dd MMM yyyy HH':'mm':'ss 'GMT'";
- _dateFormatterRFC822.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
- GWS_DCHECK(_dateFormatterRFC822);
- }
- if (_dateFormatterISO8601 == nil) {
- _dateFormatterISO8601 = [[NSDateFormatter alloc] init];
- _dateFormatterISO8601.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
- _dateFormatterISO8601.dateFormat = @"yyyy-MM-dd'T'HH:mm:ss'+00:00'";
- _dateFormatterISO8601.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
- GWS_DCHECK(_dateFormatterISO8601);
- }
- if (_dateFormatterQueue == NULL) {
- _dateFormatterQueue = dispatch_queue_create(NULL, DISPATCH_QUEUE_SERIAL);
- GWS_DCHECK(_dateFormatterQueue);
- }
-}
-
-NSString* GCDWebServerNormalizeHeaderValue(NSString* value) {
- if (value) {
- NSRange range = [value rangeOfString:@";"]; // Assume part before ";" separator is case-insensitive
- if (range.location != NSNotFound) {
- value = [[[value substringToIndex:range.location] lowercaseString] stringByAppendingString:[value substringFromIndex:range.location]];
- } else {
- value = [value lowercaseString];
- }
- }
- return value;
-}
-
-NSString* GCDWebServerTruncateHeaderValue(NSString* value) {
- NSRange range = [value rangeOfString:@";"];
- return range.location != NSNotFound ? [value substringToIndex:range.location] : value;
-}
-
-NSString* GCDWebServerExtractHeaderValueParameter(NSString* value, NSString* name) {
- NSString* parameter = nil;
- NSScanner* scanner = [[NSScanner alloc] initWithString:value];
- [scanner setCaseSensitive:NO]; // Assume parameter names are case-insensitive
- NSString* string = [NSString stringWithFormat:@"%@=", name];
- if ([scanner scanUpToString:string intoString:NULL]) {
- [scanner scanString:string intoString:NULL];
- if ([scanner scanString:@"\"" intoString:NULL]) {
- [scanner scanUpToString:@"\"" intoString:¶meter];
- } else {
- [scanner scanUpToCharactersFromSet:[NSCharacterSet whitespaceCharacterSet] intoString:¶meter];
- }
- }
- return parameter;
-}
-
-// http://www.w3schools.com/tags/ref_charactersets.asp
-NSStringEncoding GCDWebServerStringEncodingFromCharset(NSString* charset) {
- NSStringEncoding encoding = kCFStringEncodingInvalidId;
- if (charset) {
- encoding = CFStringConvertEncodingToNSStringEncoding(CFStringConvertIANACharSetNameToEncoding((CFStringRef)charset));
- }
- return (encoding != kCFStringEncodingInvalidId ? encoding : NSUTF8StringEncoding);
-}
-
-NSString* GCDWebServerFormatRFC822(NSDate* date) {
- __block NSString* string;
- dispatch_sync(_dateFormatterQueue, ^{
- string = [_dateFormatterRFC822 stringFromDate:date];
- });
- return string;
-}
-
-NSDate* GCDWebServerParseRFC822(NSString* string) {
- __block NSDate* date;
- dispatch_sync(_dateFormatterQueue, ^{
- date = [_dateFormatterRFC822 dateFromString:string];
- });
- return date;
-}
-
-NSString* GCDWebServerFormatISO8601(NSDate* date) {
- __block NSString* string;
- dispatch_sync(_dateFormatterQueue, ^{
- string = [_dateFormatterISO8601 stringFromDate:date];
- });
- return string;
-}
-
-NSDate* GCDWebServerParseISO8601(NSString* string) {
- __block NSDate* date;
- dispatch_sync(_dateFormatterQueue, ^{
- date = [_dateFormatterISO8601 dateFromString:string];
- });
- return date;
-}
-
-BOOL GCDWebServerIsTextContentType(NSString* type) {
- return ([type hasPrefix:@"text/"] || [type hasPrefix:@"application/json"] || [type hasPrefix:@"application/xml"]);
-}
-
-NSString* GCDWebServerDescribeData(NSData* data, NSString* type) {
- if (GCDWebServerIsTextContentType(type)) {
- NSString* charset = GCDWebServerExtractHeaderValueParameter(type, @"charset");
- NSString* string = [[NSString alloc] initWithData:data encoding:GCDWebServerStringEncodingFromCharset(charset)];
- if (string) {
- return string;
- }
- }
- return [NSString stringWithFormat:@"<%lu bytes>", (unsigned long)data.length];
-}
-
-NSString* GCDWebServerGetMimeTypeForExtension(NSString* extension) {
- static NSDictionary* _overrides = nil;
- if (_overrides == nil) {
- _overrides = [[NSDictionary alloc] initWithObjectsAndKeys:
- @"text/css", @"css",
- nil];
- }
- NSString* mimeType = nil;
- extension = [extension lowercaseString];
- if (extension.length) {
- mimeType = [_overrides objectForKey:extension];
- if (mimeType == nil) {
- CFStringRef uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, (__bridge CFStringRef)extension, NULL);
- if (uti) {
- mimeType = CFBridgingRelease(UTTypeCopyPreferredTagWithClass(uti, kUTTagClassMIMEType));
- CFRelease(uti);
- }
- }
- }
- return mimeType ? mimeType : kGCDWebServerDefaultMimeType;
-}
-
-NSString* GCDWebServerEscapeURLString(NSString* string) {
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- return CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)string, NULL, CFSTR(":@/?&=+"), kCFStringEncodingUTF8));
-#pragma clang diagnostic pop
-}
-
-NSString* GCDWebServerUnescapeURLString(NSString* string) {
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- return CFBridgingRelease(CFURLCreateStringByReplacingPercentEscapesUsingEncoding(kCFAllocatorDefault, (CFStringRef)string, CFSTR(""), kCFStringEncodingUTF8));
-#pragma clang diagnostic pop
-}
-
-NSDictionary* GCDWebServerParseURLEncodedForm(NSString* form) {
- NSMutableDictionary* parameters = [NSMutableDictionary dictionary];
- NSScanner* scanner = [[NSScanner alloc] initWithString:form];
- [scanner setCharactersToBeSkipped:nil];
- while (1) {
- NSString* key = nil;
- if (![scanner scanUpToString:@"=" intoString:&key] || [scanner isAtEnd]) {
- break;
- }
- [scanner setScanLocation:([scanner scanLocation] + 1)];
-
- NSString* value = nil;
- [scanner scanUpToString:@"&" intoString:&value];
- if (value == nil) {
- value = @"";
- }
-
- key = [key stringByReplacingOccurrencesOfString:@"+" withString:@" "];
- NSString* unescapedKey = key ? GCDWebServerUnescapeURLString(key) : nil;
- value = [value stringByReplacingOccurrencesOfString:@"+" withString:@" "];
- NSString* unescapedValue = value ? GCDWebServerUnescapeURLString(value) : nil;
- if (unescapedKey && unescapedValue) {
- [parameters setObject:unescapedValue forKey:unescapedKey];
- } else {
- GWS_LOG_WARNING(@"Failed parsing URL encoded form for key \"%@\" and value \"%@\"", key, value);
- GWS_DNOT_REACHED();
- }
-
- if ([scanner isAtEnd]) {
- break;
- }
- [scanner setScanLocation:([scanner scanLocation] + 1)];
- }
- return parameters;
-}
-
-NSString* GCDWebServerStringFromSockAddr(const struct sockaddr* addr, BOOL includeService) {
- NSString* string = nil;
- char hostBuffer[NI_MAXHOST];
- char serviceBuffer[NI_MAXSERV];
- if (getnameinfo(addr, addr->sa_len, hostBuffer, sizeof(hostBuffer), serviceBuffer, sizeof(serviceBuffer), NI_NUMERICHOST | NI_NUMERICSERV | NI_NOFQDN) >= 0) {
- string = includeService ? [NSString stringWithFormat:@"%s:%s", hostBuffer, serviceBuffer] : [NSString stringWithUTF8String:hostBuffer];
- } else {
- GWS_DNOT_REACHED();
- }
- return string;
-}
-
-NSString* GCDWebServerGetPrimaryIPAddress(BOOL useIPv6) {
- NSString* address = nil;
-#if TARGET_OS_IPHONE
-#if !TARGET_IPHONE_SIMULATOR && !TARGET_OS_TV
- const char* primaryInterface = "en0"; // WiFi interface on iOS
-#endif
-#else
- const char* primaryInterface = NULL;
- SCDynamicStoreRef store = SCDynamicStoreCreate(kCFAllocatorDefault, CFSTR("GCDWebServer"), NULL, NULL);
- if (store) {
- CFPropertyListRef info = SCDynamicStoreCopyValue(store, CFSTR("State:/Network/Global/IPv4")); // There is no equivalent for IPv6 but the primary interface should be the same
- if (info) {
- primaryInterface = [[NSString stringWithString:[(__bridge NSDictionary*)info objectForKey:@"PrimaryInterface"]] UTF8String];
- CFRelease(info);
- }
- CFRelease(store);
- }
- if (primaryInterface == NULL) {
- primaryInterface = "lo0";
- }
-#endif
- struct ifaddrs* list;
- if (getifaddrs(&list) >= 0) {
- for (struct ifaddrs* ifap = list; ifap; ifap = ifap->ifa_next) {
-#if TARGET_IPHONE_SIMULATOR || TARGET_OS_TV
- // Assume en0 is Ethernet and en1 is WiFi since there is no way to use SystemConfiguration framework in iOS Simulator
- // Assumption holds for Apple TV running tvOS
- if (strcmp(ifap->ifa_name, "en0") && strcmp(ifap->ifa_name, "en1"))
-#else
- if (strcmp(ifap->ifa_name, primaryInterface))
-#endif
- {
- continue;
- }
- if ((ifap->ifa_flags & IFF_UP) && ((!useIPv6 && (ifap->ifa_addr->sa_family == AF_INET)) || (useIPv6 && (ifap->ifa_addr->sa_family == AF_INET6)))) {
- address = GCDWebServerStringFromSockAddr(ifap->ifa_addr, NO);
- break;
- }
- }
- freeifaddrs(list);
- }
- return address;
-}
-
-NSString* GCDWebServerComputeMD5Digest(NSString* format, ...) {
- va_list arguments;
- va_start(arguments, format);
- const char* string = [[[NSString alloc] initWithFormat:format arguments:arguments] UTF8String];
- va_end(arguments);
- unsigned char md5[CC_MD5_DIGEST_LENGTH];
- CC_MD5(string, (CC_LONG)strlen(string), md5);
- char buffer[2 * CC_MD5_DIGEST_LENGTH + 1];
- for (int i = 0; i < CC_MD5_DIGEST_LENGTH; ++i) {
- unsigned char byte = md5[i];
- unsigned char byteHi = (byte & 0xF0) >> 4;
- buffer[2 * i + 0] = byteHi >= 10 ? 'a' + byteHi - 10 : '0' + byteHi;
- unsigned char byteLo = byte & 0x0F;
- buffer[2 * i + 1] = byteLo >= 10 ? 'a' + byteLo - 10 : '0' + byteLo;
- }
- buffer[2 * CC_MD5_DIGEST_LENGTH] = 0;
- return [NSString stringWithUTF8String:buffer];
-}
diff --git a/local-webserver/src/ios/GCDWebServer/GCDWebServer/Core/GCDWebServerHTTPStatusCodes.h b/local-webserver/src/ios/GCDWebServer/GCDWebServer/Core/GCDWebServerHTTPStatusCodes.h
deleted file mode 100644
index 6e98381..0000000
--- a/local-webserver/src/ios/GCDWebServer/GCDWebServer/Core/GCDWebServerHTTPStatusCodes.h
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- 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.
- */
-
-// http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
-// http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml
-
-#import <Foundation/Foundation.h>
-
-/**
- * Convenience constants for "informational" HTTP status codes.
- */
-typedef NS_ENUM(NSInteger, GCDWebServerInformationalHTTPStatusCode) {
- kGCDWebServerHTTPStatusCode_Continue = 100,
- kGCDWebServerHTTPStatusCode_SwitchingProtocols = 101,
- kGCDWebServerHTTPStatusCode_Processing = 102
-};
-
-/**
- * Convenience constants for "successful" HTTP status codes.
- */
-typedef NS_ENUM(NSInteger, GCDWebServerSuccessfulHTTPStatusCode) {
- kGCDWebServerHTTPStatusCode_OK = 200,
- kGCDWebServerHTTPStatusCode_Created = 201,
- kGCDWebServerHTTPStatusCode_Accepted = 202,
- kGCDWebServerHTTPStatusCode_NonAuthoritativeInformation = 203,
- kGCDWebServerHTTPStatusCode_NoContent = 204,
- kGCDWebServerHTTPStatusCode_ResetContent = 205,
- kGCDWebServerHTTPStatusCode_PartialContent = 206,
- kGCDWebServerHTTPStatusCode_MultiStatus = 207,
- kGCDWebServerHTTPStatusCode_AlreadyReported = 208
-};
-
-/**
- * Convenience constants for "redirection" HTTP status codes.
- */
-typedef NS_ENUM(NSInteger, GCDWebServerRedirectionHTTPStatusCode) {
- kGCDWebServerHTTPStatusCode_MultipleChoices = 300,
- kGCDWebServerHTTPStatusCode_MovedPermanently = 301,
- kGCDWebServerHTTPStatusCode_Found = 302,
- kGCDWebServerHTTPStatusCode_SeeOther = 303,
- kGCDWebServerHTTPStatusCode_NotModified = 304,
- kGCDWebServerHTTPStatusCode_UseProxy = 305,
- kGCDWebServerHTTPStatusCode_TemporaryRedirect = 307,
- kGCDWebServerHTTPStatusCode_PermanentRedirect = 308
-};
-
-/**
- * Convenience constants for "client error" HTTP status codes.
- */
-typedef NS_ENUM(NSInteger, GCDWebServerClientErrorHTTPStatusCode) {
- kGCDWebServerHTTPStatusCode_BadRequest = 400,
- kGCDWebServerHTTPStatusCode_Unauthorized = 401,
- kGCDWebServerHTTPStatusCode_PaymentRequired = 402,
- kGCDWebServerHTTPStatusCode_Forbidden = 403,
- kGCDWebServerHTTPStatusCode_NotFound = 404,
- kGCDWebServerHTTPStatusCode_MethodNotAllowed = 405,
- kGCDWebServerHTTPStatusCode_NotAcceptable = 406,
- kGCDWebServerHTTPStatusCode_ProxyAuthenticationRequired = 407,
- kGCDWebServerHTTPStatusCode_RequestTimeout = 408,
- kGCDWebServerHTTPStatusCode_Conflict = 409,
- kGCDWebServerHTTPStatusCode_Gone = 410,
- kGCDWebServerHTTPStatusCode_LengthRequired = 411,
- kGCDWebServerHTTPStatusCode_PreconditionFailed = 412,
- kGCDWebServerHTTPStatusCode_RequestEntityTooLarge = 413,
- kGCDWebServerHTTPStatusCode_RequestURITooLong = 414,
- kGCDWebServerHTTPStatusCode_UnsupportedMediaType = 415,
- kGCDWebServerHTTPStatusCode_RequestedRangeNotSatisfiable = 416,
- kGCDWebServerHTTPStatusCode_ExpectationFailed = 417,
- kGCDWebServerHTTPStatusCode_UnprocessableEntity = 422,
- kGCDWebServerHTTPStatusCode_Locked = 423,
- kGCDWebServerHTTPStatusCode_FailedDependency = 424,
- kGCDWebServerHTTPStatusCode_UpgradeRequired = 426,
- kGCDWebServerHTTPStatusCode_PreconditionRequired = 428,
- kGCDWebServerHTTPStatusCode_TooManyRequests = 429,
- kGCDWebServerHTTPStatusCode_RequestHeaderFieldsTooLarge = 431
-};
-
-/**
- * Convenience constants for "server error" HTTP status codes.
- */
-typedef NS_ENUM(NSInteger, GCDWebServerServerErrorHTTPStatusCode) {
- kGCDWebServerHTTPStatusCode_InternalServerError = 500,
- kGCDWebServerHTTPStatusCode_NotImplemented = 501,
- kGCDWebServerHTTPStatusCode_BadGateway = 502,
- kGCDWebServerHTTPStatusCode_ServiceUnavailable = 503,
- kGCDWebServerHTTPStatusCode_GatewayTimeout = 504,
- kGCDWebServerHTTPStatusCode_HTTPVersionNotSupported = 505,
- kGCDWebServerHTTPStatusCode_InsufficientStorage = 507,
- kGCDWebServerHTTPStatusCode_LoopDetected = 508,
- kGCDWebServerHTTPStatusCode_NotExtended = 510,
- kGCDWebServerHTTPStatusCode_NetworkAuthenticationRequired = 511
-};
diff --git a/local-webserver/src/ios/GCDWebServer/GCDWebServer/Core/GCDWebServerPrivate.h b/local-webserver/src/ios/GCDWebServer/GCDWebServer/Core/GCDWebServerPrivate.h
deleted file mode 100644
index c9c6868..0000000
--- a/local-webserver/src/ios/GCDWebServer/GCDWebServer/Core/GCDWebServerPrivate.h
+++ /dev/null
@@ -1,230 +0,0 @@
-/*
- 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 <os/object.h>
-#import <sys/socket.h>
-
-/**
- * All GCDWebServer headers.
- */
-
-#import "GCDWebServerHTTPStatusCodes.h"
-#import "GCDWebServerFunctions.h"
-
-#import "GCDWebServer.h"
-#import "GCDWebServerConnection.h"
-
-#import "GCDWebServerDataRequest.h"
-#import "GCDWebServerFileRequest.h"
-#import "GCDWebServerMultiPartFormRequest.h"
-#import "GCDWebServerURLEncodedFormRequest.h"
-
-#import "GCDWebServerDataResponse.h"
-#import "GCDWebServerErrorResponse.h"
-#import "GCDWebServerFileResponse.h"
-#import "GCDWebServerStreamedResponse.h"
-
-/**
- * Check if a custom logging facility should be used instead.
- */
-
-#if defined(__GCDWEBSERVER_LOGGING_HEADER__)
-
-#define __GCDWEBSERVER_LOGGING_FACILITY_CUSTOM__
-
-#import __GCDWEBSERVER_LOGGING_HEADER__
-
-/**
- * Automatically detect if XLFacility is available and if so use it as a
- * logging facility.
- */
-
-#elif defined(__has_include) && __has_include("XLFacilityMacros.h")
-
-#define __GCDWEBSERVER_LOGGING_FACILITY_XLFACILITY__
-
-#undef XLOG_TAG
-#define XLOG_TAG @"gcdwebserver.internal"
-
-#import "XLFacilityMacros.h"
-
-#define GWS_LOG_DEBUG(...) XLOG_DEBUG(__VA_ARGS__)
-#define GWS_LOG_VERBOSE(...) XLOG_VERBOSE(__VA_ARGS__)
-#define GWS_LOG_INFO(...) XLOG_INFO(__VA_ARGS__)
-#define GWS_LOG_WARNING(...) XLOG_WARNING(__VA_ARGS__)
-#define GWS_LOG_ERROR(...) XLOG_ERROR(__VA_ARGS__)
-#define GWS_LOG_EXCEPTION(__EXCEPTION__) XLOG_EXCEPTION(__EXCEPTION__)
-
-#define GWS_DCHECK(__CONDITION__) XLOG_DEBUG_CHECK(__CONDITION__)
-#define GWS_DNOT_REACHED() XLOG_DEBUG_UNREACHABLE()
-
-/**
- * Automatically detect if CocoaLumberJack is available and if so use
- * it as a logging facility.
- */
-
-#elif defined(__has_include) && __has_include("CocoaLumberjack/CocoaLumberjack.h")
-
-#import <CocoaLumberjack/CocoaLumberjack.h>
-
-#define __GCDWEBSERVER_LOGGING_FACILITY_COCOALUMBERJACK__
-
-#undef LOG_LEVEL_DEF
-#define LOG_LEVEL_DEF GCDWebServerLogLevel
-extern DDLogLevel GCDWebServerLogLevel;
-
-#define GWS_LOG_DEBUG(...) DDLogDebug(__VA_ARGS__)
-#define GWS_LOG_VERBOSE(...) DDLogVerbose(__VA_ARGS__)
-#define GWS_LOG_INFO(...) DDLogInfo(__VA_ARGS__)
-#define GWS_LOG_WARNING(...) DDLogWarn(__VA_ARGS__)
-#define GWS_LOG_ERROR(...) DDLogError(__VA_ARGS__)
-#define GWS_LOG_EXCEPTION(__EXCEPTION__) DDLogError(@"%@", __EXCEPTION__)
-
-/**
- * If all of the above fail, then use GCDWebServer built-in
- * logging facility.
- */
-
-#else
-
-#define __GCDWEBSERVER_LOGGING_FACILITY_BUILTIN__
-
-typedef NS_ENUM(int, GCDWebServerLoggingLevel) {
- kGCDWebServerLoggingLevel_Debug = 0,
- kGCDWebServerLoggingLevel_Verbose,
- kGCDWebServerLoggingLevel_Info,
- kGCDWebServerLoggingLevel_Warning,
- kGCDWebServerLoggingLevel_Error,
- kGCDWebServerLoggingLevel_Exception
-};
-
-extern GCDWebServerLoggingLevel GCDWebServerLogLevel;
-extern void GCDWebServerLogMessage(GCDWebServerLoggingLevel level, NSString* format, ...) NS_FORMAT_FUNCTION(2, 3);
-
-#if DEBUG
-#define GWS_LOG_DEBUG(...) do { if (GCDWebServerLogLevel <= kGCDWebServerLoggingLevel_Debug) GCDWebServerLogMessage(kGCDWebServerLoggingLevel_Debug, __VA_ARGS__); } while (0)
-#else
-#define GWS_LOG_DEBUG(...)
-#endif
-#define GWS_LOG_VERBOSE(...) do { if (GCDWebServerLogLevel <= kGCDWebServerLoggingLevel_Verbose) GCDWebServerLogMessage(kGCDWebServerLoggingLevel_Verbose, __VA_ARGS__); } while (0)
-#define GWS_LOG_INFO(...) do { if (GCDWebServerLogLevel <= kGCDWebServerLoggingLevel_Info) GCDWebServerLogMessage(kGCDWebServerLoggingLevel_Info, __VA_ARGS__); } while (0)
-#define GWS_LOG_WARNING(...) do { if (GCDWebServerLogLevel <= kGCDWebServerLoggingLevel_Warning) GCDWebServerLogMessage(kGCDWebServerLoggingLevel_Warning, __VA_ARGS__); } while (0)
-#define GWS_LOG_ERROR(...) do { if (GCDWebServerLogLevel <= kGCDWebServerLoggingLevel_Error) GCDWebServerLogMessage(kGCDWebServerLoggingLevel_Error, __VA_ARGS__); } while (0)
-#define GWS_LOG_EXCEPTION(__EXCEPTION__) do { if (GCDWebServerLogLevel <= kGCDWebServerLoggingLevel_Exception) GCDWebServerLogMessage(kGCDWebServerLoggingLevel_Exception, @"%@", __EXCEPTION__); } while (0)
-
-#endif
-
-/**
- * Consistency check macros used when building Debug only.
- */
-
-#if !defined(GWS_DCHECK) || !defined(GWS_DNOT_REACHED)
-
-#if DEBUG
-
-#define GWS_DCHECK(__CONDITION__) \
- do { \
- if (!(__CONDITION__)) { \
- abort(); \
- } \
- } while (0)
-#define GWS_DNOT_REACHED() abort()
-
-#else
-
-#define GWS_DCHECK(__CONDITION__)
-#define GWS_DNOT_REACHED()
-
-#endif
-
-#endif
-
-/**
- * GCDWebServer internal constants and APIs.
- */
-
-#define kGCDWebServerDefaultMimeType @"application/octet-stream"
-#define kGCDWebServerGCDQueue dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
-#define kGCDWebServerErrorDomain @"GCDWebServerErrorDomain"
-
-static inline BOOL GCDWebServerIsValidByteRange(NSRange range) {
- return ((range.location != NSUIntegerMax) || (range.length > 0));
-}
-
-static inline NSError* GCDWebServerMakePosixError(int code) {
- return [NSError errorWithDomain:NSPOSIXErrorDomain code:code userInfo:@{NSLocalizedDescriptionKey: [NSString stringWithUTF8String:strerror(code)]}];
-}
-
-extern void GCDWebServerInitializeFunctions();
-extern NSString* GCDWebServerNormalizeHeaderValue(NSString* value);
-extern NSString* GCDWebServerTruncateHeaderValue(NSString* value);
-extern NSString* GCDWebServerExtractHeaderValueParameter(NSString* header, NSString* attribute);
-extern NSStringEncoding GCDWebServerStringEncodingFromCharset(NSString* charset);
-extern BOOL GCDWebServerIsTextContentType(NSString* type);
-extern NSString* GCDWebServerDescribeData(NSData* data, NSString* contentType);
-extern NSString* GCDWebServerComputeMD5Digest(NSString* format, ...) NS_FORMAT_FUNCTION(1,2);
-extern NSString* GCDWebServerStringFromSockAddr(const struct sockaddr* addr, BOOL includeService);
-
-@interface GCDWebServerConnection ()
-- (id)initWithServer:(GCDWebServer*)server localAddress:(NSData*)localAddress remoteAddress:(NSData*)remoteAddress socket:(CFSocketNativeHandle)socket;
-@end
-
-@interface GCDWebServer ()
-@property(nonatomic, readonly) NSArray* handlers;
-@property(nonatomic, readonly) NSString* serverName;
-@property(nonatomic, readonly) NSString* authenticationRealm;
-@property(nonatomic, readonly) NSDictionary* authenticationBasicAccounts;
-@property(nonatomic, readonly) NSDictionary* authenticationDigestAccounts;
-@property(nonatomic, readonly) BOOL shouldAutomaticallyMapHEADToGET;
-- (void)willStartConnection:(GCDWebServerConnection*)connection;
-- (void)didEndConnection:(GCDWebServerConnection*)connection;
-@end
-
-@interface GCDWebServerHandler : NSObject
-@property(nonatomic, readonly) GCDWebServerMatchBlock matchBlock;
-@property(nonatomic, readonly) GCDWebServerAsyncProcessBlock asyncProcessBlock;
-@end
-
-@interface GCDWebServerRequest ()
-@property(nonatomic, readonly) BOOL usesChunkedTransferEncoding;
-@property(nonatomic, readwrite) NSData* localAddressData;
-@property(nonatomic, readwrite) NSData* remoteAddressData;
-- (void)prepareForWriting;
-- (BOOL)performOpen:(NSError**)error;
-- (BOOL)performWriteData:(NSData*)data error:(NSError**)error;
-- (BOOL)performClose:(NSError**)error;
-- (void)setAttribute:(id)attribute forKey:(NSString*)key;
-@end
-
-@interface GCDWebServerResponse ()
-@property(nonatomic, readonly) NSDictionary* additionalHeaders;
-@property(nonatomic, readonly) BOOL usesChunkedTransferEncoding;
-- (void)prepareForReading;
-- (BOOL)performOpen:(NSError**)error;
-- (void)performReadDataWithCompletion:(GCDWebServerBodyReaderCompletionBlock)block;
-- (void)performClose;
-@end
diff --git a/local-webserver/src/ios/GCDWebServer/GCDWebServer/Core/GCDWebServerRequest.h b/local-webserver/src/ios/GCDWebServer/GCDWebServer/Core/GCDWebServerRequest.h
deleted file mode 100644
index c7bc31b..0000000
--- a/local-webserver/src/ios/GCDWebServer/GCDWebServer/Core/GCDWebServerRequest.h
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- 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 <Foundation/Foundation.h>
-
-/**
- * Attribute key to retrieve an NSArray containing NSStrings from a GCDWebServerRequest
- * with the contents of any regular expression captures done on the request path.
- *
- * @warning This attribute will only be set on the request if adding a handler using
- * -addHandlerForMethod:pathRegex:requestClass:processBlock:.
- */
-extern NSString* const GCDWebServerRequestAttribute_RegexCaptures;
-
-/**
- * This protocol is used by the GCDWebServerConnection to communicate with
- * the GCDWebServerRequest and write the received HTTP body data.
- *
- * Note that multiple GCDWebServerBodyWriter objects can be chained together
- * internally e.g. to automatically decode gzip encoded content before
- * passing it on to the GCDWebServerRequest.
- *
- * @warning These methods can be called on any GCD thread.
- */
-@protocol GCDWebServerBodyWriter <NSObject>
-
-/**
- * This method is called before any body data is received.
- *
- * It should return YES on success or NO on failure and set the "error" argument
- * which is guaranteed to be non-NULL.
- */
-- (BOOL)open:(NSError**)error;
-
-/**
- * This method is called whenever body data has been received.
- *
- * It should return YES on success or NO on failure and set the "error" argument
- * which is guaranteed to be non-NULL.
- */
-- (BOOL)writeData:(NSData*)data error:(NSError**)error;
-
-/**
- * This method is called after all body data has been received.
- *
- * It should return YES on success or NO on failure and set the "error" argument
- * which is guaranteed to be non-NULL.
- */
-- (BOOL)close:(NSError**)error;
-
-@end
-
-/**
- * The GCDWebServerRequest class is instantiated by the GCDWebServerConnection
- * after the HTTP headers have been received. Each instance wraps a single HTTP
- * request. If a body is present, the methods from the GCDWebServerBodyWriter
- * protocol will be called by the GCDWebServerConnection to receive it.
- *
- * The default implementation of the GCDWebServerBodyWriter protocol on the class
- * simply ignores the body data.
- *
- * @warning GCDWebServerRequest instances can be created and used on any GCD thread.
- */
-@interface GCDWebServerRequest : NSObject <GCDWebServerBodyWriter>
-
-/**
- * Returns the HTTP method for the request.
- */
-@property(nonatomic, readonly) NSString* method;
-
-/**
- * Returns the URL for the request.
- */
-@property(nonatomic, readonly) NSURL* URL;
-
-/**
- * Returns the HTTP headers for the request.
- */
-@property(nonatomic, readonly) NSDictionary* headers;
-
-/**
- * Returns the path component of the URL for the request.
- */
-@property(nonatomic, readonly) NSString* path;
-
-/**
- * Returns the parsed and unescaped query component of the URL for the request.
- *
- * @warning This property will be nil if there is no query in the URL.
- */
-@property(nonatomic, readonly) NSDictionary* query;
-
-/**
- * Returns the content type for the body of the request parsed from the
- * "Content-Type" header.
- *
- * This property will be nil if the request has no body or set to
- * "application/octet-stream" if a body is present but there was no
- * "Content-Type" header.
- */
-@property(nonatomic, readonly) NSString* contentType;
-
-/**
- * Returns the content length for the body of the request parsed from the
- * "Content-Length" header.
- *
- * This property will be set to "NSUIntegerMax" if the request has no body or
- * if there is a body but no "Content-Length" header, typically because
- * chunked transfer encoding is used.
- */
-@property(nonatomic, readonly) NSUInteger contentLength;
-
-/**
- * Returns the parsed "If-Modified-Since" header or nil if absent or malformed.
- */
-@property(nonatomic, readonly) NSDate* ifModifiedSince;
-
-/**
- * Returns the parsed "If-None-Match" header or nil if absent or malformed.
- */
-@property(nonatomic, readonly) NSString* ifNoneMatch;
-
-/**
- * Returns the parsed "Range" header or (NSUIntegerMax, 0) if absent or malformed.
- * The range will be set to (offset, length) if expressed from the beginning
- * of the entity body, or (NSUIntegerMax, length) if expressed from its end.
- */
-@property(nonatomic, readonly) NSRange byteRange;
-
-/**
- * Returns YES if the client supports gzip content encoding according to the
- * "Accept-Encoding" header.
- */
-@property(nonatomic, readonly) BOOL acceptsGzipContentEncoding;
-
-/**
- * Returns the address of the local peer (i.e. server) for the request
- * as a raw "struct sockaddr".
- */
-@property(nonatomic, readonly) NSData* localAddressData;
-
-/**
- * Returns the address of the local peer (i.e. server) for the request
- * as a string.
- */
-@property(nonatomic, readonly) NSString* localAddressString;
-
-/**
- * Returns the address of the remote peer (i.e. client) for the request
- * as a raw "struct sockaddr".
- */
-@property(nonatomic, readonly) NSData* remoteAddressData;
-
-/**
- * Returns the address of the remote peer (i.e. client) for the request
- * as a string.
- */
-@property(nonatomic, readonly) NSString* remoteAddressString;
-
-/**
- * This method is the designated initializer for the class.
- */
-- (instancetype)initWithMethod:(NSString*)method url:(NSURL*)url headers:(NSDictionary*)headers path:(NSString*)path query:(NSDictionary*)query;
-
-/**
- * Convenience method that checks if the contentType property is defined.
- */
-- (BOOL)hasBody;
-
-/**
- * Convenience method that checks if the byteRange property is defined.
- */
-- (BOOL)hasByteRange;
-
-/**
- * Retrieves an attribute associated with this request using the given key.
- *
- * @return The attribute value for the key.
- */
-- (id)attributeForKey:(NSString*)key;
-
-@end
diff --git a/local-webserver/src/ios/GCDWebServer/GCDWebServer/Core/GCDWebServerRequest.m b/local-webserver/src/ios/GCDWebServer/GCDWebServer/Core/GCDWebServerRequest.m
deleted file mode 100644
index dc929a7..0000000
--- a/local-webserver/src/ios/GCDWebServer/GCDWebServer/Core/GCDWebServerRequest.m
+++ /dev/null
@@ -1,334 +0,0 @@
-/*
- 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.
- */
-
-#if !__has_feature(objc_arc)
-#error GCDWebServer requires ARC
-#endif
-
-#import <zlib.h>
-
-#import "GCDWebServerPrivate.h"
-
-NSString* const GCDWebServerRequestAttribute_RegexCaptures = @"GCDWebServerRequestAttribute_RegexCaptures";
-
-#define kZlibErrorDomain @"ZlibErrorDomain"
-#define kGZipInitialBufferSize (256 * 1024)
-
-@interface GCDWebServerBodyDecoder : NSObject <GCDWebServerBodyWriter>
-- (id)initWithRequest:(GCDWebServerRequest*)request writer:(id<GCDWebServerBodyWriter>)writer;
-@end
-
-@interface GCDWebServerGZipDecoder : GCDWebServerBodyDecoder
-@end
-
-@interface GCDWebServerBodyDecoder () {
-@private
- GCDWebServerRequest* __unsafe_unretained _request;
- id<GCDWebServerBodyWriter> __unsafe_unretained _writer;
-}
-@end
-
-@implementation GCDWebServerBodyDecoder
-
-- (id)initWithRequest:(GCDWebServerRequest*)request writer:(id<GCDWebServerBodyWriter>)writer {
- if ((self = [super init])) {
- _request = request;
- _writer = writer;
- }
- return self;
-}
-
-- (BOOL)open:(NSError**)error {
- return [_writer open:error];
-}
-
-- (BOOL)writeData:(NSData*)data error:(NSError**)error {
- return [_writer writeData:data error:error];
-}
-
-- (BOOL)close:(NSError**)error {
- return [_writer close:error];
-}
-
-@end
-
-@interface GCDWebServerGZipDecoder () {
-@private
- z_stream _stream;
- BOOL _finished;
-}
-@end
-
-@implementation GCDWebServerGZipDecoder
-
-- (BOOL)open:(NSError**)error {
- int result = inflateInit2(&_stream, 15 + 16);
- if (result != Z_OK) {
- if (error) {
- *error = [NSError errorWithDomain:kZlibErrorDomain code:result userInfo:nil];
- }
- return NO;
- }
- if (![super open:error]) {
- deflateEnd(&_stream);
- return NO;
- }
- return YES;
-}
-
-- (BOOL)writeData:(NSData*)data error:(NSError**)error {
- GWS_DCHECK(!_finished);
- _stream.next_in = (Bytef*)data.bytes;
- _stream.avail_in = (uInt)data.length;
- NSMutableData* decodedData = [[NSMutableData alloc] initWithLength:kGZipInitialBufferSize];
- if (decodedData == nil) {
- GWS_DNOT_REACHED();
- return NO;
- }
- NSUInteger length = 0;
- while (1) {
- NSUInteger maxLength = decodedData.length - length;
- _stream.next_out = (Bytef*)((char*)decodedData.mutableBytes + length);
- _stream.avail_out = (uInt)maxLength;
- int result = inflate(&_stream, Z_NO_FLUSH);
- if ((result != Z_OK) && (result != Z_STREAM_END)) {
- if (error) {
- *error = [NSError errorWithDomain:kZlibErrorDomain code:result userInfo:nil];
- }
- return NO;
- }
- length += maxLength - _stream.avail_out;
- if (_stream.avail_out > 0) {
- if (result == Z_STREAM_END) {
- _finished = YES;
- }
- break;
- }
- decodedData.length = 2 * decodedData.length; // zlib has used all the output buffer so resize it and try again in case more data is available
- }
- decodedData.length = length;
- BOOL success = length ? [super writeData:decodedData error:error] : YES; // No need to call writer if we have no data yet
- return success;
-}
-
-- (BOOL)close:(NSError**)error {
- GWS_DCHECK(_finished);
- inflateEnd(&_stream);
- return [super close:error];
-}
-
-@end
-
-@interface GCDWebServerRequest () {
-@private
- NSString* _method;
- NSURL* _url;
- NSDictionary* _headers;
- NSString* _path;
- NSDictionary* _query;
- NSString* _type;
- BOOL _chunked;
- NSUInteger _length;
- NSDate* _modifiedSince;
- NSString* _noneMatch;
- NSRange _range;
- BOOL _gzipAccepted;
- NSData* _localAddress;
- NSData* _remoteAddress;
-
- BOOL _opened;
- NSMutableArray* _decoders;
- NSMutableDictionary* _attributes;
- id<GCDWebServerBodyWriter> __unsafe_unretained _writer;
-}
-@end
-
-@implementation GCDWebServerRequest : NSObject
-
-@synthesize method=_method, URL=_url, headers=_headers, path=_path, query=_query, contentType=_type, contentLength=_length, ifModifiedSince=_modifiedSince, ifNoneMatch=_noneMatch,
- byteRange=_range, acceptsGzipContentEncoding=_gzipAccepted, usesChunkedTransferEncoding=_chunked, localAddressData=_localAddress, remoteAddressData=_remoteAddress;
-
-- (instancetype)initWithMethod:(NSString*)method url:(NSURL*)url headers:(NSDictionary*)headers path:(NSString*)path query:(NSDictionary*)query {
- if ((self = [super init])) {
- _method = [method copy];
- _url = url;
- _headers = headers;
- _path = [path copy];
- _query = query;
-
- _type = GCDWebServerNormalizeHeaderValue([_headers objectForKey:@"Content-Type"]);
- _chunked = [GCDWebServerNormalizeHeaderValue([_headers objectForKey:@"Transfer-Encoding"]) isEqualToString:@"chunked"];
- NSString* lengthHeader = [_headers objectForKey:@"Content-Length"];
- if (lengthHeader) {
- NSInteger length = [lengthHeader integerValue];
- if (_chunked || (length < 0)) {
- GWS_LOG_WARNING(@"Invalid 'Content-Length' header '%@' for '%@' request on \"%@\"", lengthHeader, _method, _url);
- GWS_DNOT_REACHED();
- return nil;
- }
- _length = length;
- if (_type == nil) {
- _type = kGCDWebServerDefaultMimeType;
- }
- } else if (_chunked) {
- if (_type == nil) {
- _type = kGCDWebServerDefaultMimeType;
- }
- _length = NSUIntegerMax;
- } else {
- if (_type) {
- GWS_LOG_WARNING(@"Ignoring 'Content-Type' header for '%@' request on \"%@\"", _method, _url);
- _type = nil; // Content-Type without Content-Length or chunked-encoding doesn't make sense
- }
- _length = NSUIntegerMax;
- }
-
- NSString* modifiedHeader = [_headers objectForKey:@"If-Modified-Since"];
- if (modifiedHeader) {
- _modifiedSince = [GCDWebServerParseRFC822(modifiedHeader) copy];
- }
- _noneMatch = [_headers objectForKey:@"If-None-Match"];
-
- _range = NSMakeRange(NSUIntegerMax, 0);
- NSString* rangeHeader = GCDWebServerNormalizeHeaderValue([_headers objectForKey:@"Range"]);
- if (rangeHeader) {
- if ([rangeHeader hasPrefix:@"bytes="]) {
- NSArray* components = [[rangeHeader substringFromIndex:6] componentsSeparatedByString:@","];
- if (components.count == 1) {
- components = [[components firstObject] componentsSeparatedByString:@"-"];
- if (components.count == 2) {
- NSString* startString = [components objectAtIndex:0];
- NSInteger startValue = [startString integerValue];
- NSString* endString = [components objectAtIndex:1];
- NSInteger endValue = [endString integerValue];
- if (startString.length && (startValue >= 0) && endString.length && (endValue >= startValue)) { // The second 500 bytes: "500-999"
- _range.location = startValue;
- _range.length = endValue - startValue + 1;
- } else if (startString.length && (startValue >= 0)) { // The bytes after 9500 bytes: "9500-"
- _range.location = startValue;
- _range.length = NSUIntegerMax;
- } else if (endString.length && (endValue > 0)) { // The final 500 bytes: "-500"
- _range.location = NSUIntegerMax;
- _range.length = endValue;
- }
- }
- }
- }
- if ((_range.location == NSUIntegerMax) && (_range.length == 0)) { // Ignore "Range" header if syntactically invalid
- GWS_LOG_WARNING(@"Failed to parse 'Range' header \"%@\" for url: %@", rangeHeader, url);
- }
- }
-
- if ([[_headers objectForKey:@"Accept-Encoding"] rangeOfString:@"gzip"].location != NSNotFound) {
- _gzipAccepted = YES;
- }
-
- _decoders = [[NSMutableArray alloc] init];
- _attributes = [[NSMutableDictionary alloc] init];
- }
- return self;
-}
-
-- (BOOL)hasBody {
- return _type ? YES : NO;
-}
-
-- (BOOL)hasByteRange {
- return GCDWebServerIsValidByteRange(_range);
-}
-
-- (id)attributeForKey:(NSString*)key {
- return [_attributes objectForKey:key];
-}
-
-- (BOOL)open:(NSError**)error {
- return YES;
-}
-
-- (BOOL)writeData:(NSData*)data error:(NSError**)error {
- return YES;
-}
-
-- (BOOL)close:(NSError**)error {
- return YES;
-}
-
-- (void)prepareForWriting {
- _writer = self;
- if ([GCDWebServerNormalizeHeaderValue([self.headers objectForKey:@"Content-Encoding"]) isEqualToString:@"gzip"]) {
- GCDWebServerGZipDecoder* decoder = [[GCDWebServerGZipDecoder alloc] initWithRequest:self writer:_writer];
- [_decoders addObject:decoder];
- _writer = decoder;
- }
-}
-
-- (BOOL)performOpen:(NSError**)error {
- GWS_DCHECK(_type);
- GWS_DCHECK(_writer);
- if (_opened) {
- GWS_DNOT_REACHED();
- return NO;
- }
- _opened = YES;
- return [_writer open:error];
-}
-
-- (BOOL)performWriteData:(NSData*)data error:(NSError**)error {
- GWS_DCHECK(_opened);
- return [_writer writeData:data error:error];
-}
-
-- (BOOL)performClose:(NSError**)error {
- GWS_DCHECK(_opened);
- return [_writer close:error];
-}
-
-- (void)setAttribute:(id)attribute forKey:(NSString*)key {
- [_attributes setValue:attribute forKey:key];
-}
-
-- (NSString*)localAddressString {
- return GCDWebServerStringFromSockAddr(_localAddress.bytes, YES);
-}
-
-- (NSString*)remoteAddressString {
- return GCDWebServerStringFromSockAddr(_remoteAddress.bytes, YES);
-}
-
-- (NSString*)description {
- NSMutableString* description = [NSMutableString stringWithFormat:@"%@ %@", _method, _path];
- for (NSString* argument in [[_query allKeys] sortedArrayUsingSelector:@selector(compare:)]) {
- [description appendFormat:@"\n %@ = %@", argument, [_query objectForKey:argument]];
- }
- [description appendString:@"\n"];
- for (NSString* header in [[_headers allKeys] sortedArrayUsingSelector:@selector(compare:)]) {
- [description appendFormat:@"\n%@: %@", header, [_headers objectForKey:header]];
- }
- return description;
-}
-
-@end
diff --git a/local-webserver/src/ios/GCDWebServer/GCDWebServer/Core/GCDWebServerResponse.h b/local-webserver/src/ios/GCDWebServer/GCDWebServer/Core/GCDWebServerResponse.h
deleted file mode 100644
index 2ec2dee..0000000
--- a/local-webserver/src/ios/GCDWebServer/GCDWebServer/Core/GCDWebServerResponse.h
+++ /dev/null
@@ -1,208 +0,0 @@
-/*
- 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 <Foundation/Foundation.h>
-
-/**
- * The GCDWebServerBodyReaderCompletionBlock is passed by GCDWebServer to the
- * GCDWebServerBodyReader object when reading data from it asynchronously.
- */
-typedef void (^GCDWebServerBodyReaderCompletionBlock)(NSData* data, NSError* error);
-
-/**
- * This protocol is used by the GCDWebServerConnection to communicate with
- * the GCDWebServerResponse and read the HTTP body data to send.
- *
- * Note that multiple GCDWebServerBodyReader objects can be chained together
- * internally e.g. to automatically apply gzip encoding to the content before
- * passing it on to the GCDWebServerResponse.
- *
- * @warning These methods can be called on any GCD thread.
- */
-@protocol GCDWebServerBodyReader <NSObject>
-
-@required
-
-/**
- * This method is called before any body data is sent.
- *
- * It should return YES on success or NO on failure and set the "error" argument
- * which is guaranteed to be non-NULL.
- */
-- (BOOL)open:(NSError**)error;
-
-/**
- * This method is called whenever body data is sent.
- *
- * It should return a non-empty NSData if there is body data available,
- * or an empty NSData there is no more body data, or nil on error and set
- * the "error" argument which is guaranteed to be non-NULL.
- */
-- (NSData*)readData:(NSError**)error;
-
-/**
- * This method is called after all body data has been sent.
- */
-- (void)close;
-
-@optional
-
-/**
- * If this method is implemented, it will be preferred over -readData:.
- *
- * It must call the passed block when data is available, passing a non-empty
- * NSData if there is body data available, or an empty NSData there is no more
- * body data, or nil on error and pass an NSError along.
- */
-- (void)asyncReadDataWithCompletion:(GCDWebServerBodyReaderCompletionBlock)block;
-
-@end
-
-/**
- * The GCDWebServerResponse class is used to wrap a single HTTP response.
- * It is instantiated by the handler of the GCDWebServer that handled the request.
- * If a body is present, the methods from the GCDWebServerBodyReader protocol
- * will be called by the GCDWebServerConnection to send it.
- *
- * The default implementation of the GCDWebServerBodyReader protocol
- * on the class simply returns an empty body.
- *
- * @warning GCDWebServerResponse instances can be created and used on any GCD thread.
- */
-@interface GCDWebServerResponse : NSObject <GCDWebServerBodyReader>
-
-/**
- * Sets the content type for the body of the response.
- *
- * The default value is nil i.e. the response has no body.
- *
- * @warning This property must be set if a body is present.
- */
-@property(nonatomic, copy) NSString* contentType;
-
-/**
- * Sets the content length for the body of the response. If a body is present
- * but this property is set to "NSUIntegerMax", this means the length of the body
- * cannot be known ahead of time. Chunked transfer encoding will be
- * automatically enabled by the GCDWebServerConnection to comply with HTTP/1.1
- * specifications.
- *
- * The default value is "NSUIntegerMax" i.e. the response has no body or its length
- * is undefined.
- */
-@property(nonatomic) NSUInteger contentLength;
-
-/**
- * Sets the HTTP status code for the response.
- *
- * The default value is 200 i.e. "OK".
- */
-@property(nonatomic) NSInteger statusCode;
-
-/**
- * Sets the caching hint for the response using the "Cache-Control" header.
- * This value is expressed in seconds.
- *
- * The default value is 0 i.e. "no-cache".
- */
-@property(nonatomic) NSUInteger cacheControlMaxAge;
-
-/**
- * Sets the last modified date for the response using the "Last-Modified" header.
- *
- * The default value is nil.
- */
-@property(nonatomic, retain) NSDate* lastModifiedDate;
-
-/**
- * Sets the ETag for the response using the "ETag" header.
- *
- * The default value is nil.
- */
-@property(nonatomic, copy) NSString* eTag;
-
-/**
- * Enables gzip encoding for the response body.
- *
- * The default value is NO.
- *
- * @warning Enabling gzip encoding will remove any "Content-Length" header
- * since the length of the body is not known anymore. The client will still
- * be able to determine the body length when connection is closed per
- * HTTP/1.1 specifications.
- */
-@property(nonatomic, getter=isGZipContentEncodingEnabled) BOOL gzipContentEncodingEnabled;
-
-/**
- * Creates an empty response.
- */
-+ (instancetype)response;
-
-/**
- * This method is the designated initializer for the class.
- */
-- (instancetype)init;
-
-/**
- * Sets an additional HTTP header on the response.
- * Pass a nil value to remove an additional header.
- *
- * @warning Do not attempt to override the primary headers used
- * by GCDWebServerResponse like "Content-Type", "ETag", etc...
- */
-- (void)setValue:(NSString*)value forAdditionalHeader:(NSString*)header;
-
-/**
- * Convenience method that checks if the contentType property is defined.
- */
-- (BOOL)hasBody;
-
-@end
-
-@interface GCDWebServerResponse (Extensions)
-
-/**
- * Creates a empty response with a specific HTTP status code.
- */
-+ (instancetype)responseWithStatusCode:(NSInteger)statusCode;
-
-/**
- * Creates an HTTP redirect response to a new URL.
- */
-+ (instancetype)responseWithRedirect:(NSURL*)location permanent:(BOOL)permanent;
-
-/**
- * Initializes an empty response with a specific HTTP status code.
- */
-- (instancetype)initWithStatusCode:(NSInteger)statusCode;
-
-/**
- * Initializes an HTTP redirect response to a new URL.
- */
-- (instancetype)initWithRedirect:(NSURL*)location permanent:(BOOL)permanent;
-
-@end
diff --git a/local-webserver/src/ios/GCDWebServer/GCDWebServer/Core/GCDWebServerResponse.m b/local-webserver/src/ios/GCDWebServer/GCDWebServer/Core/GCDWebServerResponse.m
deleted file mode 100644
index 8357ab7..0000000
--- a/local-webserver/src/ios/GCDWebServer/GCDWebServer/Core/GCDWebServerResponse.m
+++ /dev/null
@@ -1,309 +0,0 @@
-/*
- 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.
- */
-
-#if !__has_feature(objc_arc)
-#error GCDWebServer requires ARC
-#endif
-
-#import <zlib.h>
-
-#import "GCDWebServerPrivate.h"
-
-#define kZlibErrorDomain @"ZlibErrorDomain"
-#define kGZipInitialBufferSize (256 * 1024)
-
-@interface GCDWebServerBodyEncoder : NSObject <GCDWebServerBodyReader>
-- (id)initWithResponse:(GCDWebServerResponse*)response reader:(id<GCDWebServerBodyReader>)reader;
-@end
-
-@interface GCDWebServerGZipEncoder : GCDWebServerBodyEncoder
-@end
-
-@interface GCDWebServerBodyEncoder () {
-@private
- GCDWebServerResponse* __unsafe_unretained _response;
- id<GCDWebServerBodyReader> __unsafe_unretained _reader;
-}
-@end
-
-@implementation GCDWebServerBodyEncoder
-
-- (id)initWithResponse:(GCDWebServerResponse*)response reader:(id<GCDWebServerBodyReader>)reader {
- if ((self = [super init])) {
- _response = response;
- _reader = reader;
- }
- return self;
-}
-
-- (BOOL)open:(NSError**)error {
- return [_reader open:error];
-}
-
-- (NSData*)readData:(NSError**)error {
- return [_reader readData:error];
-}
-
-- (void)close {
- [_reader close];
-}
-
-@end
-
-@interface GCDWebServerGZipEncoder () {
-@private
- z_stream _stream;
- BOOL _finished;
-}
-@end
-
-@implementation GCDWebServerGZipEncoder
-
-- (id)initWithResponse:(GCDWebServerResponse*)response reader:(id<GCDWebServerBodyReader>)reader {
- if ((self = [super initWithResponse:response reader:reader])) {
- response.contentLength = NSUIntegerMax; // Make sure "Content-Length" header is not set since we don't know it
- [response setValue:@"gzip" forAdditionalHeader:@"Content-Encoding"];
- }
- return self;
-}
-
-- (BOOL)open:(NSError**)error {
- int result = deflateInit2(&_stream, Z_DEFAULT_COMPRESSION, Z_DEFLATED, 15 + 16, 8, Z_DEFAULT_STRATEGY);
- if (result != Z_OK) {
- if (error) {
- *error = [NSError errorWithDomain:kZlibErrorDomain code:result userInfo:nil];
- }
- return NO;
- }
- if (![super open:error]) {
- deflateEnd(&_stream);
- return NO;
- }
- return YES;
-}
-
-- (NSData*)readData:(NSError**)error {
- NSMutableData* encodedData;
- if (_finished) {
- encodedData = [[NSMutableData alloc] init];
- } else {
- encodedData = [[NSMutableData alloc] initWithLength:kGZipInitialBufferSize];
- if (encodedData == nil) {
- GWS_DNOT_REACHED();
- return nil;
- }
- NSUInteger length = 0;
- do {
- NSData* data = [super readData:error];
- if (data == nil) {
- return nil;
- }
- _stream.next_in = (Bytef*)data.bytes;
- _stream.avail_in = (uInt)data.length;
- while (1) {
- NSUInteger maxLength = encodedData.length - length;
- _stream.next_out = (Bytef*)((char*)encodedData.mutableBytes + length);
- _stream.avail_out = (uInt)maxLength;
- int result = deflate(&_stream, data.length ? Z_NO_FLUSH : Z_FINISH);
- if (result == Z_STREAM_END) {
- _finished = YES;
- } else if (result != Z_OK) {
- if (error) {
- *error = [NSError errorWithDomain:kZlibErrorDomain code:result userInfo:nil];
- }
- return nil;
- }
- length += maxLength - _stream.avail_out;
- if (_stream.avail_out > 0) {
- break;
- }
- encodedData.length = 2 * encodedData.length; // zlib has used all the output buffer so resize it and try again in case more data is available
- }
- GWS_DCHECK(_stream.avail_in == 0);
- } while (length == 0); // Make sure we don't return an empty NSData if not in finished state
- encodedData.length = length;
- }
- return encodedData;
-}
-
-- (void)close {
- deflateEnd(&_stream);
- [super close];
-}
-
-@end
-
-@interface GCDWebServerResponse () {
-@private
- NSString* _type;
- NSUInteger _length;
- NSInteger _status;
- NSUInteger _maxAge;
- NSDate* _lastModified;
- NSString* _eTag;
- NSMutableDictionary* _headers;
- BOOL _chunked;
- BOOL _gzipped;
-
- BOOL _opened;
- NSMutableArray* _encoders;
- id<GCDWebServerBodyReader> __unsafe_unretained _reader;
-}
-@end
-
-@implementation GCDWebServerResponse
-
-@synthesize contentType=_type, contentLength=_length, statusCode=_status, cacheControlMaxAge=_maxAge, lastModifiedDate=_lastModified, eTag=_eTag,
- gzipContentEncodingEnabled=_gzipped, additionalHeaders=_headers;
-
-+ (instancetype)response {
- return [[[self class] alloc] init];
-}
-
-- (instancetype)init {
- if ((self = [super init])) {
- _type = nil;
- _length = NSUIntegerMax;
- _status = kGCDWebServerHTTPStatusCode_OK;
- _maxAge = 0;
- _headers = [[NSMutableDictionary alloc] init];
- _encoders = [[NSMutableArray alloc] init];
- }
- return self;
-}
-
-- (void)setValue:(NSString*)value forAdditionalHeader:(NSString*)header {
- [_headers setValue:value forKey:header];
-}
-
-- (BOOL)hasBody {
- return _type ? YES : NO;
-}
-
-- (BOOL)usesChunkedTransferEncoding {
- return (_type != nil) && (_length == NSUIntegerMax);
-}
-
-- (BOOL)open:(NSError**)error {
- return YES;
-}
-
-- (NSData*)readData:(NSError**)error {
- return [NSData data];
-}
-
-- (void)close {
- ;
-}
-
-- (void)prepareForReading {
- _reader = self;
- if (_gzipped) {
- GCDWebServerGZipEncoder* encoder = [[GCDWebServerGZipEncoder alloc] initWithResponse:self reader:_reader];
- [_encoders addObject:encoder];
- _reader = encoder;
- }
-}
-
-- (BOOL)performOpen:(NSError**)error {
- GWS_DCHECK(_type);
- GWS_DCHECK(_reader);
- if (_opened) {
- GWS_DNOT_REACHED();
- return NO;
- }
- _opened = YES;
- return [_reader open:error];
-}
-
-- (void)performReadDataWithCompletion:(GCDWebServerBodyReaderCompletionBlock)block {
- if ([_reader respondsToSelector:@selector(asyncReadDataWithCompletion:)]) {
- [_reader asyncReadDataWithCompletion:[block copy]];
- } else {
- NSError* error = nil;
- NSData* data = [_reader readData:&error];
- block(data, error);
- }
-}
-
-- (void)performClose {
- GWS_DCHECK(_opened);
- [_reader close];
-}
-
-- (NSString*)description {
- NSMutableString* description = [NSMutableString stringWithFormat:@"Status Code = %i", (int)_status];
- if (_type) {
- [description appendFormat:@"\nContent Type = %@", _type];
- }
- if (_length != NSUIntegerMax) {
- [description appendFormat:@"\nContent Length = %lu", (unsigned long)_length];
- }
- [description appendFormat:@"\nCache Control Max Age = %lu", (unsigned long)_maxAge];
- if (_lastModified) {
- [description appendFormat:@"\nLast Modified Date = %@", _lastModified];
- }
- if (_eTag) {
- [description appendFormat:@"\nETag = %@", _eTag];
- }
- if (_headers.count) {
- [description appendString:@"\n"];
- for (NSString* header in [[_headers allKeys] sortedArrayUsingSelector:@selector(compare:)]) {
- [description appendFormat:@"\n%@: %@", header, [_headers objectForKey:header]];
- }
- }
- return description;
-}
-
-@end
-
-@implementation GCDWebServerResponse (Extensions)
-
-+ (instancetype)responseWithStatusCode:(NSInteger)statusCode {
- return [[self alloc] initWithStatusCode:statusCode];
-}
-
-+ (instancetype)responseWithRedirect:(NSURL*)location permanent:(BOOL)permanent {
- return [[self alloc] initWithRedirect:location permanent:permanent];
-}
-
-- (instancetype)initWithStatusCode:(NSInteger)statusCode {
- if ((self = [self init])) {
- self.statusCode = statusCode;
- }
- return self;
-}
-
-- (instancetype)initWithRedirect:(NSURL*)location permanent:(BOOL)permanent {
- if ((self = [self init])) {
- self.statusCode = permanent ? kGCDWebServerHTTPStatusCode_MovedPermanently : kGCDWebServerHTTPStatusCode_TemporaryRedirect;
- [self setValue:[location absoluteString] forAdditionalHeader:@"Location"];
- }
- return self;
-}
-
-@end
diff --git a/local-webserver/src/ios/GCDWebServer/GCDWebServer/Requests/GCDWebServerDataRequest.h b/local-webserver/src/ios/GCDWebServer/GCDWebServer/Requests/GCDWebServerDataRequest.h
deleted file mode 100644
index 5048d08..0000000
--- a/local-webserver/src/ios/GCDWebServer/GCDWebServer/Requests/GCDWebServerDataRequest.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- 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 "GCDWebServerRequest.h"
-
-/**
- * The GCDWebServerDataRequest subclass of GCDWebServerRequest stores the body
- * of the HTTP request in memory.
- */
-@interface GCDWebServerDataRequest : GCDWebServerRequest
-
-/**
- * Returns the data for the request body.
- */
-@property(nonatomic, readonly) NSData* data;
-
-@end
-
-@interface GCDWebServerDataRequest (Extensions)
-
-/**
- * Returns the data for the request body interpreted as text. If the content
- * type of the body is not a text one, or if an error occurs, nil is returned.
- *
- * The text encoding used to interpret the data is extracted from the
- * "Content-Type" header or defaults to UTF-8.
- */
-@property(nonatomic, readonly) NSString* text;
-
-/**
- * Returns the data for the request body interpreted as a JSON object. If the
- * content type of the body is not JSON, or if an error occurs, nil is returned.
- */
-@property(nonatomic, readonly) id jsonObject;
-
-@end
diff --git a/local-webserver/src/ios/GCDWebServer/GCDWebServer/Requests/GCDWebServerDataRequest.m b/local-webserver/src/ios/GCDWebServer/GCDWebServer/Requests/GCDWebServerDataRequest.m
deleted file mode 100644
index 840e985..0000000
--- a/local-webserver/src/ios/GCDWebServer/GCDWebServer/Requests/GCDWebServerDataRequest.m
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- 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.
- */
-
-#if !__has_feature(objc_arc)
-#error GCDWebServer requires ARC
-#endif
-
-#import "GCDWebServerPrivate.h"
-
-@interface GCDWebServerDataRequest () {
-@private
- NSMutableData* _data;
-
- NSString* _text;
- id _jsonObject;
-}
-@end
-
-@implementation GCDWebServerDataRequest
-
-@synthesize data=_data;
-
-- (BOOL)open:(NSError**)error {
- if (self.contentLength != NSUIntegerMax) {
- _data = [[NSMutableData alloc] initWithCapacity:self.contentLength];
- } else {
- _data = [[NSMutableData alloc] init];
- }
- if (_data == nil) {
- if (error) {
- *error = [NSError errorWithDomain:kGCDWebServerErrorDomain code:-1 userInfo:@{NSLocalizedDescriptionKey: @"Failed allocating memory"}];
- }
- return NO;
- }
- return YES;
-}
-
-- (BOOL)writeData:(NSData*)data error:(NSError**)error {
- [_data appendData:data];
- return YES;
-}
-
-- (BOOL)close:(NSError**)error {
- return YES;
-}
-
-- (NSString*)description {
- NSMutableString* description = [NSMutableString stringWithString:[super description]];
- if (_data) {
- [description appendString:@"\n\n"];
- [description appendString:GCDWebServerDescribeData(_data, self.contentType)];
- }
- return description;
-}
-
-@end
-
-@implementation GCDWebServerDataRequest (Extensions)
-
-- (NSString*)text {
- if (_text == nil) {
- if ([self.contentType hasPrefix:@"text/"]) {
- NSString* charset = GCDWebServerExtractHeaderValueParameter(self.contentType, @"charset");
- _text = [[NSString alloc] initWithData:self.data encoding:GCDWebServerStringEncodingFromCharset(charset)];
- } else {
- GWS_DNOT_REACHED();
- }
- }
- return _text;
-}
-
-- (id)jsonObject {
- if (_jsonObject == nil) {
- NSString* mimeType = GCDWebServerTruncateHeaderValue(self.contentType);
- if ([mimeType isEqualToString:@"application/json"] || [mimeType isEqualToString:@"text/json"] || [mimeType isEqualToString:@"text/javascript"]) {
- _jsonObject = [NSJSONSerialization JSONObjectWithData:_data options:0 error:NULL];
- } else {
- GWS_DNOT_REACHED();
- }
- }
- return _jsonObject;
-}
-
-@end
diff --git a/local-webserver/src/ios/GCDWebServer/GCDWebServer/Requests/GCDWebServerFileRequest.h b/local-webserver/src/ios/GCDWebServer/GCDWebServer/Requests/GCDWebServerFileRequest.h
deleted file mode 100644
index ad29eab..0000000
--- a/local-webserver/src/ios/GCDWebServer/GCDWebServer/Requests/GCDWebServerFileRequest.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- 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 "GCDWebServerRequest.h"
-
-/**
- * The GCDWebServerFileRequest subclass of GCDWebServerRequest stores the body
- * of the HTTP request to a file on disk.
- */
-@interface GCDWebServerFileRequest : GCDWebServerRequest
-
-/**
- * Returns the path to the temporary file containing the request body.
- *
- * @warning This temporary file will be automatically deleted when the
- * GCDWebServerFileRequest is deallocated. If you want to preserve this file,
- * you must move it to a different location beforehand.
- */
-@property(nonatomic, readonly) NSString* temporaryPath;
-
-@end
diff --git a/local-webserver/src/ios/GCDWebServer/GCDWebServer/Requests/GCDWebServerFileRequest.m b/local-webserver/src/ios/GCDWebServer/GCDWebServer/Requests/GCDWebServerFileRequest.m
deleted file mode 100644
index adf67a5..0000000
--- a/local-webserver/src/ios/GCDWebServer/GCDWebServer/Requests/GCDWebServerFileRequest.m
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- 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.
- */
-
-#if !__has_feature(objc_arc)
-#error GCDWebServer requires ARC
-#endif
-
-#import "GCDWebServerPrivate.h"
-
-@interface GCDWebServerFileRequest () {
-@private
- NSString* _temporaryPath;
- int _file;
-}
-@end
-
-@implementation GCDWebServerFileRequest
-
-@synthesize temporaryPath=_temporaryPath;
-
-- (instancetype)initWithMethod:(NSString*)method url:(NSURL*)url headers:(NSDictionary*)headers path:(NSString*)path query:(NSDictionary*)query {
- if ((self = [super initWithMethod:method url:url headers:headers path:path query:query])) {
- _temporaryPath = [NSTemporaryDirectory() stringByAppendingPathComponent:[[NSProcessInfo processInfo] globallyUniqueString]];
- }
- return self;
-}
-
-- (void)dealloc {
- unlink([_temporaryPath fileSystemRepresentation]);
-}
-
-- (BOOL)open:(NSError**)error {
- _file = open([_temporaryPath fileSystemRepresentation], O_CREAT | O_TRUNC | O_WRONLY, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
- if (_file <= 0) {
- if (error) {
- *error = GCDWebServerMakePosixError(errno);
- }
- return NO;
- }
- return YES;
-}
-
-- (BOOL)writeData:(NSData*)data error:(NSError**)error {
- if (write(_file, data.bytes, data.length) != (ssize_t)data.length) {
- if (error) {
- *error = GCDWebServerMakePosixError(errno);
- }
- return NO;
- }
- return YES;
-}
-
-- (BOOL)close:(NSError**)error {
- if (close(_file) < 0) {
- if (error) {
- *error = GCDWebServerMakePosixError(errno);
- }
- return NO;
- }
-#ifdef __GCDWEBSERVER_ENABLE_TESTING__
- NSString* creationDateHeader = [self.headers objectForKey:@"X-GCDWebServer-CreationDate"];
- if (creationDateHeader) {
- NSDate* date = GCDWebServerParseISO8601(creationDateHeader);
- if (!date || ![[NSFileManager defaultManager] setAttributes:@{NSFileCreationDate: date} ofItemAtPath:_temporaryPath error:error]) {
- return NO;
- }
- }
- NSString* modifiedDateHeader = [self.headers objectForKey:@"X-GCDWebServer-ModifiedDate"];
- if (modifiedDateHeader) {
- NSDate* date = GCDWebServerParseRFC822(modifiedDateHeader);
- if (!date || ![[NSFileManager defaultManager] setAttributes:@{NSFileModificationDate: date} ofItemAtPath:_temporaryPath error:error]) {
- return NO;
- }
- }
-#endif
- return YES;
-}
-
-- (NSString*)description {
- NSMutableString* description = [NSMutableString stringWithString:[super description]];
- [description appendFormat:@"\n\n{%@}", _temporaryPath];
- return description;
-}
-
-@end
diff --git a/local-webserver/src/ios/GCDWebServer/GCDWebServer/Requests/GCDWebServerMultiPartFormRequest.h b/local-webserver/src/ios/GCDWebServer/GCDWebServer/Requests/GCDWebServerMultiPartFormRequest.h
deleted file mode 100644
index 832c2e7..0000000
--- a/local-webserver/src/ios/GCDWebServer/GCDWebServer/Requests/GCDWebServerMultiPartFormRequest.h
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- 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 "GCDWebServerRequest.h"
-
-/**
- * The GCDWebServerMultiPart class is an abstract class that wraps the content
- * of a part.
- */
-@interface GCDWebServerMultiPart : NSObject
-
-/**
- * Returns the control name retrieved from the part headers.
- */
-@property(nonatomic, readonly) NSString* controlName;
-
-/**
- * Returns the content type retrieved from the part headers or "text/plain"
- * if not available (per HTTP specifications).
- */
-@property(nonatomic, readonly) NSString* contentType;
-
-/**
- * Returns the MIME type component of the content type for the part.
- */
-@property(nonatomic, readonly) NSString* mimeType;
-
-@end
-
-/**
- * The GCDWebServerMultiPartArgument subclass of GCDWebServerMultiPart wraps
- * the content of a part as data in memory.
- */
-@interface GCDWebServerMultiPartArgument : GCDWebServerMultiPart
-
-/**
- * Returns the data for the part.
- */
-@property(nonatomic, readonly) NSData* data;
-
-/**
- * Returns the data for the part interpreted as text. If the content
- * type of the part is not a text one, or if an error occurs, nil is returned.
- *
- * The text encoding used to interpret the data is extracted from the
- * "Content-Type" header or defaults to UTF-8.
- */
-@property(nonatomic, readonly) NSString* string;
-
-@end
-
-/**
- * The GCDWebServerMultiPartFile subclass of GCDWebServerMultiPart wraps
- * the content of a part as a file on disk.
- */
-@interface GCDWebServerMultiPartFile : GCDWebServerMultiPart
-
-/**
- * Returns the file name retrieved from the part headers.
- */
-@property(nonatomic, readonly) NSString* fileName;
-
-/**
- * Returns the path to the temporary file containing the part data.
- *
- * @warning This temporary file will be automatically deleted when the
- * GCDWebServerMultiPartFile is deallocated. If you want to preserve this file,
- * you must move it to a different location beforehand.
- */
-@property(nonatomic, readonly) NSString* temporaryPath;
-
-@end
-
-/**
- * The GCDWebServerMultiPartFormRequest subclass of GCDWebServerRequest
- * parses the body of the HTTP request as a multipart encoded form.
- */
-@interface GCDWebServerMultiPartFormRequest : GCDWebServerRequest
-
-/**
- * Returns the argument parts from the multipart encoded form as
- * name / GCDWebServerMultiPartArgument pairs.
- */
-@property(nonatomic, readonly) NSArray* arguments;
-
-/**
- * Returns the files parts from the multipart encoded form as
- * name / GCDWebServerMultiPartFile pairs.
- */
-@property(nonatomic, readonly) NSArray* files;
-
-/**
- * Returns the MIME type for multipart encoded forms
- * i.e. "multipart/form-data".
- */
-+ (NSString*)mimeType;
-
-/**
- * Returns the first argument for a given control name or nil if not found.
- */
-- (GCDWebServerMultiPartArgument*)firstArgumentForControlName:(NSString*)name;
-
-/**
- * Returns the first file for a given control name or nil if not found.
- */
-- (GCDWebServerMultiPartFile*)firstFileForControlName:(NSString*)name;
-
-@end
diff --git a/local-webserver/src/ios/GCDWebServer/GCDWebServer/Requests/GCDWebServerMultiPartFormRequest.m b/local-webserver/src/ios/GCDWebServer/GCDWebServer/Requests/GCDWebServerMultiPartFormRequest.m
deleted file mode 100644
index c2fc9bf..0000000
--- a/local-webserver/src/ios/GCDWebServer/GCDWebServer/Requests/GCDWebServerMultiPartFormRequest.m
+++ /dev/null
@@ -1,445 +0,0 @@
-/*
- 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.
- */
-
-#if !__has_feature(objc_arc)
-#error GCDWebServer requires ARC
-#endif
-
-#import "GCDWebServerPrivate.h"
-
-#define kMultiPartBufferSize (256 * 1024)
-
-typedef enum {
- kParserState_Undefined = 0,
- kParserState_Start,
- kParserState_Headers,
- kParserState_Content,
- kParserState_End
-} ParserState;
-
-@interface GCDWebServerMIMEStreamParser : NSObject
-- (id)initWithBoundary:(NSString*)boundary defaultControlName:(NSString*)name arguments:(NSMutableArray*)arguments files:(NSMutableArray*)files;
-- (BOOL)appendBytes:(const void*)bytes length:(NSUInteger)length;
-- (BOOL)isAtEnd;
-@end
-
-static NSData* _newlineData = nil;
-static NSData* _newlinesData = nil;
-static NSData* _dashNewlineData = nil;
-
-@interface GCDWebServerMultiPart () {
-@private
- NSString* _controlName;
- NSString* _contentType;
- NSString* _mimeType;
-}
-@end
-
-@implementation GCDWebServerMultiPart
-
-@synthesize controlName=_controlName, contentType=_contentType, mimeType=_mimeType;
-
-- (id)initWithControlName:(NSString*)name contentType:(NSString*)type {
- if ((self = [super init])) {
- _controlName = [name copy];
- _contentType = [type copy];
- _mimeType = GCDWebServerTruncateHeaderValue(_contentType);
- }
- return self;
-}
-
-@end
-
-@interface GCDWebServerMultiPartArgument () {
-@private
- NSData* _data;
- NSString* _string;
-}
-@end
-
-@implementation GCDWebServerMultiPartArgument
-
-@synthesize data=_data, string=_string;
-
-- (id)initWithControlName:(NSString*)name contentType:(NSString*)type data:(NSData*)data {
- if ((self = [super initWithControlName:name contentType:type])) {
- _data = data;
-
- if ([self.contentType hasPrefix:@"text/"]) {
- NSString* charset = GCDWebServerExtractHeaderValueParameter(self.contentType, @"charset");
- _string = [[NSString alloc] initWithData:_data encoding:GCDWebServerStringEncodingFromCharset(charset)];
- }
- }
- return self;
-}
-
-- (NSString*)description {
- return [NSString stringWithFormat:@"<%@ | '%@' | %lu bytes>", [self class], self.mimeType, (unsigned long)_data.length];
-}
-
-@end
-
-@interface GCDWebServerMultiPartFile () {
-@private
- NSString* _fileName;
- NSString* _temporaryPath;
-}
-@end
-
-@implementation GCDWebServerMultiPartFile
-
-@synthesize fileName=_fileName, temporaryPath=_temporaryPath;
-
-- (id)initWithControlName:(NSString*)name contentType:(NSString*)type fileName:(NSString*)fileName temporaryPath:(NSString*)temporaryPath {
- if ((self = [super initWithControlName:name contentType:type])) {
- _fileName = [fileName copy];
- _temporaryPath = [temporaryPath copy];
- }
- return self;
-}
-
-- (void)dealloc {
- unlink([_temporaryPath fileSystemRepresentation]);
-}
-
-- (NSString*)description {
- return [NSString stringWithFormat:@"<%@ | '%@' | '%@>'", [self class], self.mimeType, _fileName];
-}
-
-@end
-
-@interface GCDWebServerMIMEStreamParser () {
-@private
- NSData* _boundary;
- NSString* _defaultcontrolName;
- ParserState _state;
- NSMutableData* _data;
- NSMutableArray* _arguments;
- NSMutableArray* _files;
-
- NSString* _controlName;
- NSString* _fileName;
- NSString* _contentType;
- NSString* _tmpPath;
- int _tmpFile;
- GCDWebServerMIMEStreamParser* _subParser;
-}
-@end
-
-@implementation GCDWebServerMIMEStreamParser
-
-+ (void)initialize {
- if (_newlineData == nil) {
- _newlineData = [[NSData alloc] initWithBytes:"\r\n" length:2];
- GWS_DCHECK(_newlineData);
- }
- if (_newlinesData == nil) {
- _newlinesData = [[NSData alloc] initWithBytes:"\r\n\r\n" length:4];
- GWS_DCHECK(_newlinesData);
- }
- if (_dashNewlineData == nil) {
- _dashNewlineData = [[NSData alloc] initWithBytes:"--\r\n" length:4];
- GWS_DCHECK(_dashNewlineData);
- }
-}
-
-- (id)initWithBoundary:(NSString*)boundary defaultControlName:(NSString*)name arguments:(NSMutableArray*)arguments files:(NSMutableArray*)files {
- NSData* data = boundary.length ? [[NSString stringWithFormat:@"--%@", boundary] dataUsingEncoding:NSASCIIStringEncoding] : nil;
- if (data == nil) {
- GWS_DNOT_REACHED();
- return nil;
- }
- if ((self = [super init])) {
- _boundary = data;
- _defaultcontrolName = name;
- _arguments = arguments;
- _files = files;
- _data = [[NSMutableData alloc] initWithCapacity:kMultiPartBufferSize];
- _state = kParserState_Start;
- }
- return self;
-}
-
-- (void)dealloc {
- if (_tmpFile > 0) {
- close(_tmpFile);
- unlink([_tmpPath fileSystemRepresentation]);
- }
-}
-
-// http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2
-- (BOOL)_parseData {
- BOOL success = YES;
-
- if (_state == kParserState_Headers) {
- NSRange range = [_data rangeOfData:_newlinesData options:0 range:NSMakeRange(0, _data.length)];
- if (range.location != NSNotFound) {
-
- _controlName = nil;
- _fileName = nil;
- _contentType = nil;
- _tmpPath = nil;
- _subParser = nil;
- NSString* headers = [[NSString alloc] initWithData:[_data subdataWithRange:NSMakeRange(0, range.location)] encoding:NSUTF8StringEncoding];
- if (headers) {
- for (NSString* header in [headers componentsSeparatedByString:@"\r\n"]) {
- NSRange subRange = [header rangeOfString:@":"];
- if (subRange.location != NSNotFound) {
- NSString* name = [header substringToIndex:subRange.location];
- NSString* value = [[header substringFromIndex:(subRange.location + subRange.length)] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
- if ([name caseInsensitiveCompare:@"Content-Type"] == NSOrderedSame) {
- _contentType = GCDWebServerNormalizeHeaderValue(value);
- } else if ([name caseInsensitiveCompare:@"Content-Disposition"] == NSOrderedSame) {
- NSString* contentDisposition = GCDWebServerNormalizeHeaderValue(value);
- if ([GCDWebServerTruncateHeaderValue(contentDisposition) isEqualToString:@"form-data"]) {
- _controlName = GCDWebServerExtractHeaderValueParameter(contentDisposition, @"name");
- _fileName = GCDWebServerExtractHeaderValueParameter(contentDisposition, @"filename");
- } else if ([GCDWebServerTruncateHeaderValue(contentDisposition) isEqualToString:@"file"]) {
- _controlName = _defaultcontrolName;
- _fileName = GCDWebServerExtractHeaderValueParameter(contentDisposition, @"filename");
- }
- }
- } else {
- GWS_DNOT_REACHED();
- }
- }
- if (_contentType == nil) {
- _contentType = @"text/plain";
- }
- } else {
- GWS_LOG_ERROR(@"Failed decoding headers in part of 'multipart/form-data'");
- GWS_DNOT_REACHED();
- }
- if (_controlName) {
- if ([GCDWebServerTruncateHeaderValue(_contentType) isEqualToString:@"multipart/mixed"]) {
- NSString* boundary = GCDWebServerExtractHeaderValueParameter(_contentType, @"boundary");
- _subParser = [[GCDWebServerMIMEStreamParser alloc] initWithBoundary:boundary defaultControlName:_controlName arguments:_arguments files:_files];
- if (_subParser == nil) {
- GWS_DNOT_REACHED();
- success = NO;
- }
- } else if (_fileName) {
- NSString* path = [NSTemporaryDirectory() stringByAppendingPathComponent:[[NSProcessInfo processInfo] globallyUniqueString]];
- _tmpFile = open([path fileSystemRepresentation], O_CREAT | O_TRUNC | O_WRONLY, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
- if (_tmpFile > 0) {
- _tmpPath = [path copy];
- } else {
- GWS_DNOT_REACHED();
- success = NO;
- }
- }
- } else {
- GWS_DNOT_REACHED();
- success = NO;
- }
-
- [_data replaceBytesInRange:NSMakeRange(0, range.location + range.length) withBytes:NULL length:0];
- _state = kParserState_Content;
- }
- }
-
- if ((_state == kParserState_Start) || (_state == kParserState_Content)) {
- NSRange range = [_data rangeOfData:_boundary options:0 range:NSMakeRange(0, _data.length)];
- if (range.location != NSNotFound) {
- NSRange subRange = NSMakeRange(range.location + range.length, _data.length - range.location - range.length);
- NSRange subRange1 = [_data rangeOfData:_newlineData options:NSDataSearchAnchored range:subRange];
- NSRange subRange2 = [_data rangeOfData:_dashNewlineData options:NSDataSearchAnchored range:subRange];
- if ((subRange1.location != NSNotFound) || (subRange2.location != NSNotFound)) {
-
- if (_state == kParserState_Content) {
- const void* dataBytes = _data.bytes;
- NSUInteger dataLength = range.location - 2;
- if (_subParser) {
- if (![_subParser appendBytes:dataBytes length:(dataLength + 2)] || ![_subParser isAtEnd]) {
- GWS_DNOT_REACHED();
- success = NO;
- }
- _subParser = nil;
- } else if (_tmpPath) {
- ssize_t result = write(_tmpFile, dataBytes, dataLength);
- if (result == (ssize_t)dataLength) {
- if (close(_tmpFile) == 0) {
- _tmpFile = 0;
- GCDWebServerMultiPartFile* file = [[GCDWebServerMultiPartFile alloc] initWithControlName:_controlName contentType:_contentType fileName:_fileName temporaryPath:_tmpPath];
- [_files addObject:file];
- } else {
- GWS_DNOT_REACHED();
- success = NO;
- }
- } else {
- GWS_DNOT_REACHED();
- success = NO;
- }
- _tmpPath = nil;
- } else {
- NSData* data = [[NSData alloc] initWithBytes:(void*)dataBytes length:dataLength];
- GCDWebServerMultiPartArgument* argument = [[GCDWebServerMultiPartArgument alloc] initWithControlName:_controlName contentType:_contentType data:data];
- [_arguments addObject:argument];
- }
- }
-
- if (subRange1.location != NSNotFound) {
- [_data replaceBytesInRange:NSMakeRange(0, subRange1.location + subRange1.length) withBytes:NULL length:0];
- _state = kParserState_Headers;
- success = [self _parseData];
- } else {
- _state = kParserState_End;
- }
- }
- } else {
- NSUInteger margin = 2 * _boundary.length;
- if (_data.length > margin) {
- NSUInteger length = _data.length - margin;
- if (_subParser) {
- if ([_subParser appendBytes:_data.bytes length:length]) {
- [_data replaceBytesInRange:NSMakeRange(0, length) withBytes:NULL length:0];
- } else {
- GWS_DNOT_REACHED();
- success = NO;
- }
- } else if (_tmpPath) {
- ssize_t result = write(_tmpFile, _data.bytes, length);
- if (result == (ssize_t)length) {
- [_data replaceBytesInRange:NSMakeRange(0, length) withBytes:NULL length:0];
- } else {
- GWS_DNOT_REACHED();
- success = NO;
- }
- }
- }
- }
- }
-
- return success;
-}
-
-- (BOOL)appendBytes:(const void*)bytes length:(NSUInteger)length {
- [_data appendBytes:bytes length:length];
- return [self _parseData];
-}
-
-- (BOOL)isAtEnd {
- return (_state == kParserState_End);
-}
-
-@end
-
-@interface GCDWebServerMultiPartFormRequest () {
-@private
- GCDWebServerMIMEStreamParser* _parser;
- NSMutableArray* _arguments;
- NSMutableArray* _files;
-}
-@end
-
-@implementation GCDWebServerMultiPartFormRequest
-
-@synthesize arguments=_arguments, files=_files;
-
-+ (NSString*)mimeType {
- return @"multipart/form-data";
-}
-
-- (instancetype)initWithMethod:(NSString*)method url:(NSURL*)url headers:(NSDictionary*)headers path:(NSString*)path query:(NSDictionary*)query {
- if ((self = [super initWithMethod:method url:url headers:headers path:path query:query])) {
- _arguments = [[NSMutableArray alloc] init];
- _files = [[NSMutableArray alloc] init];
- }
- return self;
-}
-
-- (BOOL)open:(NSError**)error {
- NSString* boundary = GCDWebServerExtractHeaderValueParameter(self.contentType, @"boundary");
- _parser = [[GCDWebServerMIMEStreamParser alloc] initWithBoundary:boundary defaultControlName:nil arguments:_arguments files:_files];
- if (_parser == nil) {
- if (error) {
- *error = [NSError errorWithDomain:kGCDWebServerErrorDomain code:-1 userInfo:@{NSLocalizedDescriptionKey: @"Failed starting to parse multipart form data"}];
- }
- return NO;
- }
- return YES;
-}
-
-- (BOOL)writeData:(NSData*)data error:(NSError**)error {
- if (![_parser appendBytes:data.bytes length:data.length]) {
- if (error) {
- *error = [NSError errorWithDomain:kGCDWebServerErrorDomain code:-1 userInfo:@{NSLocalizedDescriptionKey: @"Failed continuing to parse multipart form data"}];
- }
- return NO;
- }
- return YES;
-}
-
-- (BOOL)close:(NSError**)error {
- BOOL atEnd = [_parser isAtEnd];
- _parser = nil;
- if (!atEnd) {
- if (error) {
- *error = [NSError errorWithDomain:kGCDWebServerErrorDomain code:-1 userInfo:@{NSLocalizedDescriptionKey: @"Failed finishing to parse multipart form data"}];
- }
- return NO;
- }
- return YES;
-}
-
-- (GCDWebServerMultiPartArgument*)firstArgumentForControlName:(NSString*)name {
- for (GCDWebServerMultiPartArgument* argument in _arguments) {
- if ([argument.controlName isEqualToString:name]) {
- return argument;
- }
- }
- return nil;
-}
-
-- (GCDWebServerMultiPartFile*)firstFileForControlName:(NSString*)name {
- for (GCDWebServerMultiPartFile* file in _files) {
- if ([file.controlName isEqualToString:name]) {
- return file;
- }
- }
- return nil;
-}
-
-- (NSString*)description {
- NSMutableString* description = [NSMutableString stringWithString:[super description]];
- if (_arguments.count) {
- [description appendString:@"\n"];
- for (GCDWebServerMultiPartArgument* argument in _arguments) {
- [description appendFormat:@"\n%@ (%@)\n", argument.controlName, argument.contentType];
- [description appendString:GCDWebServerDescribeData(argument.data, argument.contentType)];
- }
- }
- if (_files.count) {
- [description appendString:@"\n"];
- for (GCDWebServerMultiPartFile* file in _files) {
- [description appendFormat:@"\n%@ (%@): %@\n{%@}", file.controlName, file.contentType, file.fileName, file.temporaryPath];
- }
- }
- return description;
-}
-
-@end
diff --git a/local-webserver/src/ios/GCDWebServer/GCDWebServer/Requests/GCDWebServerURLEncodedFormRequest.h b/local-webserver/src/ios/GCDWebServer/GCDWebServer/Requests/GCDWebServerURLEncodedFormRequest.h
deleted file mode 100644
index 9735380..0000000
--- a/local-webserver/src/ios/GCDWebServer/GCDWebServer/Requests/GCDWebServerURLEncodedFormRequest.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- 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 "GCDWebServerDataRequest.h"
-
-/**
- * The GCDWebServerURLEncodedFormRequest subclass of GCDWebServerRequest
- * parses the body of the HTTP request as a URL encoded form using
- * GCDWebServerParseURLEncodedForm().
- */
-@interface GCDWebServerURLEncodedFormRequest : GCDWebServerDataRequest
-
-/**
- * Returns the unescaped control names and values for the URL encoded form.
- *
- * The text encoding used to interpret the data is extracted from the
- * "Content-Type" header or defaults to UTF-8.
- */
-@property(nonatomic, readonly) NSDictionary* arguments;
-
-/**
- * Returns the MIME type for URL encoded forms
- * i.e. "application/x-www-form-urlencoded".
- */
-+ (NSString*)mimeType;
-
-@end
diff --git a/local-webserver/src/ios/GCDWebServer/GCDWebServer/Requests/GCDWebServerURLEncodedFormRequest.m b/local-webserver/src/ios/GCDWebServer/GCDWebServer/Requests/GCDWebServerURLEncodedFormRequest.m
deleted file mode 100644
index 2c5fcc5..0000000
--- a/local-webserver/src/ios/GCDWebServer/GCDWebServer/Requests/GCDWebServerURLEncodedFormRequest.m
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- 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.
- */
-
-#if !__has_feature(objc_arc)
-#error GCDWebServer requires ARC
-#endif
-
-#import "GCDWebServerPrivate.h"
-
-@interface GCDWebServerURLEncodedFormRequest () {
-@private
- NSDictionary* _arguments;
-}
-@end
-
-@implementation GCDWebServerURLEncodedFormRequest
-
-@synthesize arguments=_arguments;
-
-+ (NSString*)mimeType {
- return @"application/x-www-form-urlencoded";
-}
-
-- (BOOL)close:(NSError**)error {
- if (![super close:error]) {
- return NO;
- }
-
- NSString* charset = GCDWebServerExtractHeaderValueParameter(self.contentType, @"charset");
- NSString* string = [[NSString alloc] initWithData:self.data encoding:GCDWebServerStringEncodingFromCharset(charset)];
- _arguments = GCDWebServerParseURLEncodedForm(string);
- GWS_DCHECK(_arguments);
-
- return YES;
-}
-
-- (NSString*)description {
- NSMutableString* description = [NSMutableString stringWithString:[super description]];
- [description appendString:@"\n"];
- for (NSString* argument in [[_arguments allKeys] sortedArrayUsingSelector:@selector(compare:)]) {
- [description appendFormat:@"\n%@ = %@", argument, [_arguments objectForKey:argument]];
- }
- return description;
-}
-
-@end
diff --git a/local-webserver/src/ios/GCDWebServer/GCDWebServer/Responses/GCDWebServerDataResponse.h b/local-webserver/src/ios/GCDWebServer/GCDWebServer/Responses/GCDWebServerDataResponse.h
deleted file mode 100644
index 6e06cd8..0000000
--- a/local-webserver/src/ios/GCDWebServer/GCDWebServer/Responses/GCDWebServerDataResponse.h
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- 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 "GCDWebServerResponse.h"
-
-/**
- * The GCDWebServerDataResponse subclass of GCDWebServerResponse reads the body
- * of the HTTP response from memory.
- */
-@interface GCDWebServerDataResponse : GCDWebServerResponse
-
-/**
- * Creates a response with data in memory and a given content type.
- */
-+ (instancetype)responseWithData:(NSData*)data contentType:(NSString*)type;
-
-/**
- * This method is the designated initializer for the class.
- */
-- (instancetype)initWithData:(NSData*)data contentType:(NSString*)type;
-
-@end
-
-@interface GCDWebServerDataResponse (Extensions)
-
-/**
- * Creates a data response from text encoded using UTF-8.
- */
-+ (instancetype)responseWithText:(NSString*)text;
-
-/**
- * Creates a data response from HTML encoded using UTF-8.
- */
-+ (instancetype)responseWithHTML:(NSString*)html;
-
-/**
- * Creates a data response from an HTML template encoded using UTF-8.
- * See -initWithHTMLTemplate:variables: for details.
- */
-+ (instancetype)responseWithHTMLTemplate:(NSString*)path variables:(NSDictionary*)variables;
-
-/**
- * Creates a data response from a serialized JSON object and the default
- * "application/json" content type.
- */
-+ (instancetype)responseWithJSONObject:(id)object;
-
-/**
- * Creates a data response from a serialized JSON object and a custom
- * content type.
- */
-+ (instancetype)responseWithJSONObject:(id)object contentType:(NSString*)type;
-
-/**
- * Initializes a data response from text encoded using UTF-8.
- */
-- (instancetype)initWithText:(NSString*)text;
-
-/**
- * Initializes a data response from HTML encoded using UTF-8.
- */
-- (instancetype)initWithHTML:(NSString*)html;
-
-/**
- * Initializes a data response from an HTML template encoded using UTF-8.
- *
- * All occurences of "%variable%" within the HTML template are replaced with
- * their corresponding values.
- */
-- (instancetype)initWithHTMLTemplate:(NSString*)path variables:(NSDictionary*)variables;
-
-/**
- * Initializes a data response from a serialized JSON object and the default
- * "application/json" content type.
- */
-- (instancetype)initWithJSONObject:(id)object;
-
-/**
- * Initializes a data response from a serialized JSON object and a custom
- * content type.
- */
-- (instancetype)initWithJSONObject:(id)object contentType:(NSString*)type;
-
-@end
diff --git a/local-webserver/src/ios/GCDWebServer/GCDWebServer/Responses/GCDWebServerDataResponse.m b/local-webserver/src/ios/GCDWebServer/GCDWebServer/Responses/GCDWebServerDataResponse.m
deleted file mode 100644
index 12cd12b..0000000
--- a/local-webserver/src/ios/GCDWebServer/GCDWebServer/Responses/GCDWebServerDataResponse.m
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- 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.
- */
-
-#if !__has_feature(objc_arc)
-#error GCDWebServer requires ARC
-#endif
-
-#import "GCDWebServerPrivate.h"
-
-@interface GCDWebServerDataResponse () {
-@private
- NSData* _data;
- BOOL _done;
-}
-@end
-
-@implementation GCDWebServerDataResponse
-
-+ (instancetype)responseWithData:(NSData*)data contentType:(NSString*)type {
- return [[[self class] alloc] initWithData:data contentType:type];
-}
-
-- (instancetype)initWithData:(NSData*)data contentType:(NSString*)type {
- if (data == nil) {
- GWS_DNOT_REACHED();
- return nil;
- }
-
- if ((self = [super init])) {
- _data = data;
-
- self.contentType = type;
- self.contentLength = data.length;
- }
- return self;
-}
-
-- (NSData*)readData:(NSError**)error {
- NSData* data;
- if (_done) {
- data = [NSData data];
- } else {
- data = _data;
- _done = YES;
- }
- return data;
-}
-
-- (NSString*)description {
- NSMutableString* description = [NSMutableString stringWithString:[super description]];
- [description appendString:@"\n\n"];
- [description appendString:GCDWebServerDescribeData(_data, self.contentType)];
- return description;
-}
-
-@end
-
-@implementation GCDWebServerDataResponse (Extensions)
-
-+ (instancetype)responseWithText:(NSString*)text {
- return [[self alloc] initWithText:text];
-}
-
-+ (instancetype)responseWithHTML:(NSString*)html {
- return [[self alloc] initWithHTML:html];
-}
-
-+ (instancetype)responseWithHTMLTemplate:(NSString*)path variables:(NSDictionary*)variables {
- return [[self alloc] initWithHTMLTemplate:path variables:variables];
-}
-
-+ (instancetype)responseWithJSONObject:(id)object {
- return [[self alloc] initWithJSONObject:object];
-}
-
-+ (instancetype)responseWithJSONObject:(id)object contentType:(NSString*)type {
- return [[self alloc] initWithJSONObject:object contentType:type];
-}
-
-- (instancetype)initWithText:(NSString*)text {
- NSData* data = [text dataUsingEncoding:NSUTF8StringEncoding];
- if (data == nil) {
- GWS_DNOT_REACHED();
- return nil;
- }
- return [self initWithData:data contentType:@"text/plain; charset=utf-8"];
-}
-
-- (instancetype)initWithHTML:(NSString*)html {
- NSData* data = [html dataUsingEncoding:NSUTF8StringEncoding];
- if (data == nil) {
- GWS_DNOT_REACHED();
- return nil;
- }
- return [self initWithData:data contentType:@"text/html; charset=utf-8"];
-}
-
-- (instancetype)initWithHTMLTemplate:(NSString*)path variables:(NSDictionary*)variables {
- NSMutableString* html = [[NSMutableString alloc] initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:NULL];
- [variables enumerateKeysAndObjectsUsingBlock:^(NSString* key, NSString* value, BOOL* stop) {
- [html replaceOccurrencesOfString:[NSString stringWithFormat:@"%%%@%%", key] withString:value options:0 range:NSMakeRange(0, html.length)];
- }];
- id response = [self initWithHTML:html];
- return response;
-}
-
-- (instancetype)initWithJSONObject:(id)object {
- return [self initWithJSONObject:object contentType:@"application/json"];
-}
-
-- (instancetype)initWithJSONObject:(id)object contentType:(NSString*)type {
- NSData* data = [NSJSONSerialization dataWithJSONObject:object options:0 error:NULL];
- if (data == nil) {
- return nil;
- }
- return [self initWithData:data contentType:type];
-}
-
-@end
diff --git a/local-webserver/src/ios/GCDWebServer/GCDWebServer/Responses/GCDWebServerErrorResponse.h b/local-webserver/src/ios/GCDWebServer/GCDWebServer/Responses/GCDWebServerErrorResponse.h
deleted file mode 100644
index dad0114..0000000
--- a/local-webserver/src/ios/GCDWebServer/GCDWebServer/Responses/GCDWebServerErrorResponse.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- 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 "GCDWebServerDataResponse.h"
-#import "GCDWebServerHTTPStatusCodes.h"
-
-/**
- * The GCDWebServerDataResponse subclass of GCDWebServerDataResponse generates
- * an HTML body from an HTTP status code and an error message.
- */
-@interface GCDWebServerErrorResponse : GCDWebServerDataResponse
-
-/**
- * Creates a client error response with the corresponding HTTP status code.
- */
-+ (instancetype)responseWithClientError:(GCDWebServerClientErrorHTTPStatusCode)errorCode message:(NSString*)format, ... NS_FORMAT_FUNCTION(2,3);
-
-/**
- * Creates a server error response with the corresponding HTTP status code.
- */
-+ (instancetype)responseWithServerError:(GCDWebServerServerErrorHTTPStatusCode)errorCode message:(NSString*)format, ... NS_FORMAT_FUNCTION(2,3);
-
-/**
- * Creates a client error response with the corresponding HTTP status code
- * and an underlying NSError.
- */
-+ (instancetype)responseWithClientError:(GCDWebServerClientErrorHTTPStatusCode)errorCode underlyingError:(NSError*)underlyingError message:(NSString*)format, ... NS_FORMAT_FUNCTION(3,4);
-
-/**
- * Creates a server error response with the corresponding HTTP status code
- * and an underlying NSError.
- */
-+ (instancetype)responseWithServerError:(GCDWebServerServerErrorHTTPStatusCode)errorCode underlyingError:(NSError*)underlyingError message:(NSString*)format, ... NS_FORMAT_FUNCTION(3,4);
-
-/**
- * Initializes a client error response with the corresponding HTTP status code.
- */
-- (instancetype)initWithClientError:(GCDWebServerClientErrorHTTPStatusCode)errorCode message:(NSString*)format, ... NS_FORMAT_FUNCTION(2,3);
-
-/**
- * Initializes a server error response with the corresponding HTTP status code.
- */
-- (instancetype)initWithServerError:(GCDWebServerServerErrorHTTPStatusCode)errorCode message:(NSString*)format, ... NS_FORMAT_FUNCTION(2,3);
-
-/**
- * Initializes a client error response with the corresponding HTTP status code
- * and an underlying NSError.
- */
-- (instancetype)initWithClientError:(GCDWebServerClientErrorHTTPStatusCode)errorCode underlyingError:(NSError*)underlyingError message:(NSString*)format, ... NS_FORMAT_FUNCTION(3,4);
-
-/**
- * Initializes a server error response with the corresponding HTTP status code
- * and an underlying NSError.
- */
-- (instancetype)initWithServerError:(GCDWebServerServerErrorHTTPStatusCode)errorCode underlyingError:(NSError*)underlyingError message:(NSString*)format, ... NS_FORMAT_FUNCTION(3,4);
-
-@end
diff --git a/local-webserver/src/ios/GCDWebServer/GCDWebServer/Responses/GCDWebServerErrorResponse.m b/local-webserver/src/ios/GCDWebServer/GCDWebServer/Responses/GCDWebServerErrorResponse.m
deleted file mode 100644
index ef6a991..0000000
--- a/local-webserver/src/ios/GCDWebServer/GCDWebServer/Responses/GCDWebServerErrorResponse.m
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- 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.
- */
-
-#if !__has_feature(objc_arc)
-#error GCDWebServer requires ARC
-#endif
-
-#import "GCDWebServerPrivate.h"
-
-@interface GCDWebServerErrorResponse ()
-- (instancetype)initWithStatusCode:(NSInteger)statusCode underlyingError:(NSError*)underlyingError messageFormat:(NSString*)format arguments:(va_list)arguments;
-@end
-
-@implementation GCDWebServerErrorResponse
-
-+ (instancetype)responseWithClientError:(GCDWebServerClientErrorHTTPStatusCode)errorCode message:(NSString*)format, ... {
- GWS_DCHECK(((NSInteger)errorCode >= 400) && ((NSInteger)errorCode < 500));
- va_list arguments;
- va_start(arguments, format);
- GCDWebServerErrorResponse* response = [[self alloc] initWithStatusCode:errorCode underlyingError:nil messageFormat:format arguments:arguments];
- va_end(arguments);
- return response;
-}
-
-+ (instancetype)responseWithServerError:(GCDWebServerServerErrorHTTPStatusCode)errorCode message:(NSString*)format, ... {
- GWS_DCHECK(((NSInteger)errorCode >= 500) && ((NSInteger)errorCode < 600));
- va_list arguments;
- va_start(arguments, format);
- GCDWebServerErrorResponse* response = [[self alloc] initWithStatusCode:errorCode underlyingError:nil messageFormat:format arguments:arguments];
- va_end(arguments);
- return response;
-}
-
-+ (instancetype)responseWithClientError:(GCDWebServerClientErrorHTTPStatusCode)errorCode underlyingError:(NSError*)underlyingError message:(NSString*)format, ... {
- GWS_DCHECK(((NSInteger)errorCode >= 400) && ((NSInteger)errorCode < 500));
- va_list arguments;
- va_start(arguments, format);
- GCDWebServerErrorResponse* response = [[self alloc] initWithStatusCode:errorCode underlyingError:underlyingError messageFormat:format arguments:arguments];
- va_end(arguments);
- return response;
-}
-
-+ (instancetype)responseWithServerError:(GCDWebServerServerErrorHTTPStatusCode)errorCode underlyingError:(NSError*)underlyingError message:(NSString*)format, ... {
- GWS_DCHECK(((NSInteger)errorCode >= 500) && ((NSInteger)errorCode < 600));
- va_list arguments;
- va_start(arguments, format);
- GCDWebServerErrorResponse* response = [[self alloc] initWithStatusCode:errorCode underlyingError:underlyingError messageFormat:format arguments:arguments];
- va_end(arguments);
- return response;
-}
-
-static inline NSString* _EscapeHTMLString(NSString* string) {
- return [string stringByReplacingOccurrencesOfString:@"\"" withString:@"""];
-}
-
-- (instancetype)initWithStatusCode:(NSInteger)statusCode underlyingError:(NSError*)underlyingError messageFormat:(NSString*)format arguments:(va_list)arguments {
- NSString* message = [[NSString alloc] initWithFormat:format arguments:arguments];
- NSString* title = [NSString stringWithFormat:@"HTTP Error %i", (int)statusCode];
- NSString* error = underlyingError ? [NSString stringWithFormat:@"[%@] %@ (%li)", underlyingError.domain, _EscapeHTMLString(underlyingError.localizedDescription), (long)underlyingError.code] : @"";
- NSString* html = [NSString stringWithFormat:@"<!DOCTYPE html><html lang=\"en\"><head><meta charset=\"utf-8\"><title>%@</title></head><body><h1>%@: %@</h1><h3>%@</h3></body></html>",
- title, title, _EscapeHTMLString(message), error];
- if ((self = [self initWithHTML:html])) {
- self.statusCode = statusCode;
- }
- return self;
-}
-
-- (instancetype)initWithClientError:(GCDWebServerClientErrorHTTPStatusCode)errorCode message:(NSString*)format, ... {
- GWS_DCHECK(((NSInteger)errorCode >= 400) && ((NSInteger)errorCode < 500));
- va_list arguments;
- va_start(arguments, format);
- self = [self initWithStatusCode:errorCode underlyingError:nil messageFormat:format arguments:arguments];
- va_end(arguments);
- return self;
-}
-
-- (instancetype)initWithServerError:(GCDWebServerServerErrorHTTPStatusCode)errorCode message:(NSString*)format, ... {
- GWS_DCHECK(((NSInteger)errorCode >= 500) && ((NSInteger)errorCode < 600));
- va_list arguments;
- va_start(arguments, format);
- self = [self initWithStatusCode:errorCode underlyingError:nil messageFormat:format arguments:arguments];
- va_end(arguments);
- return self;
-}
-
-- (instancetype)initWithClientError:(GCDWebServerClientErrorHTTPStatusCode)errorCode underlyingError:(NSError*)underlyingError message:(NSString*)format, ... {
- GWS_DCHECK(((NSInteger)errorCode >= 400) && ((NSInteger)errorCode < 500));
- va_list arguments;
- va_start(arguments, format);
- self = [self initWithStatusCode:errorCode underlyingError:underlyingError messageFormat:format arguments:arguments];
- va_end(arguments);
- return self;
-}
-
-- (instancetype)initWithServerError:(GCDWebServerServerErrorHTTPStatusCode)errorCode underlyingError:(NSError*)underlyingError message:(NSString*)format, ... {
- GWS_DCHECK(((NSInteger)errorCode >= 500) && ((NSInteger)errorCode < 600));
- va_list arguments;
- va_start(arguments, format);
- self = [self initWithStatusCode:errorCode underlyingError:underlyingError messageFormat:format arguments:arguments];
- va_end(arguments);
- return self;
-}
-
-@end
diff --git a/local-webserver/src/ios/GCDWebServer/GCDWebServer/Responses/GCDWebServerFileResponse.h b/local-webserver/src/ios/GCDWebServer/GCDWebServer/Responses/GCDWebServerFileResponse.h
deleted file mode 100644
index 050e92f..0000000
--- a/local-webserver/src/ios/GCDWebServer/GCDWebServer/Responses/GCDWebServerFileResponse.h
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- 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 "GCDWebServerResponse.h"
-
-/**
- * The GCDWebServerFileResponse subclass of GCDWebServerResponse reads the body
- * of the HTTP response from a file on disk.
- *
- * It will automatically set the contentType, lastModifiedDate and eTag
- * properties of the GCDWebServerResponse according to the file extension and
- * metadata.
- */
-@interface GCDWebServerFileResponse : GCDWebServerResponse
-
-/**
- * Creates a response with the contents of a file.
- */
-+ (instancetype)responseWithFile:(NSString*)path;
-
-/**
- * Creates a response like +responseWithFile: and sets the "Content-Disposition"
- * HTTP header for a download if the "attachment" argument is YES.
- */
-+ (instancetype)responseWithFile:(NSString*)path isAttachment:(BOOL)attachment;
-
-/**
- * Creates a response like +responseWithFile: but restricts the file contents
- * to a specific byte range.
- *
- * See -initWithFile:byteRange: for details.
- */
-+ (instancetype)responseWithFile:(NSString*)path byteRange:(NSRange)range;
-
-/**
- * Creates a response like +responseWithFile:byteRange: and sets the
- * "Content-Disposition" HTTP header for a download if the "attachment"
- * argument is YES.
- */
-+ (instancetype)responseWithFile:(NSString*)path byteRange:(NSRange)range isAttachment:(BOOL)attachment;
-
-/**
- * Initializes a response with the contents of a file.
- */
-- (instancetype)initWithFile:(NSString*)path;
-
-/**
- * Initializes a response like +responseWithFile: and sets the
- * "Content-Disposition" HTTP header for a download if the "attachment"
- * argument is YES.
- */
-- (instancetype)initWithFile:(NSString*)path isAttachment:(BOOL)attachment;
-
-/**
- * Initializes a response like -initWithFile: but restricts the file contents
- * to a specific byte range. This range should be set to (NSUIntegerMax, 0) for
- * the full file, (offset, length) if expressed from the beginning of the file,
- * or (NSUIntegerMax, length) if expressed from the end of the file. The "offset"
- * and "length" values will be automatically adjusted to be compatible with the
- * actual size of the file.
- *
- * This argument would typically be set to the value of the byteRange property
- * of the current GCDWebServerRequest.
- */
-- (instancetype)initWithFile:(NSString*)path byteRange:(NSRange)range;
-
-/**
- * This method is the designated initializer for the class.
- */
-- (instancetype)initWithFile:(NSString*)path byteRange:(NSRange)range isAttachment:(BOOL)attachment;
-
-@end
diff --git a/local-webserver/src/ios/GCDWebServer/GCDWebServer/Responses/GCDWebServerFileResponse.m b/local-webserver/src/ios/GCDWebServer/GCDWebServer/Responses/GCDWebServerFileResponse.m
deleted file mode 100644
index a2b7c3c..0000000
--- a/local-webserver/src/ios/GCDWebServer/GCDWebServer/Responses/GCDWebServerFileResponse.m
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- 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.
- */
-
-#if !__has_feature(objc_arc)
-#error GCDWebServer requires ARC
-#endif
-
-#import <sys/stat.h>
-
-#import "GCDWebServerPrivate.h"
-
-#define kFileReadBufferSize (32 * 1024)
-
-@interface GCDWebServerFileResponse () {
-@private
- NSString* _path;
- NSUInteger _offset;
- NSUInteger _size;
- int _file;
-}
-@end
-
-@implementation GCDWebServerFileResponse
-
-+ (instancetype)responseWithFile:(NSString*)path {
- return [[[self class] alloc] initWithFile:path];
-}
-
-+ (instancetype)responseWithFile:(NSString*)path isAttachment:(BOOL)attachment {
- return [[[self class] alloc] initWithFile:path isAttachment:attachment];
-}
-
-+ (instancetype)responseWithFile:(NSString*)path byteRange:(NSRange)range {
- return [[[self class] alloc] initWithFile:path byteRange:range];
-}
-
-+ (instancetype)responseWithFile:(NSString*)path byteRange:(NSRange)range isAttachment:(BOOL)attachment {
- return [[[self class] alloc] initWithFile:path byteRange:range isAttachment:attachment];
-}
-
-- (instancetype)initWithFile:(NSString*)path {
- return [self initWithFile:path byteRange:NSMakeRange(NSUIntegerMax, 0) isAttachment:NO];
-}
-
-- (instancetype)initWithFile:(NSString*)path isAttachment:(BOOL)attachment {
- return [self initWithFile:path byteRange:NSMakeRange(NSUIntegerMax, 0) isAttachment:attachment];
-}
-
-- (instancetype)initWithFile:(NSString*)path byteRange:(NSRange)range {
- return [self initWithFile:path byteRange:range isAttachment:NO];
-}
-
-static inline NSDate* _NSDateFromTimeSpec(const struct timespec* t) {
- return [NSDate dateWithTimeIntervalSince1970:((NSTimeInterval)t->tv_sec + (NSTimeInterval)t->tv_nsec / 1000000000.0)];
-}
-
-- (instancetype)initWithFile:(NSString*)path byteRange:(NSRange)range isAttachment:(BOOL)attachment {
- struct stat info;
- if (lstat([path fileSystemRepresentation], &info) || !(info.st_mode & S_IFREG)) {
- GWS_DNOT_REACHED();
- return nil;
- }
-#ifndef __LP64__
- if (info.st_size >= (off_t)4294967295) { // In 32 bit mode, we can't handle files greater than 4 GiBs (don't use "NSUIntegerMax" here to avoid potential unsigned to signed conversion issues)
- GWS_DNOT_REACHED();
- return nil;
- }
-#endif
- NSUInteger fileSize = (NSUInteger)info.st_size;
-
- BOOL hasByteRange = GCDWebServerIsValidByteRange(range);
- if (hasByteRange) {
- if (range.location != NSUIntegerMax) {
- range.location = MIN(range.location, fileSize);
- range.length = MIN(range.length, fileSize - range.location);
- } else {
- range.length = MIN(range.length, fileSize);
- range.location = fileSize - range.length;
- }
- if (range.length == 0) {
- return nil; // TODO: Return 416 status code and "Content-Range: bytes */{file length}" header
- }
- } else {
- range.location = 0;
- range.length = fileSize;
- }
-
- if ((self = [super init])) {
- _path = [path copy];
- _offset = range.location;
- _size = range.length;
- if (hasByteRange) {
- [self setStatusCode:kGCDWebServerHTTPStatusCode_PartialContent];
- [self setValue:[NSString stringWithFormat:@"bytes %lu-%lu/%lu", (unsigned long)_offset, (unsigned long)(_offset + _size - 1), (unsigned long)fileSize] forAdditionalHeader:@"Content-Range"];
- GWS_LOG_DEBUG(@"Using content bytes range [%lu-%lu] for file \"%@\"", (unsigned long)_offset, (unsigned long)(_offset + _size - 1), path);
- }
-
- if (attachment) {
- NSString* fileName = [path lastPathComponent];
- NSData* data = [[fileName stringByReplacingOccurrencesOfString:@"\"" withString:@""] dataUsingEncoding:NSISOLatin1StringEncoding allowLossyConversion:YES];
- NSString* lossyFileName = data ? [[NSString alloc] initWithData:data encoding:NSISOLatin1StringEncoding] : nil;
- if (lossyFileName) {
- NSString* value = [NSString stringWithFormat:@"attachment; filename=\"%@\"; filename*=UTF-8''%@", lossyFileName, GCDWebServerEscapeURLString(fileName)];
- [self setValue:value forAdditionalHeader:@"Content-Disposition"];
- } else {
- GWS_DNOT_REACHED();
- }
- }
-
- self.contentType = GCDWebServerGetMimeTypeForExtension([_path pathExtension]);
- self.contentLength = _size;
- self.lastModifiedDate = _NSDateFromTimeSpec(&info.st_mtimespec);
- self.eTag = [NSString stringWithFormat:@"%llu/%li/%li", info.st_ino, info.st_mtimespec.tv_sec, info.st_mtimespec.tv_nsec];
- }
- return self;
-}
-
-- (BOOL)open:(NSError**)error {
- _file = open([_path fileSystemRepresentation], O_NOFOLLOW | O_RDONLY);
- if (_file <= 0) {
- if (error) {
- *error = GCDWebServerMakePosixError(errno);
- }
- return NO;
- }
- if (lseek(_file, _offset, SEEK_SET) != (off_t)_offset) {
- if (error) {
- *error = GCDWebServerMakePosixError(errno);
- }
- close(_file);
- return NO;
- }
- return YES;
-}
-
-- (NSData*)readData:(NSError**)error {
- size_t length = MIN((NSUInteger)kFileReadBufferSize, _size);
- NSMutableData* data = [[NSMutableData alloc] initWithLength:length];
- ssize_t result = read(_file, data.mutableBytes, length);
- if (result < 0) {
- if (error) {
- *error = GCDWebServerMakePosixError(errno);
- }
- return nil;
- }
- if (result > 0) {
- [data setLength:result];
- _size -= result;
- }
- return data;
-}
-
-- (void)close {
- close(_file);
-}
-
-- (NSString*)description {
- NSMutableString* description = [NSMutableString stringWithString:[super description]];
- [description appendFormat:@"\n\n{%@}", _path];
- return description;
-}
-
-@end
diff --git a/local-webserver/src/ios/GCDWebServer/GCDWebServer/Responses/GCDWebServerStreamedResponse.h b/local-webserver/src/ios/GCDWebServer/GCDWebServer/Responses/GCDWebServerStreamedResponse.h
deleted file mode 100644
index 2731b7c..0000000
--- a/local-webserver/src/ios/GCDWebServer/GCDWebServer/Responses/GCDWebServerStreamedResponse.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- 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 "GCDWebServerResponse.h"
-
-/**
- * The GCDWebServerStreamBlock is called to stream the data for the HTTP body.
- * The block must return either a chunk of data, an empty NSData when done, or
- * nil on error and set the "error" argument which is guaranteed to be non-NULL.
- */
-typedef NSData* (^GCDWebServerStreamBlock)(NSError** error);
-
-/**
- * The GCDWebServerAsyncStreamBlock works like the GCDWebServerStreamBlock
- * except the streamed data can be returned at a later time allowing for
- * truly asynchronous generation of the data.
- *
- * The block must call "completionBlock" passing the new chunk of data when ready,
- * an empty NSData when done, or nil on error and pass a NSError.
- *
- * The block cannot call "completionBlock" more than once per invocation.
- */
-typedef void (^GCDWebServerAsyncStreamBlock)(GCDWebServerBodyReaderCompletionBlock completionBlock);
-
-/**
- * The GCDWebServerStreamedResponse subclass of GCDWebServerResponse streams
- * the body of the HTTP response using a GCD block.
- */
-@interface GCDWebServerStreamedResponse : GCDWebServerResponse
-
-/**
- * Creates a response with streamed data and a given content type.
- */
-+ (instancetype)responseWithContentType:(NSString*)type streamBlock:(GCDWebServerStreamBlock)block;
-
-/**
- * Creates a response with async streamed data and a given content type.
- */
-+ (instancetype)responseWithContentType:(NSString*)type asyncStreamBlock:(GCDWebServerAsyncStreamBlock)block;
-
-/**
- * Initializes a response with streamed data and a given content type.
- */
-- (instancetype)initWithContentType:(NSString*)type streamBlock:(GCDWebServerStreamBlock)block;
-
-/**
- * This method is the designated initializer for the class.
- */
-- (instancetype)initWithContentType:(NSString*)type asyncStreamBlock:(GCDWebServerAsyncStreamBlock)block;
-
-@end
diff --git a/local-webserver/src/ios/GCDWebServer/GCDWebServer/Responses/GCDWebServerStreamedResponse.m b/local-webserver/src/ios/GCDWebServer/GCDWebServer/Responses/GCDWebServerStreamedResponse.m
deleted file mode 100644
index 4669617..0000000
--- a/local-webserver/src/ios/GCDWebServer/GCDWebServer/Responses/GCDWebServerStreamedResponse.m
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- 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.
- */
-
-#if !__has_feature(objc_arc)
-#error GCDWebServer requires ARC
-#endif
-
-#import "GCDWebServerPrivate.h"
-
-@interface GCDWebServerStreamedResponse () {
-@private
- GCDWebServerAsyncStreamBlock _block;
-}
-@end
-
-@implementation GCDWebServerStreamedResponse
-
-+ (instancetype)responseWithContentType:(NSString*)type streamBlock:(GCDWebServerStreamBlock)block {
- return [[[self class] alloc] initWithContentType:type streamBlock:block];
-}
-
-+ (instancetype)responseWithContentType:(NSString*)type asyncStreamBlock:(GCDWebServerAsyncStreamBlock)block {
- return [[[self class] alloc] initWithContentType:type asyncStreamBlock:block];
-}
-
-- (instancetype)initWithContentType:(NSString*)type streamBlock:(GCDWebServerStreamBlock)block {
- return [self initWithContentType:type asyncStreamBlock:^(GCDWebServerBodyReaderCompletionBlock completionBlock) {
-
- NSError* error = nil;
- NSData* data = block(&error);
- completionBlock(data, error);
-
- }];
-}
-
-- (instancetype)initWithContentType:(NSString*)type asyncStreamBlock:(GCDWebServerAsyncStreamBlock)block {
- if ((self = [super init])) {
- _block = [block copy];
-
- self.contentType = type;
- }
- return self;
-}
-
-- (void)asyncReadDataWithCompletion:(GCDWebServerBodyReaderCompletionBlock)block {
- _block(block);
-}
-
-- (NSString*)description {
- NSMutableString* description = [NSMutableString stringWithString:[super description]];
- [description appendString:@"\n\n<STREAM>"];
- return description;
-}
-
-@end
diff --git a/local-webserver/src/ios/GCDWebServer/GCDWebUploader/GCDWebUploader.bundle/Info.plist b/local-webserver/src/ios/GCDWebServer/GCDWebUploader/GCDWebUploader.bundle/Info.plist
deleted file mode 100644
index e25dc75..0000000
--- a/local-webserver/src/ios/GCDWebServer/GCDWebUploader/GCDWebUploader.bundle/Info.plist
+++ /dev/null
Binary files differ
diff --git a/local-webserver/src/ios/GCDWebServer/GCDWebUploader/GCDWebUploader.bundle/css/bootstrap-theme.css b/local-webserver/src/ios/GCDWebServer/GCDWebUploader/GCDWebUploader.bundle/css/bootstrap-theme.css
deleted file mode 100644
index a406992..0000000
--- a/local-webserver/src/ios/GCDWebServer/GCDWebUploader/GCDWebUploader.bundle/css/bootstrap-theme.css
+++ /dev/null
@@ -1,347 +0,0 @@
-/*!
- * Bootstrap v3.1.1 (http://getbootstrap.com)
- * Copyright 2011-2014 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- */
-
-.btn-default,
-.btn-primary,
-.btn-success,
-.btn-info,
-.btn-warning,
-.btn-danger {
- text-shadow: 0 -1px 0 rgba(0, 0, 0, .2);
- -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
- box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
-}
-.btn-default:active,
-.btn-primary:active,
-.btn-success:active,
-.btn-info:active,
-.btn-warning:active,
-.btn-danger:active,
-.btn-default.active,
-.btn-primary.active,
-.btn-success.active,
-.btn-info.active,
-.btn-warning.active,
-.btn-danger.active {
- -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
- box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
-}
-.btn:active,
-.btn.active {
- background-image: none;
-}
-.btn-default {
- text-shadow: 0 1px 0 #fff;
- background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);
- background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
- background-repeat: repeat-x;
- border-color: #dbdbdb;
- border-color: #ccc;
-}
-.btn-default:hover,
-.btn-default:focus {
- background-color: #e0e0e0;
- background-position: 0 -15px;
-}
-.btn-default:active,
-.btn-default.active {
- background-color: #e0e0e0;
- border-color: #dbdbdb;
-}
-.btn-primary {
- background-image: -webkit-linear-gradient(top, #428bca 0%, #2d6ca2 100%);
- background-image: linear-gradient(to bottom, #428bca 0%, #2d6ca2 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0);
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
- background-repeat: repeat-x;
- border-color: #2b669a;
-}
-.btn-primary:hover,
-.btn-primary:focus {
- background-color: #2d6ca2;
- background-position: 0 -15px;
-}
-.btn-primary:active,
-.btn-primary.active {
- background-color: #2d6ca2;
- border-color: #2b669a;
-}
-.btn-success {
- background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);
- background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
- background-repeat: repeat-x;
- border-color: #3e8f3e;
-}
-.btn-success:hover,
-.btn-success:focus {
- background-color: #419641;
- background-position: 0 -15px;
-}
-.btn-success:active,
-.btn-success.active {
- background-color: #419641;
- border-color: #3e8f3e;
-}
-.btn-info {
- background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
- background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
- background-repeat: repeat-x;
- border-color: #28a4c9;
-}
-.btn-info:hover,
-.btn-info:focus {
- background-color: #2aabd2;
- background-position: 0 -15px;
-}
-.btn-info:active,
-.btn-info.active {
- background-color: #2aabd2;
- border-color: #28a4c9;
-}
-.btn-warning {
- background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
- background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
- background-repeat: repeat-x;
- border-color: #e38d13;
-}
-.btn-warning:hover,
-.btn-warning:focus {
- background-color: #eb9316;
- background-position: 0 -15px;
-}
-.btn-warning:active,
-.btn-warning.active {
- background-color: #eb9316;
- border-color: #e38d13;
-}
-.btn-danger {
- background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
- background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
- background-repeat: repeat-x;
- border-color: #b92c28;
-}
-.btn-danger:hover,
-.btn-danger:focus {
- background-color: #c12e2a;
- background-position: 0 -15px;
-}
-.btn-danger:active,
-.btn-danger.active {
- background-color: #c12e2a;
- border-color: #b92c28;
-}
-.thumbnail,
-.img-thumbnail {
- -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
- box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
-}
-.dropdown-menu > li > a:hover,
-.dropdown-menu > li > a:focus {
- background-color: #e8e8e8;
- background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
- background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
- background-repeat: repeat-x;
-}
-.dropdown-menu > .active > a,
-.dropdown-menu > .active > a:hover,
-.dropdown-menu > .active > a:focus {
- background-color: #357ebd;
- background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%);
- background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);
- background-repeat: repeat-x;
-}
-.navbar-default {
- background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%);
- background-image: linear-gradient(to bottom, #fff 0%, #f8f8f8 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
- background-repeat: repeat-x;
- border-radius: 4px;
- -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
- box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
-}
-.navbar-default .navbar-nav > .active > a {
- background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%);
- background-image: linear-gradient(to bottom, #ebebeb 0%, #f3f3f3 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', GradientType=0);
- background-repeat: repeat-x;
- -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);
- box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);
-}
-.navbar-brand,
-.navbar-nav > li > a {
- text-shadow: 0 1px 0 rgba(255, 255, 255, .25);
-}
-.navbar-inverse {
- background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);
- background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
- background-repeat: repeat-x;
-}
-.navbar-inverse .navbar-nav > .active > a {
- background-image: -webkit-linear-gradient(top, #222 0%, #282828 100%);
- background-image: linear-gradient(to bottom, #222 0%, #282828 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff282828', GradientType=0);
- background-repeat: repeat-x;
- -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);
- box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);
-}
-.navbar-inverse .navbar-brand,
-.navbar-inverse .navbar-nav > li > a {
- text-shadow: 0 -1px 0 rgba(0, 0, 0, .25);
-}
-.navbar-static-top,
-.navbar-fixed-top,
-.navbar-fixed-bottom {
- border-radius: 0;
-}
-.alert {
- text-shadow: 0 1px 0 rgba(255, 255, 255, .2);
- -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);
- box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);
-}
-.alert-success {
- background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
- background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);
- background-repeat: repeat-x;
- border-color: #b2dba1;
-}
-.alert-info {
- background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
- background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);
- background-repeat: repeat-x;
- border-color: #9acfea;
-}
-.alert-warning {
- background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
- background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);
- background-repeat: repeat-x;
- border-color: #f5e79e;
-}
-.alert-danger {
- background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
- background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);
- background-repeat: repeat-x;
- border-color: #dca7a7;
-}
-.progress {
- background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
- background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);
- background-repeat: repeat-x;
-}
-.progress-bar {
- background-image: -webkit-linear-gradient(top, #428bca 0%, #3071a9 100%);
- background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0);
- background-repeat: repeat-x;
-}
-.progress-bar-success {
- background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);
- background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);
- background-repeat: repeat-x;
-}
-.progress-bar-info {
- background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
- background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);
- background-repeat: repeat-x;
-}
-.progress-bar-warning {
- background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
- background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);
- background-repeat: repeat-x;
-}
-.progress-bar-danger {
- background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);
- background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);
- background-repeat: repeat-x;
-}
-.list-group {
- border-radius: 4px;
- -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
- box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
-}
-.list-group-item.active,
-.list-group-item.active:hover,
-.list-group-item.active:focus {
- text-shadow: 0 -1px 0 #3071a9;
- background-image: -webkit-linear-gradient(top, #428bca 0%, #3278b3 100%);
- background-image: linear-gradient(to bottom, #428bca 0%, #3278b3 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0);
- background-repeat: repeat-x;
- border-color: #3278b3;
-}
-.panel {
- -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
- box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
-}
-.panel-default > .panel-heading {
- background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
- background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
- background-repeat: repeat-x;
-}
-.panel-primary > .panel-heading {
- background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%);
- background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);
- background-repeat: repeat-x;
-}
-.panel-success > .panel-heading {
- background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
- background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);
- background-repeat: repeat-x;
-}
-.panel-info > .panel-heading {
- background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
- background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);
- background-repeat: repeat-x;
-}
-.panel-warning > .panel-heading {
- background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
- background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);
- background-repeat: repeat-x;
-}
-.panel-danger > .panel-heading {
- background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
- background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);
- background-repeat: repeat-x;
-}
-.well {
- background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
- background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);
- background-repeat: repeat-x;
- border-color: #dcdcdc;
- -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);
- box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);
-}
-/*# sourceMappingURL=bootstrap-theme.css.map */
diff --git a/local-webserver/src/ios/GCDWebServer/GCDWebUploader/GCDWebUploader.bundle/css/bootstrap.css b/local-webserver/src/ios/GCDWebServer/GCDWebUploader/GCDWebUploader.bundle/css/bootstrap.css
deleted file mode 100644
index 7f36651..0000000
--- a/local-webserver/src/ios/GCDWebServer/GCDWebUploader/GCDWebUploader.bundle/css/bootstrap.css
+++ /dev/null
@@ -1,5785 +0,0 @@
-/*!
- * Bootstrap v3.1.1 (http://getbootstrap.com)
- * Copyright 2011-2014 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- */
-
-/*! normalize.css v3.0.0 | MIT License | git.io/normalize */
-html {
- font-family: sans-serif;
- -webkit-text-size-adjust: 100%;
- -ms-text-size-adjust: 100%;
-}
-body {
- margin: 0;
-}
-article,
-aside,
-details,
-figcaption,
-figure,
-footer,
-header,
-hgroup,
-main,
-nav,
-section,
-summary {
- display: block;
-}
-audio,
-canvas,
-progress,
-video {
- display: inline-block;
- vertical-align: baseline;
-}
-audio:not([controls]) {
- display: none;
- height: 0;
-}
-[hidden],
-template {
- display: none;
-}
-a {
- background: transparent;
-}
-a:active,
-a:hover {
- outline: 0;
-}
-abbr[title] {
- border-bottom: 1px dotted;
-}
-b,
-strong {
- font-weight: bold;
-}
-dfn {
- font-style: italic;
-}
-h1 {
- margin: .67em 0;
- font-size: 2em;
-}
-mark {
- color: #000;
- background: #ff0;
-}
-small {
- font-size: 80%;
-}
-sub,
-sup {
- position: relative;
- font-size: 75%;
- line-height: 0;
- vertical-align: baseline;
-}
-sup {
- top: -.5em;
-}
-sub {
- bottom: -.25em;
-}
-img {
- border: 0;
-}
-svg:not(:root) {
- overflow: hidden;
-}
-figure {
- margin: 1em 40px;
-}
-hr {
- height: 0;
- -moz-box-sizing: content-box;
- box-sizing: content-box;
-}
-pre {
- overflow: auto;
-}
-code,
-kbd,
-pre,
-samp {
- font-family: monospace, monospace;
- font-size: 1em;
-}
-button,
-input,
-optgroup,
-select,
-textarea {
- margin: 0;
- font: inherit;
- color: inherit;
-}
-button {
- overflow: visible;
-}
-button,
-select {
- text-transform: none;
-}
-button,
-html input[type="button"],
-input[type="reset"],
-input[type="submit"] {
- -webkit-appearance: button;
- cursor: pointer;
-}
-button[disabled],
-html input[disabled] {
- cursor: default;
-}
-button::-moz-focus-inner,
-input::-moz-focus-inner {
- padding: 0;
- border: 0;
-}
-input {
- line-height: normal;
-}
-input[type="checkbox"],
-input[type="radio"] {
- box-sizing: border-box;
- padding: 0;
-}
-input[type="number"]::-webkit-inner-spin-button,
-input[type="number"]::-webkit-outer-spin-button {
- height: auto;
-}
-input[type="search"] {
- -webkit-box-sizing: content-box;
- -moz-box-sizing: content-box;
- box-sizing: content-box;
- -webkit-appearance: textfield;
-}
-input[type="search"]::-webkit-search-cancel-button,
-input[type="search"]::-webkit-search-decoration {
- -webkit-appearance: none;
-}
-fieldset {
- padding: .35em .625em .75em;
- margin: 0 2px;
- border: 1px solid #c0c0c0;
-}
-legend {
- padding: 0;
- border: 0;
-}
-textarea {
- overflow: auto;
-}
-optgroup {
- font-weight: bold;
-}
-table {
- border-spacing: 0;
- border-collapse: collapse;
-}
-td,
-th {
- padding: 0;
-}
-@media print {
- * {
- color: #000 !important;
- text-shadow: none !important;
- background: transparent !important;
- box-shadow: none !important;
- }
- a,
- a:visited {
- text-decoration: underline;
- }
- a[href]:after {
- content: " (" attr(href) ")";
- }
- abbr[title]:after {
- content: " (" attr(title) ")";
- }
- a[href^="javascript:"]:after,
- a[href^="#"]:after {
- content: "";
- }
- pre,
- blockquote {
- border: 1px solid #999;
-
- page-break-inside: avoid;
- }
- thead {
- display: table-header-group;
- }
- tr,
- img {
- page-break-inside: avoid;
- }
- img {
- max-width: 100% !important;
- }
- p,
- h2,
- h3 {
- orphans: 3;
- widows: 3;
- }
- h2,
- h3 {
- page-break-after: avoid;
- }
- select {
- background: #fff !important;
- }
- .navbar {
- display: none;
- }
- .table td,
- .table th {
- background-color: #fff !important;
- }
- .btn > .caret,
- .dropup > .btn > .caret {
- border-top-color: #000 !important;
- }
- .label {
- border: 1px solid #000;
- }
- .table {
- border-collapse: collapse !important;
- }
- .table-bordered th,
- .table-bordered td {
- border: 1px solid #ddd !important;
- }
-}
-* {
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
-}
-*:before,
-*:after {
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
-}
-html {
- font-size: 62.5%;
-
- -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
-}
-body {
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
- font-size: 14px;
- line-height: 1.42857143;
- color: #333;
- background-color: #fff;
-}
-input,
-button,
-select,
-textarea {
- font-family: inherit;
- font-size: inherit;
- line-height: inherit;
-}
-a {
- color: #428bca;
- text-decoration: none;
-}
-a:hover,
-a:focus {
- color: #2a6496;
- text-decoration: underline;
-}
-a:focus {
- outline: thin dotted;
- outline: 5px auto -webkit-focus-ring-color;
- outline-offset: -2px;
-}
-figure {
- margin: 0;
-}
-img {
- vertical-align: middle;
-}
-.img-responsive,
-.thumbnail > img,
-.thumbnail a > img,
-.carousel-inner > .item > img,
-.carousel-inner > .item > a > img {
- display: block;
- max-width: 100%;
- height: auto;
-}
-.img-rounded {
- border-radius: 6px;
-}
-.img-thumbnail {
- display: inline-block;
- max-width: 100%;
- height: auto;
- padding: 4px;
- line-height: 1.42857143;
- background-color: #fff;
- border: 1px solid #ddd;
- border-radius: 4px;
- -webkit-transition: all .2s ease-in-out;
- transition: all .2s ease-in-out;
-}
-.img-circle {
- border-radius: 50%;
-}
-hr {
- margin-top: 20px;
- margin-bottom: 20px;
- border: 0;
- border-top: 1px solid #eee;
-}
-.sr-only {
- position: absolute;
- width: 1px;
- height: 1px;
- padding: 0;
- margin: -1px;
- overflow: hidden;
- clip: rect(0, 0, 0, 0);
- border: 0;
-}
-h1,
-h2,
-h3,
-h4,
-h5,
-h6,
-.h1,
-.h2,
-.h3,
-.h4,
-.h5,
-.h6 {
- font-family: inherit;
- font-weight: 500;
- line-height: 1.1;
- color: inherit;
-}
-h1 small,
-h2 small,
-h3 small,
-h4 small,
-h5 small,
-h6 small,
-.h1 small,
-.h2 small,
-.h3 small,
-.h4 small,
-.h5 small,
-.h6 small,
-h1 .small,
-h2 .small,
-h3 .small,
-h4 .small,
-h5 .small,
-h6 .small,
-.h1 .small,
-.h2 .small,
-.h3 .small,
-.h4 .small,
-.h5 .small,
-.h6 .small {
- font-weight: normal;
- line-height: 1;
- color: #999;
-}
-h1,
-.h1,
-h2,
-.h2,
-h3,
-.h3 {
- margin-top: 20px;
- margin-bottom: 10px;
-}
-h1 small,
-.h1 small,
-h2 small,
-.h2 small,
-h3 small,
-.h3 small,
-h1 .small,
-.h1 .small,
-h2 .small,
-.h2 .small,
-h3 .small,
-.h3 .small {
- font-size: 65%;
-}
-h4,
-.h4,
-h5,
-.h5,
-h6,
-.h6 {
- margin-top: 10px;
- margin-bottom: 10px;
-}
-h4 small,
-.h4 small,
-h5 small,
-.h5 small,
-h6 small,
-.h6 small,
-h4 .small,
-.h4 .small,
-h5 .small,
-.h5 .small,
-h6 .small,
-.h6 .small {
- font-size: 75%;
-}
-h1,
-.h1 {
- font-size: 36px;
-}
-h2,
-.h2 {
- font-size: 30px;
-}
-h3,
-.h3 {
- font-size: 24px;
-}
-h4,
-.h4 {
- font-size: 18px;
-}
-h5,
-.h5 {
- font-size: 14px;
-}
-h6,
-.h6 {
- font-size: 12px;
-}
-p {
- margin: 0 0 10px;
-}
-.lead {
- margin-bottom: 20px;
- font-size: 16px;
- font-weight: 200;
- line-height: 1.4;
-}
-@media (min-width: 768px) {
- .lead {
- font-size: 21px;
- }
-}
-small,
-.small {
- font-size: 85%;
-}
-cite {
- font-style: normal;
-}
-.text-left {
- text-align: left;
-}
-.text-right {
- text-align: right;
-}
-.text-center {
- text-align: center;
-}
-.text-justify {
- text-align: justify;
-}
-.text-muted {
- color: #999;
-}
-.text-primary {
- color: #428bca;
-}
-a.text-primary:hover {
- color: #3071a9;
-}
-.text-success {
- color: #3c763d;
-}
-a.text-success:hover {
- color: #2b542c;
-}
-.text-info {
- color: #31708f;
-}
-a.text-info:hover {
- color: #245269;
-}
-.text-warning {
- color: #8a6d3b;
-}
-a.text-warning:hover {
- color: #66512c;
-}
-.text-danger {
- color: #a94442;
-}
-a.text-danger:hover {
- color: #843534;
-}
-.bg-primary {
- color: #fff;
- background-color: #428bca;
-}
-a.bg-primary:hover {
- background-color: #3071a9;
-}
-.bg-success {
- background-color: #dff0d8;
-}
-a.bg-success:hover {
- background-color: #c1e2b3;
-}
-.bg-info {
- background-color: #d9edf7;
-}
-a.bg-info:hover {
- background-color: #afd9ee;
-}
-.bg-warning {
- background-color: #fcf8e3;
-}
-a.bg-warning:hover {
- background-color: #f7ecb5;
-}
-.bg-danger {
- background-color: #f2dede;
-}
-a.bg-danger:hover {
- background-color: #e4b9b9;
-}
-.page-header {
- padding-bottom: 9px;
- margin: 40px 0 20px;
- border-bottom: 1px solid #eee;
-}
-ul,
-ol {