| // |
| // 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 |