فهرست منبع

Merge pull request #56 from jaanus/customBonjourType

Can specify a custom Bonjour service type for the server.
Pierre-Olivier Latour 11 سال پیش
والد
کامیت
d1c7f9a323
2فایلهای تغییر یافته به همراه23 افزوده شده و 1 حذف شده
  1. 15 0
      GCDWebServer/Core/GCDWebServer.h
  2. 8 1
      GCDWebServer/Core/GCDWebServer.m

+ 15 - 0
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.
  */

+ 8 - 1
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);