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