206 lines
6.6 KiB
Objective-C
206 lines
6.6 KiB
Objective-C
#import <Foundation/Foundation.h>
|
|
|
|
@class GCDAsyncSocket;
|
|
@class WebSocket;
|
|
|
|
#if TARGET_OS_IPHONE
|
|
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 40000 // iPhone 4.0
|
|
#define IMPLEMENTED_PROTOCOLS <NSNetServiceDelegate>
|
|
#else
|
|
#define IMPLEMENTED_PROTOCOLS
|
|
#endif
|
|
#else
|
|
#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1060 // Mac OS X 10.6
|
|
#define IMPLEMENTED_PROTOCOLS <NSNetServiceDelegate>
|
|
#else
|
|
#define IMPLEMENTED_PROTOCOLS
|
|
#endif
|
|
#endif
|
|
|
|
|
|
@interface HTTPServer : NSObject IMPLEMENTED_PROTOCOLS
|
|
{
|
|
// Underlying asynchronous TCP/IP socket
|
|
GCDAsyncSocket *asyncSocket;
|
|
|
|
// Dispatch queues
|
|
dispatch_queue_t serverQueue;
|
|
dispatch_queue_t connectionQueue;
|
|
void *IsOnServerQueueKey;
|
|
void *IsOnConnectionQueueKey;
|
|
|
|
// HTTP server configuration
|
|
NSString *documentRoot;
|
|
Class connectionClass;
|
|
NSString *interface;
|
|
UInt16 port;
|
|
|
|
// NSNetService and related variables
|
|
NSNetService *netService;
|
|
NSString *domain;
|
|
NSString *type;
|
|
NSString *name;
|
|
NSString *publishedName;
|
|
NSDictionary *txtRecordDictionary;
|
|
|
|
// Connection management
|
|
NSMutableArray *connections;
|
|
NSMutableArray *webSockets;
|
|
NSLock *connectionsLock;
|
|
NSLock *webSocketsLock;
|
|
|
|
BOOL isRunning;
|
|
}
|
|
|
|
/**
|
|
* Specifies the document root to serve files from.
|
|
* For example, if you set this to "/Users/<your_username>/Sites",
|
|
* then it will serve files out of the local Sites directory (including subdirectories).
|
|
*
|
|
* The default value is nil.
|
|
* The default server configuration will not serve any files until this is set.
|
|
*
|
|
* If you change the documentRoot while the server is running,
|
|
* the change will affect future incoming http connections.
|
|
**/
|
|
- (NSString *)documentRoot;
|
|
- (void)setDocumentRoot:(NSString *)value;
|
|
|
|
/**
|
|
* The connection class is the class used to handle incoming HTTP connections.
|
|
*
|
|
* The default value is [HTTPConnection class].
|
|
* You can override HTTPConnection, and then set this to [MyHTTPConnection class].
|
|
*
|
|
* If you change the connectionClass while the server is running,
|
|
* the change will affect future incoming http connections.
|
|
**/
|
|
- (Class)connectionClass;
|
|
- (void)setConnectionClass:(Class)value;
|
|
|
|
/**
|
|
* Set what interface you'd like the server to listen on.
|
|
* By default this is nil, which causes the server to listen on all available interfaces like en1, wifi etc.
|
|
*
|
|
* The interface may be specified by name (e.g. "en1" or "lo0") or by IP address (e.g. "192.168.4.34").
|
|
* You may also use the special strings "localhost" or "loopback" to specify that
|
|
* the socket only accept connections from the local machine.
|
|
**/
|
|
- (NSString *)interface;
|
|
- (void)setInterface:(NSString *)value;
|
|
|
|
/**
|
|
* The port number to run the HTTP server on.
|
|
*
|
|
* The default port number is zero, meaning the server will automatically use any available port.
|
|
* This is the recommended port value, as it avoids possible port conflicts with other applications.
|
|
* Technologies such as Bonjour can be used to allow other applications to automatically discover the port number.
|
|
*
|
|
* Note: As is common on most OS's, you need root privledges to bind to port numbers below 1024.
|
|
*
|
|
* You can change the port property while the server is running, but it won't affect the running server.
|
|
* To actually change the port the server is listening for connections on you'll need to restart the server.
|
|
*
|
|
* The listeningPort method will always return the port number the running server is listening for connections on.
|
|
* If the server is not running this method returns 0.
|
|
**/
|
|
- (UInt16)port;
|
|
- (UInt16)listeningPort;
|
|
- (void)setPort:(UInt16)value;
|
|
|
|
/**
|
|
* Bonjour domain for publishing the service.
|
|
* The default value is "local.".
|
|
*
|
|
* Note: Bonjour publishing requires you set a type.
|
|
*
|
|
* If you change the domain property after the bonjour service has already been published (server already started),
|
|
* you'll need to invoke the republishBonjour method to update the broadcasted bonjour service.
|
|
**/
|
|
- (NSString *)domain;
|
|
- (void)setDomain:(NSString *)value;
|
|
|
|
/**
|
|
* Bonjour name for publishing the service.
|
|
* The default value is "".
|
|
*
|
|
* If using an empty string ("") for the service name when registering,
|
|
* the system will automatically use the "Computer Name".
|
|
* Using an empty string will also handle name conflicts
|
|
* by automatically appending a digit to the end of the name.
|
|
*
|
|
* Note: Bonjour publishing requires you set a type.
|
|
*
|
|
* If you change the name after the bonjour service has already been published (server already started),
|
|
* you'll need to invoke the republishBonjour method to update the broadcasted bonjour service.
|
|
*
|
|
* The publishedName method will always return the actual name that was published via the bonjour service.
|
|
* If the service is not running this method returns nil.
|
|
**/
|
|
- (NSString *)name;
|
|
- (NSString *)publishedName;
|
|
- (void)setName:(NSString *)value;
|
|
|
|
/**
|
|
* Bonjour type for publishing the service.
|
|
* The default value is nil.
|
|
* The service will not be published via bonjour unless the type is set.
|
|
*
|
|
* If you wish to publish the service as a traditional HTTP server, you should set the type to be "_http._tcp.".
|
|
*
|
|
* If you change the type after the bonjour service has already been published (server already started),
|
|
* you'll need to invoke the republishBonjour method to update the broadcasted bonjour service.
|
|
**/
|
|
- (NSString *)type;
|
|
- (void)setType:(NSString *)value;
|
|
|
|
/**
|
|
* Republishes the service via bonjour if the server is running.
|
|
* If the service was not previously published, this method will publish it (if the server is running).
|
|
**/
|
|
- (void)republishBonjour;
|
|
|
|
/**
|
|
*
|
|
**/
|
|
- (NSDictionary *)TXTRecordDictionary;
|
|
- (void)setTXTRecordDictionary:(NSDictionary *)dict;
|
|
|
|
/**
|
|
* Attempts to starts the server on the configured port, interface, etc.
|
|
*
|
|
* If an error occurs, this method returns NO and sets the errPtr (if given).
|
|
* Otherwise returns YES on success.
|
|
*
|
|
* Some examples of errors that might occur:
|
|
* - You specified the server listen on a port which is already in use by another application.
|
|
* - You specified the server listen on a port number below 1024, which requires root priviledges.
|
|
*
|
|
* Code Example:
|
|
*
|
|
* NSError *err = nil;
|
|
* if (![httpServer start:&err])
|
|
* {
|
|
* NSLog(@"Error starting http server: %@", err);
|
|
* }
|
|
**/
|
|
- (BOOL)start:(NSError **)errPtr;
|
|
|
|
/**
|
|
* Stops the server, preventing it from accepting any new connections.
|
|
* You may specify whether or not you want to close the existing client connections.
|
|
*
|
|
* The default stop method (with no arguments) will close any existing connections. (It invokes [self stop:NO])
|
|
**/
|
|
- (void)stop;
|
|
- (void)stop:(BOOL)keepExistingConnections;
|
|
|
|
- (BOOL)isRunning;
|
|
|
|
- (void)addWebSocket:(WebSocket *)ws;
|
|
|
|
- (NSUInteger)numberOfHTTPConnections;
|
|
- (NSUInteger)numberOfWebSocketConnections;
|
|
|
|
@end
|