diff --git a/GCDWebServer/Core/GCDWebServer.h b/GCDWebServer/Core/GCDWebServer.h index 93dba4a..96dc3cf 100644 --- a/GCDWebServer/Core/GCDWebServer.h +++ b/GCDWebServer/Core/GCDWebServer.h @@ -83,6 +83,13 @@ extern NSString* const GCDWebServerOption_Port; */ extern NSString* const GCDWebServerOption_BonjourName; +/** + * The Bonjour service type used by the GCDWebServer (NSString). + * + * The default value is "_http._tcp", standard HTTP web server. + */ +extern NSString* const GCDWebServerOption_BonjourType; + /** * The maximum number of incoming HTTP requests that can be queued waiting to * be handled before new ones are dropped (NSNumber / NSUInteger). @@ -266,6 +273,14 @@ extern NSString* const GCDWebServerAuthenticationMethod_DigestAccess; */ @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. */ diff --git a/GCDWebServer/Core/GCDWebServer.m b/GCDWebServer/Core/GCDWebServer.m index 43682f6..aa407d1 100644 --- a/GCDWebServer/Core/GCDWebServer.m +++ b/GCDWebServer/Core/GCDWebServer.m @@ -45,6 +45,7 @@ NSString* const GCDWebServerOption_Port = @"Port"; NSString* const GCDWebServerOption_BonjourName = @"BonjourName"; +NSString* const GCDWebServerOption_BonjourType = @"BonjourType"; NSString* const GCDWebServerOption_MaxPendingConnections = @"MaxPendingConnections"; NSString* const GCDWebServerOption_ServerName = @"ServerName"; NSString* const GCDWebServerOption_AuthenticationMethod = @"AuthenticationMethod"; @@ -342,6 +343,11 @@ static void _DisconnectTimerCallBack(CFRunLoopTimerRef timer, void* info) { return name && CFStringGetLength(name) ? ARC_BRIDGE_RELEASE(CFStringCreateCopy(kCFAllocatorDefault, name)) : nil; } +- (NSString*)bonjourType { + CFStringRef type = _service ? CFNetServiceGetType(_service) : NULL; + return type && CFStringGetLength(type) ? ARC_BRIDGE_RELEASE(CFStringCreateCopy(kCFAllocatorDefault, type)) : nil; +} + - (void)addHandlerWithMatchBlock:(GCDWebServerMatchBlock)matchBlock processBlock:(GCDWebServerProcessBlock)handlerBlock { DCHECK(_options == nil); GCDWebServerHandler* handler = [[GCDWebServerHandler alloc] initWithMatchBlock:matchBlock processBlock:handlerBlock]; @@ -388,6 +394,7 @@ static inline NSString* _EncodeBase64(NSString* string) { DCHECK(_source == NULL); NSUInteger port = [_GetOption(_options, GCDWebServerOption_Port, @0) unsignedIntegerValue]; NSString* name = _GetOption(_options, GCDWebServerOption_BonjourName, @""); + NSString* bonjourType = _GetOption(_options, GCDWebServerOption_BonjourType, @"_http._tcp"); NSUInteger maxPendingConnections = [_GetOption(_options, GCDWebServerOption_MaxPendingConnections, @16) unsignedIntegerValue]; int listeningSocket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); if (listeningSocket > 0) { @@ -485,7 +492,7 @@ static inline NSString* _EncodeBase64(NSString* string) { } if (name) { - _service = CFNetServiceCreate(kCFAllocatorDefault, CFSTR("local."), CFSTR("_http._tcp"), (ARC_BRIDGE CFStringRef)name, (SInt32)_port); + _service = CFNetServiceCreate(kCFAllocatorDefault, CFSTR("local."), (ARC_BRIDGE CFStringRef)bonjourType, (ARC_BRIDGE CFStringRef)name, (SInt32)_port); if (_service) { CFNetServiceClientContext context = {0, (ARC_BRIDGE void*)self, NULL, NULL, NULL}; CFNetServiceSetClient(_service, _NetServiceClientCallBack, &context);