improve event handling when there is data in the tls buffers

This commit is contained in:
Richard Frith-Macdonald 2022-11-15 15:28:31 +00:00
parent 483777bfa9
commit 326da37967
2 changed files with 52 additions and 2 deletions

View file

@ -287,6 +287,7 @@ GSPrivateSockaddrSetup(NSString *machine, uint16_t port,
- (void) bye; /* Close down the handled session. */ - (void) bye; /* Close down the handled session. */
- (BOOL) handshake; /* A handshake/hello is in progress. */ - (BOOL) handshake; /* A handshake/hello is in progress. */
- (void) hello; /* Start up the session handshake. */ - (void) hello; /* Start up the session handshake. */
- (BOOL) readable; /* is there buffered data to read? */
- (NSInteger) read: (uint8_t *)buffer maxLength: (NSUInteger)len; - (NSInteger) read: (uint8_t *)buffer maxLength: (NSUInteger)len;
- (void) remove: (NSStream*)stream; /* Stream no longer available */ - (void) remove: (NSStream*)stream; /* Stream no longer available */
- (void) stream: (NSStream*)stream handleEvent: (NSStreamEvent)event; - (void) stream: (NSStream*)stream handleEvent: (NSStreamEvent)event;
@ -340,6 +341,11 @@ GSPrivateSockaddrSetup(NSString *machine, uint16_t port,
{ {
return ostream; return ostream;
} }
- (BOOL) readable
{
return NO;
}
- (NSInteger) read: (uint8_t *)buffer maxLength: (NSUInteger)len - (NSInteger) read: (uint8_t *)buffer maxLength: (NSUInteger)len
{ {
@ -691,6 +697,15 @@ static NSArray *keys = nil;
return ostream; return ostream;
} }
- (BOOL) readable
{
if (NO == active || YES == handshake)
{
return NO;
}
return ([session pending] > 0) ? YES : NO;
}
- (NSInteger) read: (uint8_t *)buffer maxLength: (NSUInteger)len - (NSInteger) read: (uint8_t *)buffer maxLength: (NSUInteger)len
{ {
return [session read: buffer length: len]; return [session read: buffer length: len];
@ -2214,13 +2229,23 @@ setNonBlocking(SOCKET fd)
#endif #endif
} }
#if defined(_WIN32)
- (BOOL) runLoopShouldBlock: (BOOL*)trigger - (BOOL) runLoopShouldBlock: (BOOL*)trigger
{ {
/* If there is a handler in place which has data buffered for reading
* the run loop should trigger immediately so we read it.
*/
if ([_handler readable])
{
*trigger = YES;
return NO;
}
#if defined(_WIN32)
*trigger = YES; *trigger = YES;
return YES; return YES;
} #else
return [super runLoopShouldBlock: trigger];
#endif #endif
}
@end @end

View file

@ -1018,6 +1018,31 @@ GSTLSHandlePush(gnutls_transport_ptr_t handle, const void *buffer, size_t len)
return [super read: buf length: len]; return [super read: buf length: len];
} }
- (void) watchReadDescriptorForModes: (NSArray*)modes
{
if (descriptor < 0)
{
return;
}
if ([session pending] > 0)
{
NSRunLoop *l = [NSRunLoop currentRunLoop];
/* The underlying TLS buffers already have data so we signal
* an event as soon as possible.
*/
[l performSelector: @selector(receivedEventRead)
target: self
argument: nil
order: 0
modes: modes];
}
else
{
[super watchReadDescriptorForModes: modes];
}
}
- (BOOL) sslAccept - (BOOL) sslAccept
{ {
/* If a server session is over five minutes old, destroy it so that /* If a server session is over five minutes old, destroy it so that