|  | // | 
|  | //   Copyright 2012 Square Inc. | 
|  | // | 
|  | //   Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | //   you may not use this file except in compliance with the License. | 
|  | //   You may obtain a copy of the License at | 
|  | // | 
|  | //       http://www.apache.org/licenses/LICENSE-2.0 | 
|  | // | 
|  | //   Unless required by applicable law or agreed to in writing, software | 
|  | //   distributed under the License is distributed on an "AS IS" BASIS, | 
|  | //   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | //   See the License for the specific language governing permissions and | 
|  | //   limitations under the License. | 
|  | // | 
|  |  | 
|  | #import <Foundation/Foundation.h> | 
|  | #import <Security/SecCertificate.h> | 
|  |  | 
|  | typedef enum { | 
|  | SR_CONNECTING   = 0, | 
|  | SR_OPEN         = 1, | 
|  | SR_CLOSING      = 2, | 
|  | SR_CLOSED       = 3, | 
|  | } SRReadyState; | 
|  |  | 
|  | typedef enum SRStatusCode : NSInteger { | 
|  | SRStatusCodeNormal = 1000, | 
|  | SRStatusCodeGoingAway = 1001, | 
|  | SRStatusCodeProtocolError = 1002, | 
|  | SRStatusCodeUnhandledType = 1003, | 
|  | // 1004 reserved. | 
|  | SRStatusNoStatusReceived = 1005, | 
|  | // 1004-1006 reserved. | 
|  | SRStatusCodeInvalidUTF8 = 1007, | 
|  | SRStatusCodePolicyViolated = 1008, | 
|  | SRStatusCodeMessageTooBig = 1009, | 
|  | } SRStatusCode; | 
|  |  | 
|  | @class SRWebSocket; | 
|  |  | 
|  | extern NSString *const SRWebSocketErrorDomain; | 
|  | extern NSString *const SRHTTPResponseErrorKey; | 
|  |  | 
|  | #pragma mark - SRWebSocketDelegate | 
|  |  | 
|  | @protocol SRWebSocketDelegate; | 
|  |  | 
|  | #pragma mark - SRWebSocket | 
|  |  | 
|  | @interface SRWebSocket : NSObject <NSStreamDelegate> | 
|  |  | 
|  | @property (nonatomic, weak) id <SRWebSocketDelegate> delegate; | 
|  |  | 
|  | @property (nonatomic, readonly) SRReadyState readyState; | 
|  | @property (nonatomic, readonly, retain) NSURL *url; | 
|  |  | 
|  | // This returns the negotiated protocol. | 
|  | // It will be nil until after the handshake completes. | 
|  | @property (nonatomic, readonly, copy) NSString *protocol; | 
|  |  | 
|  | // Protocols should be an array of strings that turn into Sec-WebSocket-Protocol. | 
|  | - (id)initWithURLRequest:(NSURLRequest *)request protocols:(NSArray *)protocols; | 
|  | - (id)initWithURLRequest:(NSURLRequest *)request; | 
|  |  | 
|  | // Some helper constructors. | 
|  | - (id)initWithURL:(NSURL *)url protocols:(NSArray *)protocols; | 
|  | - (id)initWithURL:(NSURL *)url; | 
|  |  | 
|  | // Delegate queue will be dispatch_main_queue by default. | 
|  | // You cannot set both OperationQueue and dispatch_queue. | 
|  | - (void)setDelegateOperationQueue:(NSOperationQueue*) queue; | 
|  | - (void)setDelegateDispatchQueue:(dispatch_queue_t) queue; | 
|  |  | 
|  | // By default, it will schedule itself on +[NSRunLoop SR_networkRunLoop] using defaultModes. | 
|  | - (void)scheduleInRunLoop:(NSRunLoop *)aRunLoop forMode:(NSString *)mode; | 
|  | - (void)unscheduleFromRunLoop:(NSRunLoop *)aRunLoop forMode:(NSString *)mode; | 
|  |  | 
|  | // SRWebSockets are intended for one-time-use only.  Open should be called once and only once. | 
|  | - (void)open; | 
|  |  | 
|  | - (void)close; | 
|  | - (void)closeWithCode:(NSInteger)code reason:(NSString *)reason; | 
|  |  | 
|  | // Send a UTF8 String or Data. | 
|  | - (void)send:(id)data; | 
|  |  | 
|  | // Send Data (can be nil) in a ping message. | 
|  | - (void)sendPing:(NSData *)data; | 
|  |  | 
|  | @end | 
|  |  | 
|  | #pragma mark - SRWebSocketDelegate | 
|  |  | 
|  | @protocol SRWebSocketDelegate <NSObject> | 
|  |  | 
|  | // message will either be an NSString if the server is using text | 
|  | // or NSData if the server is using binary. | 
|  | - (void)webSocket:(SRWebSocket *)webSocket didReceiveMessage:(id)message; | 
|  |  | 
|  | @optional | 
|  |  | 
|  | - (void)webSocketDidOpen:(SRWebSocket *)webSocket; | 
|  | - (void)webSocket:(SRWebSocket *)webSocket didFailWithError:(NSError *)error; | 
|  | - (void)webSocket:(SRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean; | 
|  | - (void)webSocket:(SRWebSocket *)webSocket didReceivePong:(NSData *)pongPayload; | 
|  |  | 
|  | @end | 
|  |  | 
|  | #pragma mark - NSURLRequest (CertificateAdditions) | 
|  |  | 
|  | @interface NSURLRequest (CertificateAdditions) | 
|  |  | 
|  | @property (nonatomic, retain, readonly) NSArray *SR_SSLPinnedCertificates; | 
|  |  | 
|  | @end | 
|  |  | 
|  | #pragma mark - NSMutableURLRequest (CertificateAdditions) | 
|  |  | 
|  | @interface NSMutableURLRequest (CertificateAdditions) | 
|  |  | 
|  | @property (nonatomic, retain) NSArray *SR_SSLPinnedCertificates; | 
|  |  | 
|  | @end | 
|  |  | 
|  | #pragma mark - NSRunLoop (SRWebSocket) | 
|  |  | 
|  | @interface NSRunLoop (SRWebSocket) | 
|  |  | 
|  | + (NSRunLoop *)SR_networkRunLoop; | 
|  |  | 
|  | @end |