diff -r f240f9023393 -r 6c3b5372a307 1_0_to_1_1_diffs.diff --- a/1_0_to_1_1_diffs.diff Thu Jul 02 17:51:35 2009 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,425 +0,0 @@ -diff -r 70590cc555aa -r 16454d63d4c2 BLIP/BLIPConnection.h ---- a/BLIP/BLIPConnection.h Thu Jun 19 10:22:19 2008 -0700 -+++ b/BLIP/BLIPConnection.h Mon Jun 23 14:02:31 2008 -0700 -@@ -20,6 +20,7 @@ - @interface BLIPConnection : TCPConnection - { - BLIPDispatcher *_dispatcher; -+ BOOL _blipClosing; - } - - /** The delegate object that will be called when the connection opens, closes or receives messages. */ -@@ -73,6 +74,13 @@ - /** Called when a BLIPResponse (to one of your requests) is received from the peer. - This is called after the response object's onComplete target, if any, is invoked.*/ - - (void) connection: (BLIPConnection*)connection receivedResponse: (BLIPResponse*)response; -+ -+/** Called when the peer wants to close the connection. Return YES to allow, NO to prevent. */ -+- (BOOL) connectionReceivedCloseRequest: (BLIPConnection*)connection; -+ -+/** Called if the peer refuses a close request. -+ The typical error is kBLIPError_Forbidden. */ -+- (void) connection: (BLIPConnection*)connection closeRequestFailedWithError: (NSError*)error; - @end - - -diff -r 70590cc555aa -r 16454d63d4c2 BLIP/BLIPConnection.m ---- a/BLIP/BLIPConnection.m Thu Jun 19 10:22:19 2008 -0700 -+++ b/BLIP/BLIPConnection.m Mon Jun 23 14:02:31 2008 -0700 -@@ -8,6 +8,7 @@ - - #import "BLIPConnection.h" - #import "BLIP_Internal.h" -+#import "TCP_Internal.h" - #import "BLIPReader.h" - #import "BLIPWriter.h" - #import "BLIPDispatcher.h" -@@ -15,6 +16,7 @@ - #import "Logging.h" - #import "Test.h" - #import "ExceptionUtils.h" -+#import "Target.h" - - - NSString* const BLIPErrorDomain = @"BLIP"; -@@ -33,10 +35,14 @@ - } - - -+@interface BLIPConnection () -+- (void) _handleCloseRequest: (BLIPRequest*)request; -+@end - - - @implementation BLIPConnection - -+ - - (void) dealloc - { - [_dispatcher release]; -@@ -48,6 +54,11 @@ - - (id) delegate {return (id)_delegate;} - - (void) setDelegate: (id)delegate {_delegate = delegate;} - -+ -+#pragma mark - -+#pragma mark RECEIVING: -+ -+ - - (BLIPDispatcher*) dispatcher - { - if( ! _dispatcher ) { -@@ -58,11 +69,23 @@ - } - - -+- (void) _dispatchMetaRequest: (BLIPRequest*)request -+{ -+ NSString* profile = request.profile; -+ if( [profile isEqualToString: kBLIPProfile_Bye] ) -+ [self _handleCloseRequest: request]; -+ else -+ [request respondWithErrorCode: kBLIPError_NotFound message: @"Unknown meta profile"]; -+} -+ -+ - - (void) _dispatchRequest: (BLIPRequest*)request - { - LogTo(BLIP,@"Received all of %@",request.descriptionWithProperties); - @try{ -- if( ! [self.dispatcher dispatchMessage: request] ) -+ if( request._flags & kBLIP_Meta ) -+ [self _dispatchMetaRequest: request]; -+ else if( ! [self.dispatcher dispatchMessage: request] ) - [self tellDelegate: @selector(connection:receivedRequest:) withObject: request]; - if( ! request.noReply && ! request.repliedTo ) { - LogTo(BLIP,@"Returning default empty response to %@",request); -@@ -81,6 +104,10 @@ - } - - -+#pragma mark - -+#pragma mark SENDING: -+ -+ - - (BLIPRequest*) request - { - return [[[BLIPRequest alloc] _initWithConnection: self body: nil properties: nil] autorelease]; -@@ -103,11 +130,61 @@ - } - - -+#pragma mark - -+#pragma mark CLOSING: -+ -+ -+- (void) _beginClose -+{ -+ // Override of TCPConnection method. Instead of closing the socket, send a 'bye' request: -+ if( ! _blipClosing ) { -+ LogTo(BLIPVerbose,@"Sending close request..."); -+ BLIPRequest *r = [self request]; -+ [r _setFlag: kBLIP_Meta value: YES]; -+ r.profile = kBLIPProfile_Bye; -+ BLIPResponse *response = [r send]; -+ response.onComplete = $target(self,_receivedCloseResponse:); -+ } -+ // Put the writer in close mode, to prevent client from sending any more requests: -+ [self.writer close]; -+} -+ -+- (void) _receivedCloseResponse: (BLIPResponse*)response -+{ -+ NSError *error = response.error; -+ LogTo(BLIPVerbose,@"Received close response: error=%@",error); -+ if( error ) { -+ [self _unclose]; -+ [self tellDelegate: @selector(connection:closeRequestFailedWithError:) withObject: error]; -+ } else { -+ // Now finally close the socket: -+ [super _beginClose]; -+ } -+} -+ -+ -+- (void) _handleCloseRequest: (BLIPRequest*)request -+{ -+ LogTo(BLIPVerbose,@"Received a close request"); -+ if( [_delegate respondsToSelector: @selector(connectionReceivedCloseRequest:)] ) -+ if( ! [_delegate connectionReceivedCloseRequest: self] ) { -+ LogTo(BLIPVerbose,@"Responding with denial of close request"); -+ [request respondWithErrorCode: kBLIPError_Forbidden message: @"Close request denied"]; -+ return; -+ } -+ -+ LogTo(BLIPVerbose,@"Close request accepted"); -+ _blipClosing = YES; // this prevents _beginClose from sending a close request back -+ [self close]; -+} -+ -+ - @end - - - - -+#pragma mark - - @implementation BLIPListener - - - (id) initWithPort: (UInt16)port -diff -r 70590cc555aa -r 16454d63d4c2 BLIP/BLIPMessage.m ---- a/BLIP/BLIPMessage.m Thu Jun 19 10:22:19 2008 -0700 -+++ b/BLIP/BLIPMessage.m Mon Jun 23 14:02:31 2008 -0700 -@@ -74,6 +74,8 @@ - [desc appendString: @", urgent"]; - if( _flags & kBLIP_NoReply ) - [desc appendString: @", noreply"]; -+ if( _flags & kBLIP_Meta ) -+ [desc appendString: @", META"]; - [desc appendString: @"]"]; - return desc; - } -@@ -103,6 +105,8 @@ - _flags &= ~flag; - } - -+- (BLIPMessageFlags) _flags {return _flags;} -+ - - (BOOL) compressed {return (_flags & kBLIP_Compressed) != 0;} - - (BOOL) urgent {return (_flags & kBLIP_Urgent) != 0;} - - (void) setCompressed: (BOOL)compressed {[self _setFlag: kBLIP_Compressed value: compressed];} -diff -r 70590cc555aa -r 16454d63d4c2 BLIP/BLIPReader.m ---- a/BLIP/BLIPReader.m Thu Jun 19 10:22:19 2008 -0700 -+++ b/BLIP/BLIPReader.m Mon Jun 23 14:02:31 2008 -0700 -@@ -93,7 +93,7 @@ - - - (BOOL) isBusy - { -- return _curBytesRead > 0; -+ return _curBytesRead > 0 || _pendingRequests.count > 0 || _pendingResponses.count > 0; - } - - -diff -r 70590cc555aa -r 16454d63d4c2 BLIP/BLIPRequest.m ---- a/BLIP/BLIPRequest.m Thu Jun 19 10:22:19 2008 -0700 -+++ b/BLIP/BLIPRequest.m Mon Jun 23 14:02:31 2008 -0700 -@@ -199,6 +199,8 @@ - setObj(&_mutableBody,nil); - - BLIPMutableProperties *errorProps = [self.properties mutableCopy]; -+ if( ! errorProps ) -+ errorProps = [[BLIPMutableProperties alloc] init]; - NSDictionary *userInfo = error.userInfo; - for( NSString *key in userInfo ) { - id value = $castIf(NSString,[userInfo objectForKey: key]); -@@ -227,8 +229,12 @@ - { - Assert(_connection,@"%@ has no connection to send over",self); - Assert(!_sent,@"%@ was already sent",self); -+ BLIPWriter *writer = (BLIPWriter*)_connection.writer; -+ Assert(writer,@"%@'s connection has no writer (already closed?)",self); - [self _encode]; -- return (self.sent = [(BLIPWriter*)_connection.writer sendMessage: self]); -+ BOOL sent = self.sent = [writer sendMessage: self]; -+ Assert(sent); -+ return sent; - } - - -diff -r 70590cc555aa -r 16454d63d4c2 BLIP/BLIPTest.m ---- a/BLIP/BLIPTest.m Thu Jun 19 10:22:19 2008 -0700 -+++ b/BLIP/BLIPTest.m Mon Jun 23 14:02:31 2008 -0700 -@@ -35,6 +35,7 @@ - #define kClientUsesSSLCert NO - #define kListenerRequiresSSL NO - #define kListenerRequiresClientCert NO -+#define kListenerCloseAfter 50 - - - static SecIdentityRef GetClientIdentity(void) { -@@ -100,36 +101,38 @@ - - - (void) sendAMessage - { -- if(_pending.count<100) { -- Log(@"** Sending another %i messages...", kNBatchedMessages); -- for( int i=0; i 12 ) -- q.urgent = YES; -- BLIPResponse *response = [q send]; -- Assert(response); -- Assert(q.number>0); -- Assert(response.number==q.number); -- [_pending setObject: $object(size) forKey: $object(q.number)]; -- response.onComplete = $target(self,responseArrived:); -+ if( _conn.status==kTCP_Open || _conn.status==kTCP_Opening ) { -+ if(_pending.count<100) { -+ Log(@"** Sending another %i messages...", kNBatchedMessages); -+ for( int i=0; i 12 ) -+ q.urgent = YES; -+ BLIPResponse *response = [q send]; -+ Assert(response); -+ Assert(q.number>0); -+ Assert(response.number==q.number); -+ [_pending setObject: $object(size) forKey: $object(q.number)]; -+ response.onComplete = $target(self,responseArrived:); -+ } -+ } else { -+ Warn(@"There are %u pending messages; waiting for the listener to catch up...",_pending.count); - } -- } else { -- Warn(@"There are %u pending messages; waiting for the listener to catch up...",_pending.count); -+ [self performSelector: @selector(sendAMessage) withObject: nil afterDelay: kSendInterval]; - } -- [self performSelector: @selector(sendAMessage) withObject: nil afterDelay: kSendInterval]; - } - - - (void) responseArrived: (BLIPResponse*)response -@@ -191,6 +194,13 @@ - Log(@"Now %u replies pending", _pending.count); - } - -+- (BOOL) connectionReceivedCloseRequest: (BLIPConnection*)connection -+{ -+ BOOL response = NO; -+ Log(@"***** %@ received a close request; returning %i",connection,response); -+ return response; -+} -+ - - @end - -@@ -217,6 +227,7 @@ - @interface BLIPTestListener : NSObject - { - BLIPListener *_listener; -+ int _nReceived; - } - - @end -@@ -277,6 +288,7 @@ - - (void) connectionDidOpen: (TCPConnection*)connection - { - Log(@"** %@ didOpen [SSL=%@]",connection,connection.actualSecurityLevel); -+ _nReceived = 0; - } - - (BOOL) connection: (TCPConnection*)connection authorizeSSLPeer: (SecCertificateRef)peerCert - { -@@ -312,6 +324,22 @@ - AssertEq([[request valueOfProperty: @"Size"] intValue], size); - - [request respondWithData: body contentType: request.contentType]; -+ -+ if( ++ _nReceived == kListenerCloseAfter ) { -+ Log(@"********** Closing BLIPTestListener after %i requests",_nReceived); -+ [connection close]; -+ } -+} -+ -+- (BOOL) connectionReceivedCloseRequest: (BLIPConnection*)connection; -+{ -+ Log(@"***** %@ received a close request",connection); -+ return YES; -+} -+ -+- (void) connection: (BLIPConnection*)connection closeRequestFailedWithError: (NSError*)error -+{ -+ Log(@"***** %@'s close request failed: %@",connection,error); - } - - -diff -r 70590cc555aa -r 16454d63d4c2 BLIP/BLIPWriter.m ---- a/BLIP/BLIPWriter.m Thu Jun 19 10:22:19 2008 -0700 -+++ b/BLIP/BLIPWriter.m Mon Jun 23 14:02:31 2008 -0700 -@@ -79,10 +79,6 @@ - - - (BOOL) sendMessage: (BLIPMessage*)message - { -- if( _shouldClose ) { -- Warn(@"%@: Attempt to send a message after the connection has started closing",self); -- return NO; -- } - Assert(!message.sent,@"message has already been sent"); - [self _queueMessage: message isNew: YES]; - return YES; -@@ -91,12 +87,14 @@ - - - (BOOL) sendRequest: (BLIPRequest*)q response: (BLIPResponse*)response - { -- if( !_shouldClose ) { -- [q _assignedNumber: ++_numRequestsSent]; -- if( response ) { -- [response _assignedNumber: _numRequestsSent]; -- [(BLIPReader*)self.reader _addPendingResponse: response]; -- } -+ if( _shouldClose ) { -+ Warn(@"%@: Attempt to send a request after the connection has started closing: %@",self,q); -+ return NO; -+ } -+ [q _assignedNumber: ++_numRequestsSent]; -+ if( response ) { -+ [response _assignedNumber: _numRequestsSent]; -+ [(BLIPReader*)self.reader _addPendingResponse: response]; - } - return [self sendMessage: q]; - } -diff -r 70590cc555aa -r 16454d63d4c2 BLIP/BLIP_Internal.h ---- a/BLIP/BLIP_Internal.h Thu Jun 19 10:22:19 2008 -0700 -+++ b/BLIP/BLIP_Internal.h Mon Jun 23 14:02:31 2008 -0700 -@@ -29,6 +29,7 @@ - kBLIP_Urgent = 0x0020, // please send sooner/faster - kBLIP_NoReply = 0x0040, // no RPY needed - kBLIP_MoreComing= 0x0080, // More frames coming (Applies only to individual frame) -+ kBLIP_Meta = 0x0100, // Special message type, handled internally (hello, bye, ...) - }; - typedef UInt16 BLIPMessageFlags; - -@@ -41,7 +42,10 @@ - UInt16 size; // total size of frame, _including_ this header - } BLIPFrameHeader; - --#define kBLIPFrameHeaderMagicNumber 0x9B34F205 -+#define kBLIPFrameHeaderMagicNumber 0x9B34F206 -+ -+#define kBLIPProfile_Hi @"Hi" // Used for Profile header in meta greeting message -+#define kBLIPProfile_Bye @"Bye" // Used for Profile header in meta close-request message - - - @interface BLIPConnection () -@@ -52,6 +56,7 @@ - - @interface BLIPMessage () - @property BOOL sent, propertiesAvailable, complete; -+- (BLIPMessageFlags) _flags; - - (void) _setFlag: (BLIPMessageFlags)flag value: (BOOL)value; - - (void) _encode; - @end