Skip to content

Instantly share code, notes, and snippets.

@kylef
Created August 8, 2013 11:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kylef/6183720 to your computer and use it in GitHub Desktop.
Save kylef/6183720 to your computer and use it in GitHub Desktop.
/*
HTTP Link header parser (http://tools.ietf.org/html/rfc5988)
License: BSD
NSDictionary *links = KFParseRelativeLinks(@"<http://github.com?page=2>; rel=next");
NSURL *nextURL = links[@"next"];
*/
NSDictionary *KFParseRelativeLinks(NSString *header) {
NSMutableDictionary *links = [[NSMutableDictionary alloc] init];
for (NSString *source in [header componentsSeparatedByString:@","]) {
NSRange range = [source rangeOfString:@";"];
if (range.location == NSNotFound) {
continue;
}
NSString *urlString = [source substringToIndex:range.location];
NSCharacterSet *urlCharacterSet = [NSCharacterSet characterSetWithCharactersInString:@"<> "];
urlString = [urlString stringByTrimmingCharactersInSet:urlCharacterSet];
NSURL *URL = [[NSURL alloc] initWithString:urlString];
if (URL == nil) {
continue;
}
NSString *params = [source substringFromIndex:range.location + 1];
NSMutableDictionary *parameters = [[NSMutableDictionary alloc] init];
for (NSString *parameter in [params componentsSeparatedByString:@";"]) {
NSRange range = [parameter rangeOfString:@"="];
if (range.location == NSNotFound) {
continue;
}
NSString *key = [[parameter substringToIndex:range.location] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
NSString *value = [[parameter substringFromIndex:range.location + 1] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"\"' "]];
parameters[key] = value;
}
NSString *rel = parameters[@"rel"];
if (rel) {
links[rel] = URL;
}
}
return [links copy];
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment