Ben Copsey

Make user agent string generation work on Mac OS X

Added test for user agent
@@ -397,6 +397,12 @@ extern NSString* const NetworkRequestErrorDomain; @@ -397,6 +397,12 @@ extern NSString* const NetworkRequestErrorDomain;
397 + (int)compressDataFromFile:(NSString *)sourcePath toFile:(NSString *)destinationPath; 397 + (int)compressDataFromFile:(NSString *)sourcePath toFile:(NSString *)destinationPath;
398 + (int)compressDataFromSource:(FILE *)source toDestination:(FILE *)dest; 398 + (int)compressDataFromSource:(FILE *)source toDestination:(FILE *)dest;
399 399
  400 +#pragma mark get user agent
  401 +
  402 +// Will be used as a user agent if requests do not specify a custom user agent
  403 +// Is only used when you have specified a Bundle Display Name (CFDisplayBundleName) or Bundle Name (CFBundleName) in your plist
  404 ++ (NSString *)defaultUserAgentString;
  405 +
400 @property (retain) NSString *username; 406 @property (retain) NSString *username;
401 @property (retain) NSString *password; 407 @property (retain) NSString *password;
402 @property (retain) NSString *domain; 408 @property (retain) NSString *domain;
@@ -389,25 +389,14 @@ static NSError *ASITooMuchRedirectionError; @@ -389,25 +389,14 @@ static NSError *ASITooMuchRedirectionError;
389 } 389 }
390 } 390 }
391 391
392 - // Set a logical user agent (on iPhones, for now) 392 + // Build and set the user agent string if the request does not already have a custom user agent specified
393 -#if TARGET_OS_IPHONE 393 + if (![[self requestHeaders] objectForKey:@"User-Agent"]) {
394 - if ([[self requestHeaders] objectForKey:@"User-Agent"] == nil) { 394 + NSString *userAgentString = [ASIHTTPRequest defaultUserAgentString];
395 - UIDevice *device = [UIDevice currentDevice]; 395 + if (userAgentString) {
396 - NSBundle *bundle = [NSBundle mainBundle]; 396 + [self addRequestHeader:@"User-Agent" value:userAgentString];
397 - NSLocale *locale = [NSLocale currentLocale]; 397 + }
398 -  
399 - NSString *userAgent = [NSString stringWithFormat:@"%@ %@ (%@; %@ %@; %@)",  
400 - [bundle objectForInfoDictionaryKey:@"CFBundleDisplayName"],  
401 - [bundle objectForInfoDictionaryKey:@"CFBundleVersion"],  
402 - [device model],  
403 - [device systemName],  
404 - [device systemVersion],  
405 - [locale localeIdentifier]  
406 - ];  
407 -  
408 - [self addRequestHeader:@"User-Agent" value:userAgent];  
409 } 398 }
410 -#endif 399 +
411 400
412 // Accept a compressed response 401 // Accept a compressed response
413 if ([self allowCompressedResponse]) { 402 if ([self allowCompressedResponse]) {
@@ -1869,6 +1858,53 @@ static NSError *ASITooMuchRedirectionError; @@ -1869,6 +1858,53 @@ static NSError *ASITooMuchRedirectionError;
1869 return Z_OK; 1858 return Z_OK;
1870 } 1859 }
1871 1860
  1861 +#pragma mark get user agent
  1862 +
  1863 ++ (NSString *)defaultUserAgentString
  1864 +{
  1865 + NSBundle *bundle = [NSBundle mainBundle];
  1866 +
  1867 + // Attempt to find a name for this application
  1868 + NSString *appName = [bundle objectForInfoDictionaryKey:@"CFBundleDisplayName"];
  1869 + if (!appName) {
  1870 + appName = [bundle objectForInfoDictionaryKey:@"CFBundleName"];
  1871 + }
  1872 + // If we couldn't find one, we'll give up (and ASIHTTPRequest will use the standard CFNetwork user agent)
  1873 + if (!appName) {
  1874 + return nil;
  1875 + }
  1876 + NSString *appVersion = [bundle objectForInfoDictionaryKey:@"CFBundleVersion"];
  1877 + NSString *deviceName;;
  1878 + NSString *OSName;
  1879 + NSString *OSVersion;
  1880 +
  1881 + NSString *locale = [[NSLocale currentLocale] localeIdentifier];
  1882 +
  1883 +#if TARGET_OS_IPHONE
  1884 + UIDevice *device = [UIDevice currentDevice];
  1885 + deviceName = [device model];
  1886 + OSName = [device systemName];
  1887 + OSVersion = [device systemVersion];
  1888 +
  1889 +#else
  1890 + deviceName = @"Macintosh";
  1891 + OSName = @"Mac OS X";
  1892 +
  1893 + // From http://www.cocoadev.com/index.pl?DeterminingOSVersion
  1894 + // We won't bother to check for systems prior to 10.4, since ASIHTTPRequest only works on 10.5+
  1895 + OSErr err;
  1896 + SInt32 versionMajor, versionMinor, versionBugFix;
  1897 + if ((err = Gestalt(gestaltSystemVersionMajor, &versionMajor)) != noErr) return nil;
  1898 + if ((err = Gestalt(gestaltSystemVersionMinor, &versionMinor)) != noErr) return nil;
  1899 + if ((err = Gestalt(gestaltSystemVersionBugFix, &versionBugFix)) != noErr) return nil;
  1900 + OSVersion = [NSString stringWithFormat:@"%u.%u.%u", versionMajor, versionMinor, versionBugFix];
  1901 +
  1902 +#endif
  1903 + // Takes the form "My Application 1.0 (Macintosh; Mac OS X 10.5.7; en_GB)"
  1904 + return [NSString stringWithFormat:@"%@ %@ (%@; %@ %@; %@)", appName, appVersion, deviceName, OSName, OSVersion, locale];
  1905 +}
  1906 +
  1907 +
1872 1908
1873 @synthesize username; 1909 @synthesize username;
1874 @synthesize password; 1910 @synthesize password;
@@ -20,6 +20,7 @@ @@ -20,6 +20,7 @@
20 - (void)testTimeOut; 20 - (void)testTimeOut;
21 - (void)testRequestMethod; 21 - (void)testRequestMethod;
22 - (void)testHTTPVersion; 22 - (void)testHTTPVersion;
  23 +- (void)testUserAgent;
23 - (void)testUploadContentLength; 24 - (void)testUploadContentLength;
24 - (void)testDownloadContentLength; 25 - (void)testDownloadContentLength;
25 - (void)testFileDownload; 26 - (void)testFileDownload;
@@ -132,6 +132,27 @@ @@ -132,6 +132,27 @@
132 GHAssertTrue(success,@"Wrong HTTP version used"); 132 GHAssertTrue(success,@"Wrong HTTP version used");
133 } 133 }
134 134
  135 +- (void)testUserAgent
  136 +{
  137 + // defaultUserAgentString will be nil if we haven't set a Bundle Name or Bundle Display Name
  138 + if ([ASIHTTPRequest defaultUserAgentString]) {
  139 +
  140 + // Returns the user agent it received in the response body
  141 + ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:@"http://allseeing-i.com/ASIHTTPRequest/tests/user-agent"]];
  142 + [request start];
  143 + BOOL success = [[request responseString] isEqualToString:[ASIHTTPRequest defaultUserAgentString]];
  144 + GHAssertTrue(success,@"Failed to set the correct user agent");
  145 + }
  146 +
  147 + // Now test specifying a custom user agent
  148 + ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:@"http://allseeing-i.com/ASIHTTPRequest/tests/user-agent"]];
  149 + [request addRequestHeader:@"User-Agent" value:@"Ferdinand Fuzzworth's Magic Tent of Mystery"];
  150 + [request start];
  151 + BOOL success = [[request responseString] isEqualToString:@"Ferdinand Fuzzworth's Magic Tent of Mystery"];
  152 + GHAssertTrue(success,@"Failed to set the correct user agent");
  153 +
  154 +}
  155 +
135 - (void)testAutomaticRedirection 156 - (void)testAutomaticRedirection
136 { 157 {
137 ASIHTTPRequest *request; 158 ASIHTTPRequest *request;
@@ -24,5 +24,7 @@ @@ -24,5 +24,7 @@
24 <string>MainMenu</string> 24 <string>MainMenu</string>
25 <key>NSPrincipalClass</key> 25 <key>NSPrincipalClass</key>
26 <string>NSApplication</string> 26 <string>NSApplication</string>
  27 + <key>CFBundleDisplayName</key>
  28 + <string>ASIHTTPRequest Demo</string>
27 </dict> 29 </dict>
28 </plist> 30 </plist>
@@ -24,5 +24,7 @@ @@ -24,5 +24,7 @@
24 <string>MainMenu</string> 24 <string>MainMenu</string>
25 <key>NSPrincipalClass</key> 25 <key>NSPrincipalClass</key>
26 <string>NSApplication</string> 26 <string>NSApplication</string>
  27 + <key>CFBundleDisplayName</key>
  28 + <string>ASIHTTPRequest Unit Tests</string>
27 </dict> 29 </dict>
28 </plist> 30 </plist>
@@ -9,7 +9,7 @@ @@ -9,7 +9,7 @@
9 <key>CFBundleIconFile</key> 9 <key>CFBundleIconFile</key>
10 <string>iphone-icon.png</string> 10 <string>iphone-icon.png</string>
11 <key>CFBundleIdentifier</key> 11 <key>CFBundleIdentifier</key>
12 - <string>com.yourcompany.etc</string> 12 + <string>com.yourcompany.${PRODUCT_NAME:identifier}</string>
13 <key>CFBundleInfoDictionaryVersion</key> 13 <key>CFBundleInfoDictionaryVersion</key>
14 <string>6.0</string> 14 <string>6.0</string>
15 <key>CFBundlePackageType</key> 15 <key>CFBundlePackageType</key>
@@ -20,5 +20,7 @@ @@ -20,5 +20,7 @@
20 <string>1.0</string> 20 <string>1.0</string>
21 <key>NSMainNibFile</key> 21 <key>NSMainNibFile</key>
22 <string>MainWindow</string> 22 <string>MainWindow</string>
  23 + <key>CFBundleDisplayName</key>
  24 + <string>ASIHTTPRequest Demo</string>
23 </dict> 25 </dict>
24 </plist> 26 </plist>
@@ -18,5 +18,7 @@ @@ -18,5 +18,7 @@
18 <string>1.0</string> 18 <string>1.0</string>
19 <key>NSMainNibFile</key> 19 <key>NSMainNibFile</key>
20 <string>GHUnitIPhone</string> 20 <string>GHUnitIPhone</string>
  21 + <key>CFBundleDisplayName</key>
  22 + <string>ASIHTTPRequest Unit Tests</string>
21 </dict> 23 </dict>
22 </plist> 24 </plist>
This diff was suppressed by a .gitattributes entry.