HTTPAuthenticationRequest.m.svn-base
上传用户:kc0325
上传日期:2020-06-20
资源大小:204k
文件大小:6k
源码类别:

iPhone

开发平台:

Objective-C

  1. #import "HTTPAuthenticationRequest.h"
  2. @interface HTTPAuthenticationRequest (PrivateAPI)
  3. - (NSString *)quotedSubHeaderFieldValue:(NSString *)param fromHeaderFieldValue:(NSString *)header;
  4. - (NSString *)nonquotedSubHeaderFieldValue:(NSString *)param fromHeaderFieldValue:(NSString *)header;
  5. @end
  6. @implementation HTTPAuthenticationRequest
  7. - (id)initWithRequest:(CFHTTPMessageRef)request
  8. {
  9. if(self = [super init])
  10. {
  11. NSString *authInfo = (NSString *)CFHTTPMessageCopyHeaderFieldValue(request, CFSTR("Authorization"));
  12. isBasic = NO;
  13. if([authInfo length] >= 6)
  14. {
  15. isBasic = [[authInfo substringToIndex:6] caseInsensitiveCompare:@"Basic "] == NSOrderedSame;
  16. }
  17. isDigest = NO;
  18. if([authInfo length] >= 7)
  19. {
  20. isDigest = [[authInfo substringToIndex:7] caseInsensitiveCompare:@"Digest "] == NSOrderedSame;
  21. }
  22. if(isBasic)
  23. {
  24. NSMutableString *temp = [[[authInfo substringFromIndex:6] mutableCopy] autorelease];
  25. CFStringTrimWhitespace((CFMutableStringRef)temp);
  26. base64Credentials = [temp copy];
  27. }
  28. if(isDigest)
  29. {
  30. username = [[self quotedSubHeaderFieldValue:@"username" fromHeaderFieldValue:authInfo] retain];
  31. realm    = [[self quotedSubHeaderFieldValue:@"realm" fromHeaderFieldValue:authInfo] retain];
  32. nonce    = [[self quotedSubHeaderFieldValue:@"nonce" fromHeaderFieldValue:authInfo] retain];
  33. uri      = [[self quotedSubHeaderFieldValue:@"uri" fromHeaderFieldValue:authInfo] retain];
  34. // It appears from RFC 2617 that the qop is to be given unquoted
  35. // Tests show that Firefox performs this way, but Safari does not
  36. // Thus we'll attempt to retrieve the value as nonquoted, but we'll verify it doesn't start with a quote
  37. qop      = [self nonquotedSubHeaderFieldValue:@"qop" fromHeaderFieldValue:authInfo];
  38. if(qop && ([qop characterAtIndex:0] == '"'))
  39. {
  40. qop  = [self quotedSubHeaderFieldValue:@"qop" fromHeaderFieldValue:authInfo];
  41. }
  42. [qop retain];
  43. nc       = [[self nonquotedSubHeaderFieldValue:@"nc" fromHeaderFieldValue:authInfo] retain];
  44. cnonce   = [[self quotedSubHeaderFieldValue:@"cnonce" fromHeaderFieldValue:authInfo] retain];
  45. response = [[self quotedSubHeaderFieldValue:@"response" fromHeaderFieldValue:authInfo] retain];
  46. }
  47. [authInfo release];
  48. }
  49. return self;
  50. }
  51. - (void)dealloc
  52. {
  53. [base64Credentials release];
  54. [username release];
  55. [realm release];
  56. [nonce release];
  57. [uri release];
  58. [qop release];
  59. [nc release];
  60. [cnonce release];
  61. [response release];
  62. [super dealloc];
  63. }
  64. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  65. #pragma mark Accessors:
  66. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  67. - (BOOL)isBasic {
  68. return isBasic;
  69. }
  70. - (BOOL)isDigest {
  71. return isDigest;
  72. }
  73. - (NSString *)base64Credentials {
  74. return base64Credentials;
  75. }
  76. - (NSString *)username {
  77. return username;
  78. }
  79. - (NSString *)realm {
  80. return realm;
  81. }
  82. - (NSString *)nonce {
  83. return nonce;
  84. }
  85. - (NSString *)uri {
  86. return uri;
  87. }
  88. - (NSString *)qop {
  89. return qop;
  90. }
  91. - (NSString *)nc {
  92. return nc;
  93. }
  94. - (NSString *)cnonce {
  95. return cnonce;
  96. }
  97. - (NSString *)response {
  98. return response;
  99. }
  100. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  101. #pragma mark Private API:
  102. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  103. /**
  104.  * Retrieves a "Sub Header Field Value" from a given header field value.
  105.  * The sub header field is expected to be quoted.
  106.  * 
  107.  * In the following header field:
  108.  * Authorization: Digest username="Mufasa", qop=auth, response="6629fae4939"
  109.  * The sub header field titled 'username' is quoted, and this method would return the value @"Mufasa".
  110. **/
  111. - (NSString *)quotedSubHeaderFieldValue:(NSString *)param fromHeaderFieldValue:(NSString *)header
  112. {
  113. NSRange startRange = [header rangeOfString:[NSString stringWithFormat:@"%@="", param]];
  114. if(startRange.location == NSNotFound)
  115. {
  116. // The param was not found anywhere in the header
  117. return nil;
  118. }
  119. int postStartRangeLocation = startRange.location + startRange.length;
  120. int postStartRangeLength = [header length] - postStartRangeLocation;
  121. NSRange postStartRange = NSMakeRange(postStartRangeLocation, postStartRangeLength);
  122. NSRange endRange = [header rangeOfString:@""" options:0 range:postStartRange];
  123. if(endRange.location == NSNotFound)
  124. {
  125. // The ending double-quote was not found anywhere in the header
  126. return nil;
  127. }
  128. NSRange subHeaderRange = NSMakeRange(postStartRangeLocation, endRange.location - postStartRangeLocation);
  129. return [header substringWithRange:subHeaderRange];
  130. }
  131. /**
  132.  * Retrieves a "Sub Header Field Value" from a given header field value.
  133.  * The sub header field is expected to not be quoted.
  134.  * 
  135.  * In the following header field:
  136.  * Authorization: Digest username="Mufasa", qop=auth, response="6629fae4939"
  137.  * The sub header field titled 'qop' is nonquoted, and this method would return the value @"auth".
  138. **/
  139. - (NSString *)nonquotedSubHeaderFieldValue:(NSString *)param fromHeaderFieldValue:(NSString *)header
  140. {
  141. NSRange startRange = [header rangeOfString:[NSString stringWithFormat:@"%@=", param]];
  142. if(startRange.location == NSNotFound)
  143. {
  144. // The param was not found anywhere in the header
  145. return nil;
  146. }
  147. int postStartRangeLocation = startRange.location + startRange.length;
  148. int postStartRangeLength = [header length] - postStartRangeLocation;
  149. NSRange postStartRange = NSMakeRange(postStartRangeLocation, postStartRangeLength);
  150. NSRange endRange = [header rangeOfString:@"," options:0 range:postStartRange];
  151. if(endRange.location == NSNotFound)
  152. {
  153. // The ending comma was not found anywhere in the header
  154. // However, if the nonquoted param is at the end of the string, there would be no comma
  155. // This is only possible if there are no spaces anywhere
  156. NSRange endRange2 = [header rangeOfString:@" " options:0 range:postStartRange];
  157. if(endRange2.location != NSNotFound)
  158. {
  159. return nil;
  160. }
  161. else
  162. {
  163. return [header substringWithRange:postStartRange];
  164. }
  165. }
  166. else
  167. {
  168. NSRange subHeaderRange = NSMakeRange(postStartRangeLocation, endRange.location - postStartRangeLocation);
  169. return [header substringWithRange:subHeaderRange];
  170. }
  171. }
  172. @end