Added GCDWebServerDelegate

This commit is contained in:
Pierre-Olivier Latour
2014-04-16 00:39:56 -03:00
parent 05a704bcef
commit c5ca0f7cee
6 changed files with 59 additions and 37 deletions

View File

@ -29,14 +29,15 @@
@class GCDWebDAVServer; @class GCDWebDAVServer;
@protocol GCDWebDAVServerDelegate <NSObject> // These methods are always called on main thread
@protocol GCDWebDAVServerDelegate <GCDWebServerDelegate>
@optional @optional
- (void)davServer:(GCDWebDAVServer*)uploader didDownloadFileAtPath:(NSString*)path; - (void)davServer:(GCDWebDAVServer*)server didDownloadFileAtPath:(NSString*)path;
- (void)davServer:(GCDWebDAVServer*)uploader didUploadFileAtPath:(NSString*)path; - (void)davServer:(GCDWebDAVServer*)server didUploadFileAtPath:(NSString*)path;
- (void)davServer:(GCDWebDAVServer*)uploader didMoveItemFromPath:(NSString*)fromPath toPath:(NSString*)toPath; - (void)davServer:(GCDWebDAVServer*)server didMoveItemFromPath:(NSString*)fromPath toPath:(NSString*)toPath;
- (void)davServer:(GCDWebDAVServer*)uploader didCopyItemFromPath:(NSString*)fromPath toPath:(NSString*)toPath; - (void)davServer:(GCDWebDAVServer*)server didCopyItemFromPath:(NSString*)fromPath toPath:(NSString*)toPath;
- (void)davServer:(GCDWebDAVServer*)uploader didDeleteItemAtPath:(NSString*)path; - (void)davServer:(GCDWebDAVServer*)server didDeleteItemAtPath:(NSString*)path;
- (void)davServer:(GCDWebDAVServer*)uploader didCreateDirectoryAtPath:(NSString*)path; - (void)davServer:(GCDWebDAVServer*)server didCreateDirectoryAtPath:(NSString*)path;
@end @end
@interface GCDWebDAVServer : GCDWebServer @interface GCDWebDAVServer : GCDWebServer

View File

@ -54,7 +54,6 @@ typedef NS_ENUM(NSInteger, DAVProperties) {
@interface GCDWebDAVServer () { @interface GCDWebDAVServer () {
@private @private
NSString* _uploadDirectory; NSString* _uploadDirectory;
id<GCDWebDAVServerDelegate> __unsafe_unretained _delegate;
NSArray* _allowedExtensions; NSArray* _allowedExtensions;
BOOL _showHidden; BOOL _showHidden;
} }
@ -102,9 +101,9 @@ static inline BOOL _IsMacFinder(GCDWebServerRequest* request) {
return [GCDWebServerResponse response]; return [GCDWebServerResponse response];
} }
if ([_delegate respondsToSelector:@selector(davServer:didDownloadFileAtPath:)]) { if ([self.delegate respondsToSelector:@selector(davServer:didDownloadFileAtPath:)]) {
dispatch_async(dispatch_get_main_queue(), ^{ dispatch_async(dispatch_get_main_queue(), ^{
[_delegate davServer:self didDownloadFileAtPath:absolutePath]; [self.delegate davServer:self didDownloadFileAtPath:absolutePath];
}); });
} }
return [GCDWebServerFileResponse responseWithFile:absolutePath]; return [GCDWebServerFileResponse responseWithFile:absolutePath];
@ -145,9 +144,9 @@ static inline BOOL _IsMacFinder(GCDWebServerRequest* request) {
return [GCDWebServerErrorResponse responseWithServerError:kGCDWebServerHTTPStatusCode_InternalServerError underlyingError:error message:@"Failed moving uploaded file to \"%@\"", relativePath]; return [GCDWebServerErrorResponse responseWithServerError:kGCDWebServerHTTPStatusCode_InternalServerError underlyingError:error message:@"Failed moving uploaded file to \"%@\"", relativePath];
} }
if ([_delegate respondsToSelector:@selector(davServer:didUploadFileAtPath:)]) { if ([self.delegate respondsToSelector:@selector(davServer:didUploadFileAtPath:)]) {
dispatch_async(dispatch_get_main_queue(), ^{ dispatch_async(dispatch_get_main_queue(), ^{
[_delegate davServer:self didUploadFileAtPath:absolutePath]; [self.delegate davServer:self didUploadFileAtPath:absolutePath];
}); });
} }
return [GCDWebServerResponse responseWithStatusCode:(existing ? kGCDWebServerHTTPStatusCode_NoContent : kGCDWebServerHTTPStatusCode_Created)]; return [GCDWebServerResponse responseWithStatusCode:(existing ? kGCDWebServerHTTPStatusCode_NoContent : kGCDWebServerHTTPStatusCode_Created)];
@ -180,9 +179,9 @@ static inline BOOL _IsMacFinder(GCDWebServerRequest* request) {
return [GCDWebServerErrorResponse responseWithServerError:kGCDWebServerHTTPStatusCode_InternalServerError underlyingError:error message:@"Failed deleting \"%@\"", relativePath]; return [GCDWebServerErrorResponse responseWithServerError:kGCDWebServerHTTPStatusCode_InternalServerError underlyingError:error message:@"Failed deleting \"%@\"", relativePath];
} }
if ([_delegate respondsToSelector:@selector(davServer:didDeleteItemAtPath:)]) { if ([self.delegate respondsToSelector:@selector(davServer:didDeleteItemAtPath:)]) {
dispatch_async(dispatch_get_main_queue(), ^{ dispatch_async(dispatch_get_main_queue(), ^{
[_delegate davServer:self didDeleteItemAtPath:absolutePath]; [self.delegate davServer:self didDeleteItemAtPath:absolutePath];
}); });
} }
return [GCDWebServerResponse responseWithStatusCode:kGCDWebServerHTTPStatusCode_NoContent]; return [GCDWebServerResponse responseWithStatusCode:kGCDWebServerHTTPStatusCode_NoContent];
@ -226,9 +225,9 @@ static inline BOOL _IsMacFinder(GCDWebServerRequest* request) {
} }
#endif #endif
if ([_delegate respondsToSelector:@selector(davServer:didCreateDirectoryAtPath:)]) { if ([self.delegate respondsToSelector:@selector(davServer:didCreateDirectoryAtPath:)]) {
dispatch_async(dispatch_get_main_queue(), ^{ dispatch_async(dispatch_get_main_queue(), ^{
[_delegate davServer:self didCreateDirectoryAtPath:absolutePath]; [self.delegate davServer:self didCreateDirectoryAtPath:absolutePath];
}); });
} }
return [GCDWebServerResponse responseWithStatusCode:kGCDWebServerHTTPStatusCode_Created]; return [GCDWebServerResponse responseWithStatusCode:kGCDWebServerHTTPStatusCode_Created];
@ -298,15 +297,15 @@ static inline BOOL _IsMacFinder(GCDWebServerRequest* request) {
} }
if (isMove) { if (isMove) {
if ([_delegate respondsToSelector:@selector(davServer:didMoveItemFromPath:toPath:)]) { if ([self.delegate respondsToSelector:@selector(davServer:didMoveItemFromPath:toPath:)]) {
dispatch_async(dispatch_get_main_queue(), ^{ dispatch_async(dispatch_get_main_queue(), ^{
[_delegate davServer:self didMoveItemFromPath:srcAbsolutePath toPath:dstAbsolutePath]; [self.delegate davServer:self didMoveItemFromPath:srcAbsolutePath toPath:dstAbsolutePath];
}); });
} }
} else { } else {
if ([_delegate respondsToSelector:@selector(davServer:didCopyItemFromPath:toPath:)]) { if ([self.delegate respondsToSelector:@selector(davServer:didCopyItemFromPath:toPath:)]) {
dispatch_async(dispatch_get_main_queue(), ^{ dispatch_async(dispatch_get_main_queue(), ^{
[_delegate davServer:self didCopyItemFromPath:srcAbsolutePath toPath:dstAbsolutePath]; [self.delegate davServer:self didCopyItemFromPath:srcAbsolutePath toPath:dstAbsolutePath];
}); });
} }
} }
@ -598,7 +597,7 @@ static inline xmlNodePtr _XMLChildWithName(xmlNodePtr child, const xmlChar* name
@implementation GCDWebDAVServer @implementation GCDWebDAVServer
@synthesize uploadDirectory=_uploadDirectory, delegate=_delegate, allowedFileExtensions=_allowedExtensions, showHiddenFiles=_showHidden; @synthesize uploadDirectory=_uploadDirectory, allowedFileExtensions=_allowedExtensions, showHiddenFiles=_showHidden;
- (instancetype)initWithUploadDirectory:(NSString*)path { - (instancetype)initWithUploadDirectory:(NSString*)path {
if ((self = [super init])) { if ((self = [super init])) {

View File

@ -42,7 +42,17 @@ typedef NS_ENUM(int, GCDWebServerLogLevel) {
typedef GCDWebServerRequest* (^GCDWebServerMatchBlock)(NSString* requestMethod, NSURL* requestURL, NSDictionary* requestHeaders, NSString* urlPath, NSDictionary* urlQuery); typedef GCDWebServerRequest* (^GCDWebServerMatchBlock)(NSString* requestMethod, NSURL* requestURL, NSDictionary* requestHeaders, NSString* urlPath, NSDictionary* urlQuery);
typedef GCDWebServerResponse* (^GCDWebServerProcessBlock)(GCDWebServerRequest* request); typedef GCDWebServerResponse* (^GCDWebServerProcessBlock)(GCDWebServerRequest* request);
@class GCDWebServer;
// These methods are always called on main thread
@protocol GCDWebServerDelegate <NSObject>
@optional
- (void)webServerDidStart:(GCDWebServer*)server;
- (void)webServerDidStop:(GCDWebServer*)server;
@end
@interface GCDWebServer : NSObject @interface GCDWebServer : NSObject
@property(nonatomic, assign) id<GCDWebServerDelegate> delegate;
@property(nonatomic, readonly, getter=isRunning) BOOL running; @property(nonatomic, readonly, getter=isRunning) BOOL running;
@property(nonatomic, readonly) NSUInteger port; @property(nonatomic, readonly) NSUInteger port;
@property(nonatomic, readonly) NSString* bonjourName; // Only non-nil if Bonjour registration is active @property(nonatomic, readonly) NSString* bonjourName; // Only non-nil if Bonjour registration is active

View File

@ -43,6 +43,7 @@
@interface GCDWebServer () { @interface GCDWebServer () {
@private @private
id<GCDWebServerDelegate> __unsafe_unretained _delegate;
NSMutableArray* _handlers; NSMutableArray* _handlers;
NSUInteger _port; NSUInteger _port;
@ -119,7 +120,7 @@ static void _SignalHandler(int signal) {
@implementation GCDWebServer @implementation GCDWebServer
@synthesize handlers=_handlers, port=_port; @synthesize delegate=_delegate, handlers=_handlers, port=_port;
#ifndef __GCDWEBSERVER_LOGGING_HEADER__ #ifndef __GCDWEBSERVER_LOGGING_HEADER__
@ -144,6 +145,7 @@ static void _SignalHandler(int signal) {
} }
- (void)dealloc { - (void)dealloc {
_delegate = nil;
if (_source) { if (_source) {
[self stop]; [self stop];
} }
@ -249,7 +251,7 @@ static void _NetServiceClientCallBack(CFNetServiceRef service, CFStreamError* er
}); });
if (port == 0) { // Determine the actual port we are listening on if (port == 0) {
struct sockaddr addr; struct sockaddr addr;
socklen_t addrlen = sizeof(addr); socklen_t addrlen = sizeof(addr);
if (getsockname(listeningSocket, &addr, &addrlen) == 0) { if (getsockname(listeningSocket, &addr, &addrlen) == 0) {
@ -277,6 +279,11 @@ static void _NetServiceClientCallBack(CFNetServiceRef service, CFStreamError* er
dispatch_resume(_source); dispatch_resume(_source);
LOG_INFO(@"%@ started on port %i and reachable at %@", [self class], (int)_port, self.serverURL); 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];
});
}
} else { } else {
LOG_ERROR(@"Failed listening on socket: %s (%i)", strerror(errno), errno); LOG_ERROR(@"Failed listening on socket: %s (%i)", strerror(errno), errno);
close(listeningSocket); close(listeningSocket);
@ -308,10 +315,15 @@ static void _NetServiceClientCallBack(CFNetServiceRef service, CFStreamError* er
dispatch_source_cancel(_source); // This will close the socket dispatch_source_cancel(_source); // This will close the socket
ARC_DISPATCH_RELEASE(_source); ARC_DISPATCH_RELEASE(_source);
_source = NULL; _source = NULL;
_port = 0;
LOG_INFO(@"%@ stopped", [self class]); LOG_INFO(@"%@ stopped", [self class]);
if ([_delegate respondsToSelector:@selector(webServerDidStop:)]) {
dispatch_async(dispatch_get_main_queue(), ^{
[_delegate webServerDidStop:self];
});
}
} }
_port = 0;
} }
@end @end

View File

@ -29,7 +29,8 @@
@class GCDWebUploader; @class GCDWebUploader;
@protocol GCDWebUploaderDelegate <NSObject> // These methods are always called on main thread
@protocol GCDWebUploaderDelegate <GCDWebServerDelegate>
@optional @optional
- (void)webUploader:(GCDWebUploader*)uploader didDownloadFileAtPath:(NSString*)path; - (void)webUploader:(GCDWebUploader*)uploader didDownloadFileAtPath:(NSString*)path;
- (void)webUploader:(GCDWebUploader*)uploader didUploadFileAtPath:(NSString*)path; - (void)webUploader:(GCDWebUploader*)uploader didUploadFileAtPath:(NSString*)path;

View File

@ -45,7 +45,6 @@
@interface GCDWebUploader () { @interface GCDWebUploader () {
@private @private
NSString* _uploadDirectory; NSString* _uploadDirectory;
id<GCDWebUploaderDelegate> __unsafe_unretained _delegate;
NSArray* _allowedExtensions; NSArray* _allowedExtensions;
BOOL _showHidden; BOOL _showHidden;
NSString* _title; NSString* _title;
@ -143,9 +142,9 @@
return [GCDWebServerErrorResponse responseWithClientError:kGCDWebServerHTTPStatusCode_Forbidden message:@"Downlading file name \"%@\" is not allowed", fileName]; return [GCDWebServerErrorResponse responseWithClientError:kGCDWebServerHTTPStatusCode_Forbidden message:@"Downlading file name \"%@\" is not allowed", fileName];
} }
if ([_delegate respondsToSelector:@selector(webUploader:didDownloadFileAtPath: )]) { if ([self.delegate respondsToSelector:@selector(webUploader:didDownloadFileAtPath: )]) {
dispatch_async(dispatch_get_main_queue(), ^{ dispatch_async(dispatch_get_main_queue(), ^{
[_delegate webUploader:self didDownloadFileAtPath:absolutePath]; [self.delegate webUploader:self didDownloadFileAtPath:absolutePath];
}); });
} }
return [GCDWebServerFileResponse responseWithFile:absolutePath isAttachment:YES]; return [GCDWebServerFileResponse responseWithFile:absolutePath isAttachment:YES];
@ -171,9 +170,9 @@
return [GCDWebServerErrorResponse responseWithServerError:kGCDWebServerHTTPStatusCode_InternalServerError underlyingError:error message:@"Failed moving uploaded file to \"%@\"", relativePath]; return [GCDWebServerErrorResponse responseWithServerError:kGCDWebServerHTTPStatusCode_InternalServerError underlyingError:error message:@"Failed moving uploaded file to \"%@\"", relativePath];
} }
if ([_delegate respondsToSelector:@selector(webUploader:didUploadFileAtPath:)]) { if ([self.delegate respondsToSelector:@selector(webUploader:didUploadFileAtPath:)]) {
dispatch_async(dispatch_get_main_queue(), ^{ dispatch_async(dispatch_get_main_queue(), ^{
[_delegate webUploader:self didUploadFileAtPath:absolutePath]; [self.delegate webUploader:self didUploadFileAtPath:absolutePath];
}); });
} }
return [GCDWebServerDataResponse responseWithJSONObject:@{} contentType:contentType]; return [GCDWebServerDataResponse responseWithJSONObject:@{} contentType:contentType];
@ -204,9 +203,9 @@
return [GCDWebServerErrorResponse responseWithServerError:kGCDWebServerHTTPStatusCode_InternalServerError underlyingError:error message:@"Failed moving \"%@\" to \"%@\"", oldRelativePath, newRelativePath]; return [GCDWebServerErrorResponse responseWithServerError:kGCDWebServerHTTPStatusCode_InternalServerError underlyingError:error message:@"Failed moving \"%@\" to \"%@\"", oldRelativePath, newRelativePath];
} }
if ([_delegate respondsToSelector:@selector(webUploader:didMoveItemFromPath:toPath:)]) { if ([self.delegate respondsToSelector:@selector(webUploader:didMoveItemFromPath:toPath:)]) {
dispatch_async(dispatch_get_main_queue(), ^{ dispatch_async(dispatch_get_main_queue(), ^{
[_delegate webUploader:self didMoveItemFromPath:oldAbsolutePath toPath:newAbsolutePath]; [self.delegate webUploader:self didMoveItemFromPath:oldAbsolutePath toPath:newAbsolutePath];
}); });
} }
return [GCDWebServerDataResponse responseWithJSONObject:@{}]; return [GCDWebServerDataResponse responseWithJSONObject:@{}];
@ -234,9 +233,9 @@
return [GCDWebServerErrorResponse responseWithServerError:kGCDWebServerHTTPStatusCode_InternalServerError underlyingError:error message:@"Failed deleting \"%@\"", relativePath]; return [GCDWebServerErrorResponse responseWithServerError:kGCDWebServerHTTPStatusCode_InternalServerError underlyingError:error message:@"Failed deleting \"%@\"", relativePath];
} }
if ([_delegate respondsToSelector:@selector(webUploader:didDeleteItemAtPath:)]) { if ([self.delegate respondsToSelector:@selector(webUploader:didDeleteItemAtPath:)]) {
dispatch_async(dispatch_get_main_queue(), ^{ dispatch_async(dispatch_get_main_queue(), ^{
[_delegate webUploader:self didDeleteItemAtPath:absolutePath]; [self.delegate webUploader:self didDeleteItemAtPath:absolutePath];
}); });
} }
return [GCDWebServerDataResponse responseWithJSONObject:@{}]; return [GCDWebServerDataResponse responseWithJSONObject:@{}];
@ -260,9 +259,9 @@
return [GCDWebServerErrorResponse responseWithServerError:kGCDWebServerHTTPStatusCode_InternalServerError underlyingError:error message:@"Failed creating directory \"%@\"", relativePath]; return [GCDWebServerErrorResponse responseWithServerError:kGCDWebServerHTTPStatusCode_InternalServerError underlyingError:error message:@"Failed creating directory \"%@\"", relativePath];
} }
if ([_delegate respondsToSelector:@selector(webUploader:didCreateDirectoryAtPath:)]) { if ([self.delegate respondsToSelector:@selector(webUploader:didCreateDirectoryAtPath:)]) {
dispatch_async(dispatch_get_main_queue(), ^{ dispatch_async(dispatch_get_main_queue(), ^{
[_delegate webUploader:self didCreateDirectoryAtPath:absolutePath]; [self.delegate webUploader:self didCreateDirectoryAtPath:absolutePath];
}); });
} }
return [GCDWebServerDataResponse responseWithJSONObject:@{}]; return [GCDWebServerDataResponse responseWithJSONObject:@{}];
@ -272,7 +271,7 @@
@implementation GCDWebUploader @implementation GCDWebUploader
@synthesize uploadDirectory=_uploadDirectory, delegate=_delegate, allowedFileExtensions=_allowedExtensions, showHiddenFiles=_showHidden, @synthesize uploadDirectory=_uploadDirectory, allowedFileExtensions=_allowedExtensions, showHiddenFiles=_showHidden,
title=_title, header=_header, prologue=_prologue, epilogue=_epilogue, footer=_footer; title=_title, header=_header, prologue=_prologue, epilogue=_epilogue, footer=_footer;
- (instancetype)initWithUploadDirectory:(NSString*)path { - (instancetype)initWithUploadDirectory:(NSString*)path {