13 Commits
2.3.1 ... 2.3.2

Author SHA1 Message Date
Pierre-Olivier Latour
5a0c274807 Fix 2014-04-23 10:40:43 -07:00
Pierre-Olivier Latour
591da12aa3 Exclude GCDWebServerPrivate.h from Podspec 2014-04-23 10:39:42 -07:00
Pierre-Olivier Latour
72475429e4 Bumped version 2014-04-23 10:33:50 -07:00
Pierre-Olivier Latour
01da5969e4 Update README.md 2014-04-22 22:47:07 -07:00
Pierre-Olivier Latour
46890a0642 Merge pull request #43 from iosphere/pullrequest/unusedVar
Fixes a static analyzer warning about unused variables for disabled logging
2014-04-21 21:15:35 -03:00
Pierre-Olivier Latour
143ca5b99f Fix 2014-04-20 10:34:45 -03:00
Pierre-Olivier Latour
519866bc03 Fix 2014-04-19 23:05:13 -03:00
Pierre-Olivier Latour
a93cac5ea6 Fix 2014-04-19 22:56:45 -03:00
Pierre-Olivier Latour
43b578677f Fix 2014-04-19 22:19:47 -03:00
Pierre-Olivier Latour
10cbe27e50 Fixed open() calls 2014-04-19 22:17:17 -03:00
Pierre-Olivier Latour
b1169ce7d1 Bumped version 2014-04-19 17:48:53 -03:00
Felix Lamouroux
3e5fe3f956 Fixes logging for non-arc builds 2014-04-19 14:09:55 +02:00
Felix Lamouroux
a5208bd60f Fixes a static analyzer warning about unused variables when logging is disabled 2014-04-18 21:26:18 +02:00
14 changed files with 144 additions and 135 deletions

View File

@@ -71,8 +71,8 @@
/** /**
* The GCDWebDAVServer subclass of GCDWebServer implements a class 1 compliant * The GCDWebDAVServer subclass of GCDWebServer implements a class 1 compliant
* WebDAV server. It is also partially class 2 compliant (but only when the * 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. * 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. * See the README.md file for more information about the features of GCDWebDAVServer.
*/ */
@@ -89,16 +89,15 @@
@property(nonatomic, assign) id<GCDWebDAVServerDelegate> delegate; @property(nonatomic, assign) id<GCDWebDAVServerDelegate> delegate;
/** /**
* Restricts which files should be listed and allowed to be uploaded, downloaded, * Sets which files are allowed to be operated on depending on their extension.
* moved, copied or deleted depending on their extensions.
* *
* The default value is nil i.e. all file extensions are allowed. * The default value is nil i.e. all file extensions are allowed.
*/ */
@property(nonatomic, copy) NSArray* allowedFileExtensions; @property(nonatomic, copy) NSArray* allowedFileExtensions;
/** /**
* Sets if files and directories whose name start with a period should be * Sets if files and directories whose name start with a period are allowed to
* listed and allowed to be uploaded, downloaded, moved, copied or deleted. * be operated on.
* *
* The default value is NO. * The default value is NO.
*/ */
@@ -119,7 +118,7 @@
@interface GCDWebDAVServer (Subclassing) @interface GCDWebDAVServer (Subclassing)
/** /**
* This method is called to check if a file is allowed to be uploaded. * This method is called to check if a file upload is allowed to complete.
* The uploaded file is available for inspection at "tempPath". * The uploaded file is available for inspection at "tempPath".
* *
* The default implementation returns YES. * The default implementation returns YES.

View File

@@ -7,7 +7,7 @@
Pod::Spec.new do |s| Pod::Spec.new do |s|
s.name = 'GCDWebServer' s.name = 'GCDWebServer'
s.version = '2.3' s.version = '2.3.2'
s.author = { 'Pierre-Olivier Latour' => 'info@pol-online.net' } s.author = { 'Pierre-Olivier Latour' => 'info@pol-online.net' }
s.license = { :type => 'BSD', :file => 'LICENSE' } s.license = { :type => 'BSD', :file => 'LICENSE' }
s.homepage = 'https://github.com/swisspol/GCDWebServer' s.homepage = 'https://github.com/swisspol/GCDWebServer'
@@ -22,6 +22,7 @@ Pod::Spec.new do |s|
s.subspec 'Core' do |cs| s.subspec 'Core' do |cs|
cs.source_files = 'GCDWebServer/**/*.{h,m}' cs.source_files = 'GCDWebServer/**/*.{h,m}'
cs.private_header_files = "GCDWebServer/Core/GCDWebServerPrivate.h"
cs.requires_arc = true cs.requires_arc = true
cs.ios.library = 'z' cs.ios.library = 'z'
cs.ios.frameworks = 'MobileCoreServices', 'CFNetwork' cs.ios.frameworks = 'MobileCoreServices', 'CFNetwork'

View File

@@ -59,7 +59,7 @@ typedef GCDWebServerRequest* (^GCDWebServerMatchBlock)(NSString* requestMethod,
/** /**
* The GCDWebServerProcessBlock is called after the HTTP request has been fully * 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 * received (i.e. the entire HTTP body has been read). The block is passed the
* GCDWebServerRequest created at the previous step by the GCDWebServerMatchBlock. * GCDWebServerRequest created at the previous step by the GCDWebServerMatchBlock.
* *
* The block must return a GCDWebServerResponse or nil on error, which will * The block must return a GCDWebServerResponse or nil on error, which will
@@ -72,14 +72,14 @@ typedef GCDWebServerResponse* (^GCDWebServerProcessBlock)(GCDWebServerRequest* r
/** /**
* The port used by the GCDWebServer (NSNumber / NSUInteger). * The port used by the GCDWebServer (NSNumber / NSUInteger).
* *
* Default value is 0 i.e. let the OS pick a random port. * The default value is 0 i.e. let the OS pick a random port.
*/ */
extern NSString* const GCDWebServerOption_Port; extern NSString* const GCDWebServerOption_Port;
/** /**
* The Bonjour name used by the GCDWebServer (NSString). * The Bonjour name used by the GCDWebServer (NSString).
* *
* Default value is an empty string i.e. use the computer / device name. * The default value is an empty string i.e. use the computer / device name.
*/ */
extern NSString* const GCDWebServerOption_BonjourName; extern NSString* const GCDWebServerOption_BonjourName;
@@ -87,14 +87,14 @@ extern NSString* const GCDWebServerOption_BonjourName;
* The maximum number of incoming HTTP requests that can be queued waiting to * The maximum number of incoming HTTP requests that can be queued waiting to
* be handled before new ones are dropped (NSNumber / NSUInteger). * be handled before new ones are dropped (NSNumber / NSUInteger).
* *
* Default value is 16. * The default value is 16.
*/ */
extern NSString* const GCDWebServerOption_MaxPendingConnections; extern NSString* const GCDWebServerOption_MaxPendingConnections;
/** /**
* The value for "Server" HTTP header used by the GCDWebServer (NSString). * The value for "Server" HTTP header used by the GCDWebServer (NSString).
* *
* Default value is the GCDWebServer class name. * The default value is the GCDWebServer class name.
*/ */
extern NSString* const GCDWebServerOption_ServerName; extern NSString* const GCDWebServerOption_ServerName;
@@ -102,14 +102,14 @@ extern NSString* const GCDWebServerOption_ServerName;
* The authentication method used by the GCDWebServer * The authentication method used by the GCDWebServer
* (one of "GCDWebServerAuthenticationMethod_..."). * (one of "GCDWebServerAuthenticationMethod_...").
* *
* Default value is nil i.e. authentication disabled. * The default value is nil i.e. authentication is disabled.
*/ */
extern NSString* const GCDWebServerOption_AuthenticationMethod; extern NSString* const GCDWebServerOption_AuthenticationMethod;
/** /**
* The authentication realm used by the GCDWebServer (NSString). * The authentication realm used by the GCDWebServer (NSString).
* *
* Default value is the same as GCDWebServerOption_ServerName. * The default value is the same as the GCDWebServerOption_ServerName option.
*/ */
extern NSString* const GCDWebServerOption_AuthenticationRealm; extern NSString* const GCDWebServerOption_AuthenticationRealm;
@@ -117,7 +117,7 @@ extern NSString* const GCDWebServerOption_AuthenticationRealm;
* The authentication accounts used by the GCDWebServer * The authentication accounts used by the GCDWebServer
* (NSDictionary of username / password pairs). * (NSDictionary of username / password pairs).
* *
* Default value is nil i.e. no accounts. * The default value is nil i.e. no accounts.
*/ */
extern NSString* const GCDWebServerOption_AuthenticationAccounts; extern NSString* const GCDWebServerOption_AuthenticationAccounts;
@@ -125,7 +125,7 @@ extern NSString* const GCDWebServerOption_AuthenticationAccounts;
* The class used by the GCDWebServer when instantiating GCDWebServerConnection * The class used by the GCDWebServer when instantiating GCDWebServerConnection
* (subclass of GCDWebServerConnection). * (subclass of GCDWebServerConnection).
* *
* Default value is GCDWebServerConnection class. * The default value is the GCDWebServerConnection class.
*/ */
extern NSString* const GCDWebServerOption_ConnectionClass; extern NSString* const GCDWebServerOption_ConnectionClass;
@@ -133,7 +133,7 @@ extern NSString* const GCDWebServerOption_ConnectionClass;
* Allow the GCDWebServer to pretend "HEAD" requests are actually "GET" ones * Allow the GCDWebServer to pretend "HEAD" requests are actually "GET" ones
* and automatically discard the HTTP body of the response (NSNumber / BOOL). * and automatically discard the HTTP body of the response (NSNumber / BOOL).
* *
* Default value is YES. * The default value is YES.
*/ */
extern NSString* const GCDWebServerOption_AutomaticallyMapHEADToGET; extern NSString* const GCDWebServerOption_AutomaticallyMapHEADToGET;
@@ -142,7 +142,7 @@ extern NSString* const GCDWebServerOption_AutomaticallyMapHEADToGET;
* coalesce calls to -webServerDidConnect: and -webServerDidDisconnect: * coalesce calls to -webServerDidConnect: and -webServerDidDisconnect:
* (NSNumber / double). Coalescing will be disabled if the interval is <= 0.0. * (NSNumber / double). Coalescing will be disabled if the interval is <= 0.0.
* *
* Default value is 1.0 second. * The default value is 1.0 second.
*/ */
extern NSString* const GCDWebServerOption_ConnectedStateCoalescingInterval; extern NSString* const GCDWebServerOption_ConnectedStateCoalescingInterval;
@@ -156,7 +156,7 @@ extern NSString* const GCDWebServerOption_ConnectedStateCoalescingInterval;
* *
* See the README.md file for more information about this option. * See the README.md file for more information about this option.
* *
* Default value is YES. * The default value is YES.
* *
* @warning The running property will be NO while the GCDWebServer is suspended. * @warning The running property will be NO while the GCDWebServer is suspended.
*/ */
@@ -167,7 +167,8 @@ extern NSString* const GCDWebServerOption_AutomaticallySuspendInBackground;
/** /**
* HTTP Basic Authentication scheme (see https://tools.ietf.org/html/rfc2617). * HTTP Basic Authentication scheme (see https://tools.ietf.org/html/rfc2617).
* *
* @warning Use of this method is not recommended as the passwords are sent in clear. * @warning Use of this authentication scheme is not recommended as the
* passwords are sent in clear.
*/ */
extern NSString* const GCDWebServerAuthenticationMethod_Basic; extern NSString* const GCDWebServerAuthenticationMethod_Basic;
@@ -187,7 +188,7 @@ extern NSString* const GCDWebServerAuthenticationMethod_DigestAccess;
@optional @optional
/** /**
* This method is called after the server has succesfully started. * This method is called after the server has successfully started.
*/ */
- (void)webServerDidStart:(GCDWebServer*)server; - (void)webServerDidStart:(GCDWebServer*)server;
@@ -199,9 +200,11 @@ extern NSString* const GCDWebServerAuthenticationMethod_DigestAccess;
/** /**
* This method is called when the first GCDWebServerConnection is opened by the * This method is called when the first GCDWebServerConnection is opened by the
* server to serve a series of HTTP requests. A series is ongoing as long as * server to serve a series of HTTP requests.
* new HTTP requests keep coming (and new GCDWebServerConnection instances keep *
* being opened), before the last HTTP request has been responded to (and the * 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). * corresponding last GCDWebServerConnection closed).
*/ */
- (void)webServerDidConnect:(GCDWebServer*)server; - (void)webServerDidConnect:(GCDWebServer*)server;
@@ -226,8 +229,9 @@ extern NSString* const GCDWebServerAuthenticationMethod_DigestAccess;
@end @end
/** /**
* The GCDWebServer class manages the socket that listens for HTTP requests and * The GCDWebServer class listens for incoming HTTP requests on a given port,
* the list of handlers used to respond to them. * then passes each one to a "handler" capable of generating an HTTP response
* for it, which is then sent back to the client.
* *
* See the README.md file for more information about the architecture of GCDWebServer. * See the README.md file for more information about the architecture of GCDWebServer.
*/ */
@@ -239,7 +243,7 @@ extern NSString* const GCDWebServerAuthenticationMethod_DigestAccess;
@property(nonatomic, assign) id<GCDWebServerDelegate> delegate; @property(nonatomic, assign) id<GCDWebServerDelegate> delegate;
/** /**
* Indicates if the server is currently running. * Returns YES if the server is currently running.
*/ */
@property(nonatomic, readonly, getter=isRunning) BOOL running; @property(nonatomic, readonly, getter=isRunning) BOOL running;
@@ -251,7 +255,7 @@ extern NSString* const GCDWebServerAuthenticationMethod_DigestAccess;
@property(nonatomic, readonly) NSUInteger port; @property(nonatomic, readonly) NSUInteger port;
/** /**
* Returns the Bonjour name in used by the server. * Returns the Bonjour name used by the server.
* *
* @warning This property is only valid if the server is running and Bonjour * @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. * registration has successfully completed, which can take up to a few seconds.
@@ -265,37 +269,21 @@ extern NSString* const GCDWebServerAuthenticationMethod_DigestAccess;
/** /**
* Adds a handler to the server to handle incoming HTTP requests. * Adds a handler to the server to handle incoming HTTP requests.
* Handlers are called in a LIFO queue, so the latest added handler overrides
* any previously added ones.
* *
* @warning Addling handlers while the GCDWebServer is running is not allowed. * 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; - (void)addHandlerWithMatchBlock:(GCDWebServerMatchBlock)matchBlock processBlock:(GCDWebServerProcessBlock)processBlock;
/** /**
* Removes all handlers previously added to the server. * Removes all handlers previously added to the server.
* *
* @warning Removing handlers while the GCDWebServer is running is not allowed. * @warning Removing handlers while the server is running is not allowed.
*/ */
- (void)removeAllHandlers; - (void)removeAllHandlers;
/**
* Starts the server on port 8080 (OS X & iOS Simulator) or port 80 (iOS)
* using the computer / device name for as the 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 computer / device name.
*
* Returns NO if the server failed to start.
*/
- (BOOL)startWithPort:(NSUInteger)port bonjourName:(NSString*)name;
/** /**
* Starts the server with explicit options. This method is the designated way * Starts the server with explicit options. This method is the designated way
* to start the server. * to start the server.
@@ -308,8 +296,8 @@ extern NSString* const GCDWebServerAuthenticationMethod_DigestAccess;
* Stops the server and prevents it to accepts new HTTP requests. * Stops the server and prevents it to accepts new HTTP requests.
* *
* @warning Stopping the server does not abort GCDWebServerConnection instances * @warning Stopping the server does not abort GCDWebServerConnection instances
* handling already received HTTP requests. These connections will continue to * currently handling already received HTTP requests. These connections will
* execute until the corresponding requests and responses are completed. * continue to execute normally until completion.
*/ */
- (void)stop; - (void)stop;
@@ -332,6 +320,23 @@ extern NSString* const GCDWebServerAuthenticationMethod_DigestAccess;
*/ */
@property(nonatomic, readonly) NSURL* bonjourServerURL; @property(nonatomic, readonly) NSURL* bonjourServerURL;
/**
* Starts the server on port 8080 (OS X & iOS Simulator) or port 80 (iOS)
* using the computer / device name for as the 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 computer / device name.
*
* Returns NO if the server failed to start.
*/
- (BOOL)startWithPort:(NSUInteger)port bonjourName:(NSString*)name;
#if !TARGET_OS_IPHONE #if !TARGET_OS_IPHONE
/** /**

View File

@@ -528,17 +528,6 @@ static inline NSString* _EncodeBase64(NSString* string) {
} }
} }
- (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];
}
#if TARGET_OS_IPHONE #if TARGET_OS_IPHONE
- (void)_didEnterBackground:(NSNotification*)notification { - (void)_didEnterBackground:(NSNotification*)notification {
@@ -640,6 +629,17 @@ static inline NSString* _EncodeBase64(NSString* string) {
return nil; 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];
}
#if !TARGET_OS_IPHONE #if !TARGET_OS_IPHONE
- (BOOL)runWithPort:(NSUInteger)port bonjourName:(NSString*)name { - (BOOL)runWithPort:(NSUInteger)port bonjourName:(NSString*)name {
@@ -846,37 +846,29 @@ static inline NSString* _EncodeBase64(NSString* string) {
- (void)logVerbose:(NSString*)format, ... { - (void)logVerbose:(NSString*)format, ... {
va_list arguments; va_list arguments;
va_start(arguments, format); va_start(arguments, format);
NSString* message = [[NSString alloc] initWithFormat:format arguments:arguments]; LOG_VERBOSE(@"%@", ARC_AUTORELEASE([[NSString alloc] initWithFormat:format arguments:arguments]));
va_end(arguments); va_end(arguments);
LOG_VERBOSE(@"%@", message);
ARC_RELEASE(message);
} }
- (void)logInfo:(NSString*)format, ... { - (void)logInfo:(NSString*)format, ... {
va_list arguments; va_list arguments;
va_start(arguments, format); va_start(arguments, format);
NSString* message = [[NSString alloc] initWithFormat:format arguments:arguments]; LOG_INFO(@"%@", ARC_AUTORELEASE([[NSString alloc] initWithFormat:format arguments:arguments]));
va_end(arguments); va_end(arguments);
LOG_INFO(@"%@", message);
ARC_RELEASE(message);
} }
- (void)logWarning:(NSString*)format, ... { - (void)logWarning:(NSString*)format, ... {
va_list arguments; va_list arguments;
va_start(arguments, format); va_start(arguments, format);
NSString* message = [[NSString alloc] initWithFormat:format arguments:arguments]; LOG_WARNING(@"%@", ARC_AUTORELEASE([[NSString alloc] initWithFormat:format arguments:arguments]));
va_end(arguments); va_end(arguments);
LOG_WARNING(@"%@", message);
ARC_RELEASE(message);
} }
- (void)logError:(NSString*)format, ... { - (void)logError:(NSString*)format, ... {
va_list arguments; va_list arguments;
va_start(arguments, format); va_start(arguments, format);
NSString* message = [[NSString alloc] initWithFormat:format arguments:arguments]; LOG_ERROR(@"%@", ARC_AUTORELEASE([[NSString alloc] initWithFormat:format arguments:arguments]));
va_end(arguments); va_end(arguments);
LOG_ERROR(@"%@", message);
ARC_RELEASE(message);
} }
- (void)logException:(NSException*)exception { - (void)logException:(NSException*)exception {

View File

@@ -38,8 +38,8 @@
* subclass it to override some hooks. Use the GCDWebServerOption_ConnectionClass * subclass it to override some hooks. Use the GCDWebServerOption_ConnectionClass
* option for GCDWebServer to install your custom subclass. * option for GCDWebServer to install your custom subclass.
* *
* @warning The GCDWebServerConnection retains the GCDWebServer * @warning The GCDWebServerConnection retains the GCDWebServer until the
* until the connection is closed. * connection is closed.
*/ */
@interface GCDWebServerConnection : NSObject @interface GCDWebServerConnection : NSObject
@@ -95,6 +95,7 @@
/** /**
* This method is called when the connection is opened. * This method is called when the connection is opened.
*
* Return NO to reject the connection e.g. after validating the local * Return NO to reject the connection e.g. after validating the local
* or remote address. * or remote address.
*/ */
@@ -103,17 +104,21 @@
/** /**
* This method is called whenever data has been received * This method is called whenever data has been received
* from the remote peer (i.e. client). * from the remote peer (i.e. client).
*
* @warning Do not attempt to modify this data.
*/ */
- (void)didReadBytes:(const void*)bytes length:(NSUInteger)length; - (void)didReadBytes:(const void*)bytes length:(NSUInteger)length;
/** /**
* This method is called whenever data has been sent * This method is called whenever data has been sent
* to the remote peer (i.e. client). * to the remote peer (i.e. client).
*
* @warning Do not attempt to modify this data.
*/ */
- (void)didWriteBytes:(const void*)bytes length:(NSUInteger)length; - (void)didWriteBytes:(const void*)bytes length:(NSUInteger)length;
/** /**
* Assuming a valid request was received, this method is called before * Assuming a valid HTTP request was received, this method is called before
* the request is processed. * the request is processed.
* *
* Return a non-nil GCDWebServerResponse to bypass the request processing entirely. * Return a non-nil GCDWebServerResponse to bypass the request processing entirely.
@@ -124,18 +129,18 @@
- (GCDWebServerResponse*)preflightRequest:(GCDWebServerRequest*)request; - (GCDWebServerResponse*)preflightRequest:(GCDWebServerRequest*)request;
/** /**
* Assuming a valid request was received and -preflightRequest: returned nil, * Assuming a valid HTTP request was received and -preflightRequest: returned nil,
* this method is called to process the request. * this method is called to process the request.
*/ */
- (GCDWebServerResponse*)processRequest:(GCDWebServerRequest*)request withBlock:(GCDWebServerProcessBlock)block; - (GCDWebServerResponse*)processRequest:(GCDWebServerRequest*)request withBlock:(GCDWebServerProcessBlock)block;
/** /**
* Assuming a valid request was received and either -preflightRequest: * Assuming a valid HTTP request was received and either -preflightRequest:
* or -processRequest:withBlock: returned a non-nil GCDWebServerResponse, * or -processRequest:withBlock: returned a non-nil GCDWebServerResponse,
* this method is called to override the response. * this method is called to override the response.
* *
* You can either modify the current response and return it, or return a * You can either modify the current response and return it, or return a
* completely different one. * completely new one.
* *
* The default implementation replaces any response matching the "ETag" or * The default implementation replaces any response matching the "ETag" or
* "Last-Modified-Date" header of the request by a barebone "Not-Modified" (304) * "Last-Modified-Date" header of the request by a barebone "Not-Modified" (304)
@@ -145,7 +150,7 @@
/** /**
* This method is called if any error happens while validing or processing * This method is called if any error happens while validing or processing
* the request or no GCDWebServerResponse is generated. * the request or if no GCDWebServerResponse was generated during processing.
* *
* @warning If the request was invalid (e.g. the HTTP headers were malformed), * @warning If the request was invalid (e.g. the HTTP headers were malformed),
* the "request" argument will be nil. * the "request" argument will be nil.

View File

@@ -675,11 +675,11 @@ static NSString* _StringFromAddressData(NSData* data) {
_connectionIndex = OSAtomicIncrement32(&_connectionCounter); _connectionIndex = OSAtomicIncrement32(&_connectionCounter);
_requestPath = ARC_RETAIN([NSTemporaryDirectory() stringByAppendingPathComponent:[[NSProcessInfo processInfo] globallyUniqueString]]); _requestPath = ARC_RETAIN([NSTemporaryDirectory() stringByAppendingPathComponent:[[NSProcessInfo processInfo] globallyUniqueString]]);
_requestFD = open([_requestPath fileSystemRepresentation], O_CREAT | O_TRUNC | O_WRONLY); _requestFD = open([_requestPath fileSystemRepresentation], O_CREAT | O_TRUNC | O_WRONLY, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
DCHECK(_requestFD > 0); DCHECK(_requestFD > 0);
_responsePath = ARC_RETAIN([NSTemporaryDirectory() stringByAppendingPathComponent:[[NSProcessInfo processInfo] globallyUniqueString]]); _responsePath = ARC_RETAIN([NSTemporaryDirectory() stringByAppendingPathComponent:[[NSProcessInfo processInfo] globallyUniqueString]]);
_responseFD = open([_responsePath fileSystemRepresentation], O_CREAT | O_TRUNC | O_WRONLY); _responseFD = open([_responsePath fileSystemRepresentation], O_CREAT | O_TRUNC | O_WRONLY, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
DCHECK(_responseFD > 0); DCHECK(_responseFD > 0);
} }
#endif #endif

View File

@@ -50,17 +50,18 @@ NSString* GCDWebServerEscapeURLString(NSString* string);
NSString* GCDWebServerUnescapeURLString(NSString* string); NSString* GCDWebServerUnescapeURLString(NSString* string);
/** /**
* Extracts the unescaped names and values * Extracts the unescaped names and values from an
* from a "application/x-www-form-urlencoded" form. * "application/x-www-form-urlencoded" form.
* http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1 * http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1
*/ */
NSDictionary* GCDWebServerParseURLEncodedForm(NSString* form); NSDictionary* GCDWebServerParseURLEncodedForm(NSString* form);
/** /**
* OS X: Returns the IPv4 address as a dotted string of the primary connected * On OS X, returns the IPv4 address as a dotted string of the primary connected
* service or nil if not available. * service or nil if not available.
* iOS: Returns the IPv4 address as a dotted string of the WiFi interface *
* if connected or nil otherwise. * On iOS, returns the IPv4 address as a dotted string of the WiFi interface
* if connected or nil otherwise.
*/ */
NSString* GCDWebServerGetPrimaryIPv4Address(); NSString* GCDWebServerGetPrimaryIPv4Address();
@@ -76,7 +77,7 @@ NSString* GCDWebServerFormatRFC822(NSDate* date);
* https://tools.ietf.org/html/rfc822#section-5 * https://tools.ietf.org/html/rfc822#section-5
* https://tools.ietf.org/html/rfc1123#section-5.2.14 * https://tools.ietf.org/html/rfc1123#section-5.2.14
* *
* @warning Timezones are not supported at this time. * @warning Timezones other than GMT are not supported by this function.
*/ */
NSDate* GCDWebServerParseRFC822(NSString* string); NSDate* GCDWebServerParseRFC822(NSString* string);
@@ -91,7 +92,7 @@ NSString* GCDWebServerFormatISO8601(NSDate* date);
* http://tools.ietf.org/html/rfc3339#section-5.6 * http://tools.ietf.org/html/rfc3339#section-5.6
* *
* @warning Only "calendar" variant is supported at this time and timezones * @warning Only "calendar" variant is supported at this time and timezones
* are not supported either. * other than GMT are not supported either.
*/ */
NSDate* GCDWebServerParseISO8601(NSString* string); NSDate* GCDWebServerParseISO8601(NSString* string);

View File

@@ -106,8 +106,8 @@
@property(nonatomic, readonly) NSDictionary* query; @property(nonatomic, readonly) NSDictionary* query;
/** /**
* Returns the content type for the body of the request (this property is * Returns the content type for the body of the request parsed from the
* automatically parsed from the HTTP headers). * "Content-Type" header.
* *
* This property will be nil if the request has no body or set to * 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 * "application/octet-stream" if a body is present but there was no
@@ -116,8 +116,8 @@
@property(nonatomic, readonly) NSString* contentType; @property(nonatomic, readonly) NSString* contentType;
/** /**
* Returns the content length for the body of the request (this property is * Returns the content length for the body of the request parsed from the
* automatically parsed from the HTTP headers). * "Content-Length" header.
* *
* This property will be set to "NSNotFound" if the request has no body or * This property will be set to "NSNotFound" if the request has no body or
* if there is a body but no "Content-Length" header, typically because * if there is a body but no "Content-Length" header, typically because
@@ -138,13 +138,13 @@
/** /**
* Returns the parsed "Range" header or (NSNotFound, 0) if absent or malformed. * Returns the parsed "Range" header or (NSNotFound, 0) if absent or malformed.
* The range will be set to (offset, length) if expressed from the beginning * The range will be set to (offset, length) if expressed from the beginning
* of the body, or (NSNotFound, -length) if expressed from the end of the body. * of the entity body, or (NSNotFound, -length) if expressed from its end.
*/ */
@property(nonatomic, readonly) NSRange byteRange; @property(nonatomic, readonly) NSRange byteRange;
/** /**
* Indicates if the client supports gzip content encoding (this property is * Returns YES if the client supports gzip content encoding according to the
* automatically parsed from the HTTP headers). * "Accept-Encoding" header.
*/ */
@property(nonatomic, readonly) BOOL acceptsGzipContentEncoding; @property(nonatomic, readonly) BOOL acceptsGzipContentEncoding;

View File

@@ -29,7 +29,7 @@
/** /**
* This protocol is used by the GCDWebServerConnection to communicate with * This protocol is used by the GCDWebServerConnection to communicate with
* the GCDWebServerResponse and read the sent HTTP body data. * the GCDWebServerResponse and read the HTTP body data to send.
* *
* Note that multiple GCDWebServerBodyReader objects can be chained together * Note that multiple GCDWebServerBodyReader objects can be chained together
* internally e.g. to automatically apply gzip encoding to the content before * internally e.g. to automatically apply gzip encoding to the content before
@@ -48,7 +48,7 @@
- (BOOL)open:(NSError**)error; - (BOOL)open:(NSError**)error;
/** /**
* This method is called whenever body data is ready to be sent. * This method is called whenever body data is sent.
* *
* It should return a non-empty NSData if there is body data available, * 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 * or an empty NSData there is no more body data, or nil on error and set
@@ -67,7 +67,7 @@
* The GCDWebServerResponse class is used to wrap a single HTTP response. * The GCDWebServerResponse class is used to wrap a single HTTP response.
* It is instantiated by the handler of the GCDWebServer that handled the request. * It is instantiated by the handler of the GCDWebServer that handled the request.
* If a body is present, the methods from the GCDWebServerBodyReader protocol * If a body is present, the methods from the GCDWebServerBodyReader protocol
* will be called by the GCDWebServerConnection to retrieve it. * will be called by the GCDWebServerConnection to send it.
* *
* The default implementation of the GCDWebServerBodyReader protocol * The default implementation of the GCDWebServerBodyReader protocol
* on the class simply returns an empty body. * on the class simply returns an empty body.
@@ -78,16 +78,17 @@
/** /**
* Sets the content type for the body of the response. * Sets the content type for the body of the response.
* This property must be set if a body is present.
* *
* The default value is nil i.e. the response has no body. * 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; @property(nonatomic, copy) NSString* contentType;
/** /**
* Sets the content length for the body of the response. If a body is present * Sets the content length for the body of the response. If a body is present
* but this property is set to "NSNotFound", this means the length of the body * but this property is set to "NSNotFound", this means the length of the body
* cannot be known ahead of time and chunked transfer encoding will be * cannot be known ahead of time. Chunked transfer encoding will be
* automatically enabled by the GCDWebServerConnection to comply with HTTP/1.1 * automatically enabled by the GCDWebServerConnection to comply with HTTP/1.1
* specifications. * specifications.
* *
@@ -152,7 +153,7 @@
* Pass a nil value to remove an additional header. * Pass a nil value to remove an additional header.
* *
* @warning Do not attempt to override the primary headers used * @warning Do not attempt to override the primary headers used
* by GCDWebServerResponse e.g. "Content-Type" or "ETag". * by GCDWebServerResponse like "Content-Type", "ETag", etc...
*/ */
- (void)setValue:(NSString*)value forAdditionalHeader:(NSString*)header; - (void)setValue:(NSString*)value forAdditionalHeader:(NSString*)header;

View File

@@ -78,7 +78,7 @@
/** /**
* Initializes a data response from text encoded using UTF-8. * Initializes a data response from text encoded using UTF-8.
*/ */
- (instancetype)initWithText:(NSString*)text; // Encodes using UTF-8 - (instancetype)initWithText:(NSString*)text;
/** /**
* Initializes a data response from HTML encoded using UTF-8. * Initializes a data response from HTML encoded using UTF-8.
@@ -87,6 +87,7 @@
/** /**
* Initializes a data response from an HTML template encoded using UTF-8. * Initializes a data response from an HTML template encoded using UTF-8.
*
* All occurences of "%variable%" within the HTML template are replaced with * All occurences of "%variable%" within the HTML template are replaced with
* their corresponding values. * their corresponding values.
*/ */

View File

@@ -46,13 +46,13 @@
/** /**
* Creates a client error response with the corresponding HTTP status code * Creates a client error response with the corresponding HTTP status code
* and an optional underlying NSError. * and an underlying NSError.
*/ */
+ (instancetype)responseWithClientError:(GCDWebServerClientErrorHTTPStatusCode)errorCode underlyingError:(NSError*)underlyingError message:(NSString*)format, ... NS_FORMAT_FUNCTION(3,4); + (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 * Creates a server error response with the corresponding HTTP status code
* and an optional underlying NSError. * and an underlying NSError.
*/ */
+ (instancetype)responseWithServerError:(GCDWebServerServerErrorHTTPStatusCode)errorCode underlyingError:(NSError*)underlyingError message:(NSString*)format, ... NS_FORMAT_FUNCTION(3,4); + (instancetype)responseWithServerError:(GCDWebServerServerErrorHTTPStatusCode)errorCode underlyingError:(NSError*)underlyingError message:(NSString*)format, ... NS_FORMAT_FUNCTION(3,4);
@@ -68,13 +68,13 @@
/** /**
* Initializes a client error response with the corresponding HTTP status code * Initializes a client error response with the corresponding HTTP status code
* and an optional underlying NSError. * and an underlying NSError.
*/ */
- (instancetype)initWithClientError:(GCDWebServerClientErrorHTTPStatusCode)errorCode underlyingError:(NSError*)underlyingError message:(NSString*)format, ... NS_FORMAT_FUNCTION(3,4); - (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 * Initializes a server error response with the corresponding HTTP status code
* and an optional underlying NSError. * and an underlying NSError.
*/ */
- (instancetype)initWithServerError:(GCDWebServerServerErrorHTTPStatusCode)errorCode underlyingError:(NSError*)underlyingError message:(NSString*)format, ... NS_FORMAT_FUNCTION(3,4); - (instancetype)initWithServerError:(GCDWebServerServerErrorHTTPStatusCode)errorCode underlyingError:(NSError*)underlyingError message:(NSString*)format, ... NS_FORMAT_FUNCTION(3,4);

View File

@@ -30,18 +30,21 @@
/** /**
* The GCDWebServerFileResponse subclass of GCDWebServerResponse reads the body * The GCDWebServerFileResponse subclass of GCDWebServerResponse reads the body
* of the HTTP response from a file on disk. * 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 @interface GCDWebServerFileResponse : GCDWebServerResponse
/** /**
* Creates a response with the contents of a file and the content type * Creates a response with the contents of a file.
* automatically set from the file extension.
*/ */
+ (instancetype)responseWithFile:(NSString*)path; + (instancetype)responseWithFile:(NSString*)path;
/** /**
* Creates a response like +responseWithFile: but sets the "Content-Disposition" * Creates a response like +responseWithFile: and sets the "Content-Disposition"
* HTTP header appropriately for a download if the "attachment" argument is YES. * HTTP header for a download if the "attachment" argument is YES.
*/ */
+ (instancetype)responseWithFile:(NSString*)path isAttachment:(BOOL)attachment; + (instancetype)responseWithFile:(NSString*)path isAttachment:(BOOL)attachment;
@@ -54,21 +57,21 @@
+ (instancetype)responseWithFile:(NSString*)path byteRange:(NSRange)range; + (instancetype)responseWithFile:(NSString*)path byteRange:(NSRange)range;
/** /**
* Creates a response like +responseWithFile:byteRange: but also sets the * Creates a response like +responseWithFile:byteRange: and sets the
* "Content-Disposition" HTTP header appropriately for a download if the * "Content-Disposition" HTTP header for a download if the "attachment"
* "attachment" argument is YES. * argument is YES.
*/ */
+ (instancetype)responseWithFile:(NSString*)path byteRange:(NSRange)range isAttachment:(BOOL)attachment; + (instancetype)responseWithFile:(NSString*)path byteRange:(NSRange)range isAttachment:(BOOL)attachment;
/** /**
* Initializes a response with the contents of a file and the content type * Initializes a response with the contents of a file.
* automatically set from the file extension.
*/ */
- (instancetype)initWithFile:(NSString*)path; - (instancetype)initWithFile:(NSString*)path;
/** /**
* Initializes a response like -initWithFile: but sets the "Content-Disposition" * Initializes a response like +responseWithFile: and sets the
* HTTP header appropriately for a download if the "attachment" argument is YES. * "Content-Disposition" HTTP header for a download if the "attachment"
* argument is YES.
*/ */
- (instancetype)initWithFile:(NSString*)path isAttachment:(BOOL)attachment; - (instancetype)initWithFile:(NSString*)path isAttachment:(BOOL)attachment;

View File

@@ -30,7 +30,7 @@
@class GCDWebUploader; @class GCDWebUploader;
/** /**
* Delegate methods for GCDWebUploaderDelegate. * Delegate methods for GCDWebUploader.
* *
* @warning These methods are always called on the main thread in a serialized way. * @warning These methods are always called on the main thread in a serialized way.
*/ */
@@ -70,37 +70,39 @@
* or directories. * or directories.
* *
* See the README.md file for more information about the features of GCDWebUploader. * See the README.md file for more information about the features of GCDWebUploader.
*
* @warning For GCDWebUploader to work, "GCDWebUploader.bundle" must be added
* to the resources of the Xcode target.
*/ */
@interface GCDWebUploader : GCDWebServer @interface GCDWebUploader : GCDWebServer
/** /**
* Returns the upload directory as specified when the server was initialized. * Returns the upload directory as specified when the uploader was initialized.
*/ */
@property(nonatomic, readonly) NSString* uploadDirectory; @property(nonatomic, readonly) NSString* uploadDirectory;
/** /**
* Sets the delegate for the server. * Sets the delegate for the uploader.
*/ */
@property(nonatomic, assign) id<GCDWebUploaderDelegate> delegate; @property(nonatomic, assign) id<GCDWebUploaderDelegate> delegate;
/** /**
* Restricts which files should be listed and allowed to be uploaded, downloaded, * Sets which files are allowed to be operated on depending on their extension.
* moved or deleted depending on their extensions.
* *
* The default value is nil i.e. all file extensions are allowed. * The default value is nil i.e. all file extensions are allowed.
*/ */
@property(nonatomic, copy) NSArray* allowedFileExtensions; @property(nonatomic, copy) NSArray* allowedFileExtensions;
/** /**
* Sets if files and directories whose name start with a period should be * Sets if files and directories whose name start with a period are allowed to
* listed and allowed to be uploaded, downloaded, moved or deleted. * be operated on.
* *
* The default value is NO. * The default value is NO.
*/ */
@property(nonatomic) BOOL allowHiddenItems; @property(nonatomic) BOOL allowHiddenItems;
/** /**
* Sets the title for the uploader interface. * Sets the title for the uploader web interface.
* *
* The default value is the application name. * The default value is the application name.
* *
@@ -110,7 +112,7 @@
@property(nonatomic, copy) NSString* title; @property(nonatomic, copy) NSString* title;
/** /**
* Sets the header for the uploader interface. * Sets the header for the uploader web interface.
* *
* The default value is the same as the title property. * The default value is the same as the title property.
* *
@@ -120,7 +122,7 @@
@property(nonatomic, copy) NSString* header; @property(nonatomic, copy) NSString* header;
/** /**
* Sets the prologue for the uploader interface. * Sets the prologue for the uploader web interface.
* *
* The default value is a short help text. * The default value is a short help text.
* *
@@ -130,7 +132,7 @@
@property(nonatomic, copy) NSString* prologue; @property(nonatomic, copy) NSString* prologue;
/** /**
* Sets the epilogue for the uploader interface. * Sets the epilogue for the uploader web interface.
* *
* The default value is nil i.e. no epilogue. * The default value is nil i.e. no epilogue.
* *
@@ -140,7 +142,7 @@
@property(nonatomic, copy) NSString* epilogue; @property(nonatomic, copy) NSString* epilogue;
/** /**
* Sets the footer for the uploader interface. * Sets the footer for the uploader web interface.
* *
* The default value is the application name and version. * The default value is the application name and version.
* *
@@ -164,7 +166,7 @@
@interface GCDWebUploader (Subclassing) @interface GCDWebUploader (Subclassing)
/** /**
* This method is called to check if a file is allowed to be uploaded. * This method is called to check if a file upload is allowed to complete.
* The uploaded file is available for inspection at "tempPath". * The uploaded file is available for inspection at "tempPath".
* *
* The default implementation returns YES. * The default implementation returns YES.

View File

@@ -169,7 +169,6 @@ int main(int argc, const char* argv[]) {
GCDWebServer* webServer = [[GCDWebServer alloc] init]; GCDWebServer* webServer = [[GCDWebServer alloc] init];
[webServer addGETHandlerForBasePath:@"/" directoryPath:NSHomeDirectory() indexFilename:nil cacheAge:3600 allowRangeRequests:YES]; [webServer addGETHandlerForBasePath:@"/" directoryPath:NSHomeDirectory() indexFilename:nil cacheAge:3600 allowRangeRequests:YES];
[webServer runWithPort:8080]; [webServer runWithPort:8080];
[webServer release]; // Remove if using ARC
} }
return 0; return 0;