mirror of
https://github.com/swisspol/GCDWebServer.git
synced 2026-02-11 00:00:07 +08:00
Compare commits
9 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
628cf6833c | ||
|
|
9392ddadb6 | ||
|
|
5dee044caa | ||
|
|
7c8205caa0 | ||
|
|
965e111280 | ||
|
|
8a69050cca | ||
|
|
a15a49240a | ||
|
|
404b46537e | ||
|
|
811e18e2fa |
@@ -41,6 +41,7 @@ typedef GCDWebServerResponse* (^GCDWebServerProcessBlock)(GCDWebServerRequest* r
|
|||||||
}
|
}
|
||||||
@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
|
||||||
- (void)addHandlerWithMatchBlock:(GCDWebServerMatchBlock)matchBlock processBlock:(GCDWebServerProcessBlock)processBlock;
|
- (void)addHandlerWithMatchBlock:(GCDWebServerMatchBlock)matchBlock processBlock:(GCDWebServerProcessBlock)processBlock;
|
||||||
- (void)removeAllHandlers;
|
- (void)removeAllHandlers;
|
||||||
|
|
||||||
|
|||||||
@@ -145,6 +145,11 @@ static void _SignalHandler(int signal) {
|
|||||||
ARC_DEALLOC(super);
|
ARC_DEALLOC(super);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (NSString*)bonjourName {
|
||||||
|
CFStringRef name = _service ? CFNetServiceGetName(_service) : NULL;
|
||||||
|
return name && CFStringGetLength(name) ? ARC_BRIDGE_RELEASE(CFStringCreateCopy(kCFAllocatorDefault, name)) : nil;
|
||||||
|
}
|
||||||
|
|
||||||
- (void)addHandlerWithMatchBlock:(GCDWebServerMatchBlock)matchBlock processBlock:(GCDWebServerProcessBlock)handlerBlock {
|
- (void)addHandlerWithMatchBlock:(GCDWebServerMatchBlock)matchBlock processBlock:(GCDWebServerProcessBlock)handlerBlock {
|
||||||
DCHECK(_source == NULL);
|
DCHECK(_source == NULL);
|
||||||
GCDWebServerHandler* handler = [[GCDWebServerHandler alloc] initWithMatchBlock:matchBlock processBlock:handlerBlock];
|
GCDWebServerHandler* handler = [[GCDWebServerHandler alloc] initWithMatchBlock:matchBlock processBlock:handlerBlock];
|
||||||
@@ -166,7 +171,7 @@ static void _NetServiceClientCallBack(CFNetServiceRef service, CFStreamError* er
|
|||||||
if (error->error) {
|
if (error->error) {
|
||||||
LOG_ERROR(@"Bonjour error %i (domain %i)", error->error, (int)error->domain);
|
LOG_ERROR(@"Bonjour error %i (domain %i)", error->error, (int)error->domain);
|
||||||
} else {
|
} else {
|
||||||
LOG_VERBOSE(@"Registered Bonjour service \"%@\" with type '%@' on port %i", CFNetServiceGetName(service), CFNetServiceGetType(service), CFNetServiceGetPortNumber(service));
|
LOG_VERBOSE(@"Registered Bonjour service \"%@\" in domain \"%@\" with type '%@' on port %i", CFNetServiceGetName(service), CFNetServiceGetDomain(service), CFNetServiceGetType(service), CFNetServiceGetPortNumber(service));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -282,7 +287,7 @@ 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
|
||||||
dispatch_release(_source);
|
ARC_DISPATCH_RELEASE(_source);
|
||||||
_source = NULL;
|
_source = NULL;
|
||||||
|
|
||||||
LOG_VERBOSE(@"%@ stopped", [self class]);
|
LOG_VERBOSE(@"%@ stopped", [self class]);
|
||||||
|
|||||||
@@ -193,7 +193,7 @@ static dispatch_queue_t _formatterQueue = NULL;
|
|||||||
#if !__has_feature(objc_arc)
|
#if !__has_feature(objc_arc)
|
||||||
[data retain];
|
[data retain];
|
||||||
#endif
|
#endif
|
||||||
dispatch_data_t buffer = dispatch_data_create(data.bytes, data.length, dispatch_get_current_queue(), ^{
|
dispatch_data_t buffer = dispatch_data_create(data.bytes, data.length, dispatch_get_main_queue(), ^{
|
||||||
#if __has_feature(objc_arc)
|
#if __has_feature(objc_arc)
|
||||||
[data self]; // Keeps ARC from releasing data too early
|
[data self]; // Keeps ARC from releasing data too early
|
||||||
#else
|
#else
|
||||||
@@ -201,7 +201,7 @@ static dispatch_queue_t _formatterQueue = NULL;
|
|||||||
#endif
|
#endif
|
||||||
});
|
});
|
||||||
[self _writeBuffer:buffer withCompletionBlock:block];
|
[self _writeBuffer:buffer withCompletionBlock:block];
|
||||||
dispatch_release(buffer);
|
ARC_DISPATCH_RELEASE(buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)_writeHeadersWithCompletionBlock:(WriteHeadersCompletionBlock)block {
|
- (void)_writeHeadersWithCompletionBlock:(WriteHeadersCompletionBlock)block {
|
||||||
@@ -226,7 +226,7 @@ static dispatch_queue_t _formatterQueue = NULL;
|
|||||||
}
|
}
|
||||||
|
|
||||||
}];
|
}];
|
||||||
dispatch_release(wrapper);
|
ARC_DISPATCH_RELEASE(wrapper);
|
||||||
} else if (result < 0) {
|
} else if (result < 0) {
|
||||||
LOG_ERROR(@"Failed reading response body on socket %i (error %i)", _socket, (int)result);
|
LOG_ERROR(@"Failed reading response body on socket %i (error %i)", _socket, (int)result);
|
||||||
block(NO);
|
block(NO);
|
||||||
@@ -244,7 +244,6 @@ static dispatch_queue_t _formatterQueue = NULL;
|
|||||||
@synthesize server=_server, address=_address, totalBytesRead=_bytesRead, totalBytesWritten=_bytesWritten;
|
@synthesize server=_server, address=_address, totalBytesRead=_bytesRead, totalBytesWritten=_bytesWritten;
|
||||||
|
|
||||||
+ (void)initialize {
|
+ (void)initialize {
|
||||||
DCHECK([NSThread isMainThread]); // NSDateFormatter should be initialized on main thread
|
|
||||||
if (_separatorData == nil) {
|
if (_separatorData == nil) {
|
||||||
_separatorData = [[NSData alloc] initWithBytes:"\r\n\r\n" length:4];
|
_separatorData = [[NSData alloc] initWithBytes:"\r\n\r\n" length:4];
|
||||||
DCHECK(_separatorData);
|
DCHECK(_separatorData);
|
||||||
@@ -260,6 +259,7 @@ static dispatch_queue_t _formatterQueue = NULL;
|
|||||||
DCHECK(_continueData);
|
DCHECK(_continueData);
|
||||||
}
|
}
|
||||||
if (_dateFormatter == nil) {
|
if (_dateFormatter == nil) {
|
||||||
|
DCHECK([NSThread isMainThread]); // NSDateFormatter should be initialized on main thread
|
||||||
_dateFormatter = [[NSDateFormatter alloc] init];
|
_dateFormatter = [[NSDateFormatter alloc] init];
|
||||||
_dateFormatter.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
|
_dateFormatter.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
|
||||||
_dateFormatter.dateFormat = @"EEE',' dd MMM yyyy HH':'mm':'ss 'GMT'";
|
_dateFormatter.dateFormat = @"EEE',' dd MMM yyyy HH':'mm':'ss 'GMT'";
|
||||||
|
|||||||
@@ -25,6 +25,8 @@
|
|||||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#import <TargetConditionals.h>
|
||||||
|
|
||||||
#if __has_feature(objc_arc)
|
#if __has_feature(objc_arc)
|
||||||
#define ARC_BRIDGE __bridge
|
#define ARC_BRIDGE __bridge
|
||||||
#define ARC_BRIDGE_RELEASE(__OBJECT__) CFBridgingRelease(__OBJECT__)
|
#define ARC_BRIDGE_RELEASE(__OBJECT__) CFBridgingRelease(__OBJECT__)
|
||||||
@@ -32,6 +34,11 @@
|
|||||||
#define ARC_RELEASE(__OBJECT__)
|
#define ARC_RELEASE(__OBJECT__)
|
||||||
#define ARC_AUTORELEASE(__OBJECT__) __OBJECT__
|
#define ARC_AUTORELEASE(__OBJECT__) __OBJECT__
|
||||||
#define ARC_DEALLOC(__OBJECT__)
|
#define ARC_DEALLOC(__OBJECT__)
|
||||||
|
#if (TARGET_OS_IPHONE && (__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_6_0)) || (!TARGET_OS_IPHONE && (__MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_8))
|
||||||
|
#define ARC_DISPATCH_RELEASE(__OBJECT__)
|
||||||
|
#else
|
||||||
|
#define ARC_DISPATCH_RELEASE(__OBJECT__) dispatch_release(__OBJECT__)
|
||||||
|
#endif
|
||||||
#else
|
#else
|
||||||
#define ARC_BRIDGE
|
#define ARC_BRIDGE
|
||||||
#define ARC_BRIDGE_RELEASE(__OBJECT__) [(id)__OBJECT__ autorelease]
|
#define ARC_BRIDGE_RELEASE(__OBJECT__) [(id)__OBJECT__ autorelease]
|
||||||
@@ -39,6 +46,7 @@
|
|||||||
#define ARC_RELEASE(__OBJECT__) [__OBJECT__ release]
|
#define ARC_RELEASE(__OBJECT__) [__OBJECT__ release]
|
||||||
#define ARC_AUTORELEASE(__OBJECT__) [__OBJECT__ autorelease]
|
#define ARC_AUTORELEASE(__OBJECT__) [__OBJECT__ autorelease]
|
||||||
#define ARC_DEALLOC(__OBJECT__) [__OBJECT__ dealloc]
|
#define ARC_DEALLOC(__OBJECT__) [__OBJECT__ dealloc]
|
||||||
|
#define ARC_DISPATCH_RELEASE(__OBJECT__) dispatch_release(__OBJECT__)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#import "GCDWebServerConnection.h"
|
#import "GCDWebServerConnection.h"
|
||||||
@@ -62,7 +70,7 @@ static inline void __LogMessage(long level, NSString* format, ...) {
|
|||||||
va_start(arguments, format);
|
va_start(arguments, format);
|
||||||
NSString* message = [[NSString alloc] initWithFormat:format arguments:arguments];
|
NSString* message = [[NSString alloc] initWithFormat:format arguments:arguments];
|
||||||
va_end(arguments);
|
va_end(arguments);
|
||||||
printf("[%s] %s\n", levelNames[level], [message UTF8String]);
|
fprintf(stderr, "[%s] %s\n", levelNames[level], [message UTF8String]);
|
||||||
ARC_RELEASE(message);
|
ARC_RELEASE(message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
18
GCDWebServer.podspec
Normal file
18
GCDWebServer.podspec
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
Pod::Spec.new do |s|
|
||||||
|
s.name = 'GCDWebServer'
|
||||||
|
s.version = '1.2'
|
||||||
|
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 Mac OS X & iOS apps'
|
||||||
|
s.source = { :git => 'https://github.com/swisspol/GCDWebServer.git', :tag => s.version.to_s }
|
||||||
|
|
||||||
|
s.requires_arc = true
|
||||||
|
|
||||||
|
s.source_files = 'CGDWebServer/*.{h,m}'
|
||||||
|
|
||||||
|
s.ios.deployment_target = '5.0'
|
||||||
|
s.osx.deployment_target = '10.7'
|
||||||
|
|
||||||
|
s.ios.framework = 'MobileCoreServices'
|
||||||
|
end
|
||||||
Reference in New Issue
Block a user