GCDWebServer
The #1 HTTP server for iOS, macOS & tvOS (also includes web based uploader & WebDAV server)
Install / Use
/learn @swisspol/GCDWebServerREADME
Overview
GCDWebServer is a modern and lightweight GCD based HTTP 1.1 server designed to be embedded in iOS, macOS & tvOS apps. It was written from scratch with the following goals in mind:
- Elegant and easy to use architecture with only 4 core classes: server, connection, request and response (see "Understanding GCDWebServer's Architecture" below)
- Well designed API with fully documented headers for easy integration and customization
- Entirely built with an event-driven design using Grand Central Dispatch for best performance and concurrency
- No dependencies on third-party source code
- Available under a friendly New BSD License
Extra built-in features:
- Allow implementation of fully asynchronous handlers of incoming HTTP requests
- Minimize memory usage with disk streaming of large HTTP request or response bodies
- Parser for web forms submitted using "application/x-www-form-urlencoded" or "multipart/form-data" encodings (including file uploads)
- JSON parsing and serialization for request and response HTTP bodies
- Chunked transfer encoding for request and response HTTP bodies
- HTTP compression with gzip for request and response HTTP bodies
- HTTP range support for requests of local files
- Basic and Digest Access authentications for password protection
- Automatically handle transitions between foreground, background and suspended modes in iOS apps
- Full support for both IPv4 and IPv6
- NAT port mapping (IPv4 only)
Included extensions:
- GCDWebUploader: subclass of
GCDWebServerthat implements an interface for uploading and downloading files using a web browser - GCDWebDAVServer: subclass of
GCDWebServerthat implements a class 1 WebDAV server (with partial class 2 support for macOS Finder)
What's not supported (but not really required from an embedded HTTP server):
- Keep-alive connections
- HTTPS
Requirements:
- macOS 10.7 or later (x86_64)
- iOS 8.0 or later (armv7, armv7s or arm64)
- tvOS 9.0 or later (arm64)
- ARC memory management only (if you need MRC support use GCDWebServer 3.1 or earlier)
Getting Started
Download or check out the latest release of GCDWebServer then add the entire "GCDWebServer" subfolder to your Xcode project. If you intend to use one of the extensions like GCDWebDAVServer or GCDWebUploader, add these subfolders as well. Finally link to libz (via Target > Build Phases > Link Binary With Libraries) and add $(SDKROOT)/usr/include/libxml2 to your header search paths (via Target > Build Settings > HEADER_SEARCH_PATHS).
Alternatively, you can install GCDWebServer using CocoaPods by simply adding this line to your Podfile:
pod "GCDWebServer", "~> 3.0"
If you want to use GCDWebUploader, use this line instead:
pod "GCDWebServer/WebUploader", "~> 3.0"
Or this line for GCDWebDAVServer:
pod "GCDWebServer/WebDAV", "~> 3.0"
And finally run $ pod install.
You can also use Carthage by adding this line to your Cartfile (3.2.5 is the first release with Carthage support):
github "swisspol/GCDWebServer" ~> 3.2.5
Then run $ carthage update and add the generated frameworks to your Xcode projects (see Carthage instructions).
Help & Support
For help with using GCDWebServer, it's best to ask your question on Stack Overflow with the gcdwebserver tag. For bug reports and enhancement requests you can use issues in this project.
Be sure to read this entire README first though!
Hello World
These code snippets show how to implement a custom HTTP server that runs on port 8080 and returns a "Hello World" HTML page to any request. Since GCDWebServer uses GCD blocks to handle requests, no subclassing or delegates are needed, which results in very clean code.
IMPORTANT: If not using CocoaPods, be sure to add the libz shared system library to the Xcode target for your app.
macOS version (command line tool):
#import "GCDWebServer.h"
#import "GCDWebServerDataResponse.h"
int main(int argc, const char* argv[]) {
@autoreleasepool {
// Create server
GCDWebServer* webServer = [[GCDWebServer alloc] init];
// Add a handler to respond to GET requests on any URL
[webServer addDefaultHandlerForMethod:@"GET"
requestClass:[GCDWebServerRequest class]
processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) {
return [GCDWebServerDataResponse responseWithHTML:@"<html><body><p>Hello World</p></body></html>"];
}];
// Use convenience method that runs server on port 8080
// until SIGINT (Ctrl-C in Terminal) or SIGTERM is received
[webServer runWithPort:8080 bonjourName:nil];
NSLog(@"Visit %@ in your web browser", webServer.serverURL);
}
return 0;
}
iOS version:
#import "GCDWebServer.h"
#import "GCDWebServerDataResponse.h"
@interface AppDelegate : NSObject <UIApplicationDelegate> {
GCDWebServer* _webServer;
}
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
// Create server
_webServer = [[GCDWebServer alloc] init];
// Add a handler to respond to GET requests on any URL
[_webServer addDefaultHandlerForMethod:@"GET"
requestClass:[GCDWebServerRequest class]
processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) {
return [GCDWebServerDataResponse responseWithHTML:@"<html><body><p>Hello World</p></body></html>"];
}];
// Start server on port 8080
[_webServer startWithPort:8080 bonjourName:nil];
NSLog(@"Visit %@ in your web browser", _webServer.serverURL);
return YES;
}
@end
macOS Swift version (command line tool):
webServer.swift
import Foundation
import GCDWebServer
func initWebServer() {
let webServer = GCDWebServer()
webServer.addDefaultHandler(forMethod: "GET", request: GCDWebServerRequest.self, processBlock: {request in
return GCDWebServerDataResponse(html:"<html><body><p>Hello World</p></body></html>")
})
webServer.start(withPort: 8080, bonjourName: "GCD Web Server")
print("Visit \(webServer.serverURL) in your web browser")
}
WebServer-Bridging-Header.h
#import <GCDWebServer/GCDWebServer.h>
#import <GCDWebServer/GCDWebServerDataResponse.h>
Web Based Uploads in iOS Apps
GCDWebUploader is a subclass of GCDWebServer that provides a ready-to-use HTML 5 file uploader & downloader. This lets users upload, download, delete files and create directories from a directory inside your iOS app's sandbox using a clean user interface in their web browser.
Simply instantiate and run a GCDWebUploader instance then visit http://{YOUR-IOS-DEVICE-IP-ADDRESS}/ from your web browser:
#import "GCDWebUploader.h"
@interface AppDelegate : NSObject <UIApplicationDelegate> {
GCDWebUploader* _webUploader;
}
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
NSString* documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
_webUploader = [[GCDWebUploader alloc] initWithUploadDirectory:documentsPath];
[_webUploader start];
NSLog(@"Visit %@ in your web browser", _webUploader.serverURL);
return YES;
}
@end
WebDAV Server in iOS Apps
GCDWebDAVServer is a subclass of GCDWebServer that provides a class 1 compliant WebDAV server. This lets users upload, download, delete files and create directories from a directory inside your iOS app's sandbox using any WebDAV client like Transmit (Mac), ForkLift (Mac) or CyberDuck (Mac / Windows).
GCDWebDAVServer should also work with the macOS Finder as it is partially class 2 compliant (but only when the client is the macOS WebDAV implementation).
Simply instantiate and run a GCDWebDAVServer instance then connect to http://{YOUR-IOS-DEVICE-IP-ADDRESS}/ using a WebDAV client:
#import "GCDWebDAVServer.h"
@interface AppDelegate : NSObject <UIApplicationDelegate> {
GCDWebDAVServer* _davServer;
}
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
NSString* documentsPath = [NSSearchPat


