Bugfix and improved logging

This commit is contained in:
Richard Frith-Macdonald 2019-08-12 16:37:38 +01:00
parent d497c7b3ea
commit 9a055f93ad
8 changed files with 316 additions and 81 deletions

View file

@ -434,6 +434,8 @@ GSTLSPush(gnutls_transport_ptr_t handle, const void *buffer, size_t len)
#endif
}
NSDebugFLLog(@"NSStream", @"GSTLSPush write %p of %u on %u",
[tls ostream], (unsigned)result, (unsigned)len);
return result;
}
@ -675,7 +677,7 @@ static NSArray *keys = nil;
- (void) stream: (NSStream*)stream handleEvent: (NSStreamEvent)event
{
NSDebugMLLog(@"NSStream",
@"GSTLSHandler got %"PRIdPTR" on %p", event, stream);
@"GSTLSHandler got %@ on %p", [stream stringFromEvent: event], stream);
if (handshake == YES)
{
@ -742,7 +744,26 @@ static NSArray *keys = nil;
- (NSInteger) write: (const uint8_t *)buffer maxLength: (NSUInteger)len
{
return [session write: buffer length: len];
NSInteger offset = 0;
/* The low level code to perform the TLS session write may return a
* partial write even though the output stream is still writable.
* That means we wouldn't get an event to say there's more space and
* our overall write (for a large amount of data) could hang.
* To avoid that, we try writing more data as long as the stream
* still has space available.
*/
while ([ostream hasSpaceAvailable] && offset < len)
{
NSInteger written;
written = [session write: buffer + offset length: len - offset];
if (written > 0)
{
offset += written;
}
}
return offset;
}
@end

View file

@ -90,6 +90,9 @@
*/
@interface GSStream : NSStream
IVARS
/** Return description of current event mask.
*/
- (NSString*) _stringFromEvents;
@end
@interface GSAbstractServerStream : GSServerStream
@ -154,6 +157,14 @@ IVARS
*/
- (void) _unschedule;
/** Return name of event
*/
- (NSString*) stringFromEvent: (NSStreamEvent)e;
/** Return name of status
*/
- (NSString*) stringFromStatus: (NSStreamStatus)s;
@end
@interface GSInputStream : NSInputStream

View file

@ -110,20 +110,32 @@ static RunLoopEventType typeForStream(NSStream *aStream)
@implementation NSRunLoop (NSStream)
- (void) addStream: (NSStream*)aStream mode: (NSString*)mode
{
[self addEvent: [aStream _loopID]
type: typeForStream(aStream)
RunLoopEventType type = typeForStream(aStream);
void *event = [aStream _loopID];
NSDebugMLLog(@"NSStream",
@"-addStream:mode: %@ (desc %d,%d) to %@ mode %@",
aStream, (int)(intptr_t)event, type, self, mode);
[self addEvent: event
type: type
watcher: (id<RunLoopEvents>)aStream
forMode: mode];
}
- (void) removeStream: (NSStream*)aStream mode: (NSString*)mode
{
RunLoopEventType type = typeForStream(aStream);
void *event = [aStream _loopID];
NSDebugMLLog(@"NSStream",
@"-removeStream:mode: %@ (desc %d,%d) from %@ mode %@",
aStream, (int)(intptr_t)event, type, self, mode);
/* We may have added the stream more than once (eg if the stream -open
* method was called more than once, so we need to remove all event
* registrations.
*/
[self removeEvent: [aStream _loopID]
type: typeForStream(aStream)
[self removeEvent: event
type: type
forMode: mode
all: YES];
}
@ -215,6 +227,7 @@ static RunLoopEventType typeForStream(NSStream *aStream)
extra: (void*)extra
forMode: (NSString*)mode
{
// NSDebugMLLog(@"NSStream", @"receivedEvent for %@ - %d", self, type);
[self _dispatch];
}
@ -321,6 +334,23 @@ static RunLoopEventType typeForStream(NSStream *aStream)
return _currentStatus;
}
- (NSString*) _stringFromEvents
{
NSMutableString *s = [NSMutableString stringWithCapacity: 100];
if (_events & NSStreamEventOpenCompleted)
[s appendString: @"|NSStreamEventOpenCompleted"];
if (_events & NSStreamEventHasBytesAvailable)
[s appendString: @"|NSStreamEventHasBytesAvailable"];
if (_events & NSStreamEventHasSpaceAvailable)
[s appendString: @"|NSStreamEventHasSpaceAvailable"];
if (_events & NSStreamEventErrorOccurred)
[s appendString: @"|NSStreamEventErrorOccurred"];
if (_events & NSStreamEventEndEncountered)
[s appendString: @"|NSStreamEventEndEncountered"];
return s;
}
@end
@ -379,6 +409,46 @@ static RunLoopEventType typeForStream(NSStream *aStream)
{
}
- (NSString*) stringFromEvent: (NSStreamEvent)e
{
switch (e)
{
case NSStreamEventNone:
return @"NSStreamEventNone";
case NSStreamEventOpenCompleted:
return @"NSStreamEventOpenCompleted";
case NSStreamEventHasBytesAvailable:
return @"NSStreamEventHasBytesAvailable";
case NSStreamEventHasSpaceAvailable:
return @"NSStreamEventHasSpaceAvailable";
case NSStreamEventErrorOccurred:
return @"NSStreamEventErrorOccurred";
case NSStreamEventEndEncountered:
return @"NSStreamEventEndEncountered";
default:
return [NSString stringWithFormat:
@"NSStreamEventValue%ld", (long)e];
}
}
- (NSString*) stringFromStatus: (NSStreamStatus)s
{
switch (s)
{
case NSStreamStatusNotOpen: return @"NSStreamStatusNotOpen";
case NSStreamStatusOpening: return @"NSStreamStatusOpening";
case NSStreamStatusOpen: return @"NSStreamStatusOpen";
case NSStreamStatusReading: return @"NSStreamStatusReading";
case NSStreamStatusWriting: return @"NSStreamStatusWriting";
case NSStreamStatusAtEnd: return @"NSStreamStatusAtEnd";
case NSStreamStatusClosed: return @"NSStreamStatusClosed";
case NSStreamStatusError: return @"NSStreamStatusError";
default:
return [NSString stringWithFormat:
@"NSStreamStatusValue%ld", (long)s];
}
}
@end
@implementation GSStream (Private)

View file

@ -1733,12 +1733,12 @@ static NSURLProtocol *placeholder = nil;
}
if (sent == YES)
{
if (_debug)
{
NSLog(@"%@ request sent", self);
}
if (_shouldClose == YES)
{
if (_debug)
{
NSLog(@"%@ request sent ... closing", self);
}
[this->output setDelegate: nil];
[this->output removeFromRunLoop:
[NSRunLoop currentRunLoop]
@ -1746,6 +1746,10 @@ static NSURLProtocol *placeholder = nil;
[this->output close];
DESTROY(this->output);
}
else if (_debug)
{
NSLog(@"%@ request sent", self);
}
}
return; // done
}