STKHTTPDataSource tidyup

This commit is contained in:
Thong Nguyen 2014-11-08 20:04:29 +00:00
parent ef7f42c97e
commit 162d964372
1 changed files with 59 additions and 54 deletions

View File

@ -164,6 +164,50 @@
return audioFileTypeHint; return audioFileTypeHint;
} }
-(NSDictionary*) parseIceHeader:(NSData*)headerData
{
NSMutableDictionary* retval = [[NSMutableDictionary alloc] init];
NSCharacterSet* characterSet = [NSCharacterSet characterSetWithCharactersInString:@"\r\n"];
NSString* fullString = [[NSString alloc] initWithData:headerData encoding:NSUTF8StringEncoding];
NSArray* strings = [fullString componentsSeparatedByCharactersInSet:characterSet];
httpHeaders = [NSMutableDictionary dictionary];
for (NSString* s in strings)
{
if (s.length == 0)
{
continue;
}
if ([s hasPrefix:@"ICY "])
{
NSArray* parts = [s componentsSeparatedByString:@" "];
if (parts.count >= 2)
{
self->httpStatusCode = [parts[1] intValue];
}
continue;
}
NSRange range = [s rangeOfString:@":"];
if (range.location == NSNotFound)
{
continue;
}
NSString* key = [s substringWithRange: (NSRange){.location = 0, .length = range.location}];
NSString* value = [s substringFromIndex:range.location + 1];
[retval setValue:value forKey:key];
}
return retval;
}
-(BOOL) parseHttpHeader -(BOOL) parseHttpHeader
{ {
if (!httpHeaderNotAvailable) if (!httpHeaderNotAvailable)
@ -197,7 +241,6 @@
if (!self->iceHeaderSearchComplete) if (!self->iceHeaderSearchComplete)
{ {
UInt8 byte; UInt8 byte;
UInt8 bytes[4];
UInt8 terminal1[] = { '\n', '\n' }; UInt8 terminal1[] = { '\n', '\n' };
UInt8 terminal2[] = { '\r', '\n', '\r', '\n' }; UInt8 terminal2[] = { '\r', '\n', '\r', '\n' };
@ -224,9 +267,7 @@
if (iceHeaderData.length >= sizeof(terminal1)) if (iceHeaderData.length >= sizeof(terminal1))
{ {
[iceHeaderData getBytes:&bytes[0] range:(NSRange){.location = iceHeaderData.length - sizeof(terminal1), .length = sizeof(terminal1)}]; if (memcmp(&terminal1[0], [self->iceHeaderData bytes] + iceHeaderData.length - sizeof(terminal1), sizeof(terminal1)) == 0)
if (memcmp(&terminal1[0], &bytes[0], sizeof(terminal1)) == 0)
{ {
self->iceHeaderAvailable = YES; self->iceHeaderAvailable = YES;
self->iceHeaderSearchComplete = YES; self->iceHeaderSearchComplete = YES;
@ -237,9 +278,7 @@
if (iceHeaderData.length >= sizeof(terminal2)) if (iceHeaderData.length >= sizeof(terminal2))
{ {
[iceHeaderData getBytes:&bytes[0] range:(NSRange){.location = iceHeaderData.length - sizeof(terminal2), .length = sizeof(terminal2)}]; if (memcmp(&terminal2[0], [self->iceHeaderData bytes] + iceHeaderData.length - sizeof(terminal2), sizeof(terminal2)) == 0)
if (memcmp(&terminal2[0], &bytes[0], sizeof(terminal2)) == 0)
{ {
self->iceHeaderAvailable = YES; self->iceHeaderAvailable = YES;
self->iceHeaderSearchComplete = YES; self->iceHeaderSearchComplete = YES;
@ -248,11 +287,9 @@
} }
} }
if (iceHeaderData.length >=4) if (iceHeaderData.length >= 4)
{ {
[iceHeaderData getBytes:&bytes[0] length:4]; if (memcmp([self->iceHeaderData bytes], "ICY ", 4) != 0 && memcmp([self->iceHeaderData bytes], "HTTP", 4) != 0)
if (memcmp(bytes, "ICY", 3) != 0 && memcmp(bytes, "HTTP", 4) != 0)
{ {
self->iceHeaderAvailable = NO; self->iceHeaderAvailable = NO;
self->iceHeaderSearchComplete = YES; self->iceHeaderSearchComplete = YES;
@ -269,42 +306,9 @@
} }
} }
NSCharacterSet* characterSet = [NSCharacterSet characterSetWithCharactersInString:@"\r\n"]; httpHeaders = [self parseIceHeader:self->iceHeaderData];
NSString* fullString = [[NSString alloc] initWithData:self->iceHeaderData encoding:NSUTF8StringEncoding];
NSArray* strings = [fullString componentsSeparatedByCharactersInSet:characterSet]; self->iceHeaderData = nil;
httpHeaders = [NSMutableDictionary dictionary];
for (NSString* s in strings)
{
if (s.length == 0)
{
continue;
}
if ([s hasPrefix:@"ICY"])
{
NSArray* ss = [s componentsSeparatedByString:@" "];
if (ss.count >= 2)
{
self->httpStatusCode = [ss[1] intValue];
}
}
NSRange range = [s rangeOfString:@":"];
if (range.location == NSNotFound)
{
continue;
}
NSString* key = [s substringWithRange: (NSRange){.location = 0, .length = range.location}];
NSString* value = [s substringFromIndex:range.location + 1];
[httpHeaders setValue:value forKey:key];
}
} }
if (([httpHeaders objectForKey:@"Accepts-Ranges"] ?: [httpHeaders objectForKey:@"accepts-ranges"]) != nil) if (([httpHeaders objectForKey:@"Accepts-Ranges"] ?: [httpHeaders objectForKey:@"accepts-ranges"]) != nil)
@ -322,7 +326,6 @@
} }
NSString* contentType = [httpHeaders objectForKey:@"Content-Type"] ?: [httpHeaders objectForKey:@"content-type"] ; NSString* contentType = [httpHeaders objectForKey:@"Content-Type"] ?: [httpHeaders objectForKey:@"content-type"] ;
AudioFileTypeID typeIdFromMimeType = [STKHTTPDataSource audioFileTypeHintFromMimeType:contentType]; AudioFileTypeID typeIdFromMimeType = [STKHTTPDataSource audioFileTypeHintFromMimeType:contentType];
if (typeIdFromMimeType != 0) if (typeIdFromMimeType != 0)
@ -436,6 +439,11 @@
} }
-(int) readIntoBuffer:(UInt8*)buffer withSize:(int)size -(int) readIntoBuffer:(UInt8*)buffer withSize:(int)size
{
return [self privateReadIntoBuffer:buffer withSize:size];
}
-(int) privateReadIntoBuffer:(UInt8*)buffer withSize:(int)size
{ {
if (size == 0) if (size == 0)
{ {
@ -458,8 +466,7 @@
return count; return count;
} }
int read = [super readIntoBuffer:buffer withSize:size];
int read = (int)CFReadStreamRead(stream, buffer, size);
if (read < 0) if (read < 0)
{ {
@ -511,11 +518,12 @@
for (NSString* key in self->requestHeaders) for (NSString* key in self->requestHeaders)
{ {
NSString* value = [self->requestHeaders objectForKey:key]; NSString* value = [self->requestHeaders objectForKey:key];
CFHTTPMessageSetHeaderFieldValue(message, (__bridge CFStringRef)key, (__bridge CFStringRef)value); CFHTTPMessageSetHeaderFieldValue(message, (__bridge CFStringRef)key, (__bridge CFStringRef)value);
} }
CFHTTPMessageSetHeaderFieldValue(message, (__bridge CFStringRef)@"Accept", (__bridge CFStringRef)@"*/*"); CFHTTPMessageSetHeaderFieldValue(message, CFSTR("Accept"), CFSTR("*/*"));
CFHTTPMessageSetHeaderFieldValue(message, (__bridge CFStringRef)@"Ice-MetaData", (__bridge CFStringRef)@"0"); CFHTTPMessageSetHeaderFieldValue(message, CFSTR("Ice-MetaData"), CFSTR("0"));
stream = CFReadStreamCreateForHTTPRequest(NULL, message); stream = CFReadStreamCreateForHTTPRequest(NULL, message);
@ -540,13 +548,11 @@
} }
// Proxy support // Proxy support
CFDictionaryRef proxySettings = CFNetworkCopySystemProxySettings(); CFDictionaryRef proxySettings = CFNetworkCopySystemProxySettings();
CFReadStreamSetProperty(stream, kCFStreamPropertyHTTPProxy, proxySettings); CFReadStreamSetProperty(stream, kCFStreamPropertyHTTPProxy, proxySettings);
CFRelease(proxySettings); CFRelease(proxySettings);
// SSL support // SSL support
if ([self->currentUrl.scheme caseInsensitiveCompare:@"https"] == NSOrderedSame) if ([self->currentUrl.scheme caseInsensitiveCompare:@"https"] == NSOrderedSame)
{ {
NSDictionary* sslSettings = [NSDictionary dictionaryWithObjectsAndKeys: NSDictionary* sslSettings = [NSDictionary dictionaryWithObjectsAndKeys:
@ -563,7 +569,6 @@
self->httpStatusCode = 0; self->httpStatusCode = 0;
// Open // Open
if (!CFReadStreamOpen(stream)) if (!CFReadStreamOpen(stream))
{ {
CFRelease(stream); CFRelease(stream);