aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRoman Margold <rmargold@chromium.org>2017-02-01 09:06:31 -0800
committerRoman Margold <rmargold@chromium.org>2017-02-01 09:06:31 -0800
commit262a3f50fe5948c2570bbce2cd696e253a88af79 (patch)
treebf07331bf9dea84fad920aa6445324006e6bf734 /src
parentSeveral fixes for broken Mac build (diff)
downloadbreakpad-262a3f50fe5948c2570bbce2cd696e253a88af79.tar.xz
iOS client identifies itself via URL params
Recently, Crash started applying quotas for crash report uploads to protect the service and its client products from misbehaving product or product version. For the protection to be effective, products need to identify themselves during report upload via URL parameters. This new code makes iOS apps using Breakpad provide the parameters automatically.
Diffstat (limited to 'src')
-rw-r--r--src/client/mac/sender/uploader.mm37
1 files changed, 37 insertions, 0 deletions
diff --git a/src/client/mac/sender/uploader.mm b/src/client/mac/sender/uploader.mm
index 42a43bfc..b6a8a846 100644
--- a/src/client/mac/sender/uploader.mm
+++ b/src/client/mac/sender/uploader.mm
@@ -168,6 +168,10 @@ NSDictionary *readConfigurationData(const char *configFile) {
// Records the uploaded crash ID to the log file.
- (void)logUploadWithID:(const char *)uploadID;
+
+// Builds an URL parameter for a given dictionary key. Uses Uploader's parameters
+// to provide its value. Returns nil if no item is stored for the given key.
+- (NSURLQueryItem *)queryItemWithName:(NSString *)queryItemName forParamKey:(NSString *)key;
@end
@implementation Uploader
@@ -532,8 +536,41 @@ NSDictionary *readConfigurationData(const char *configFile) {
}
//=============================================================================
+- (NSURLQueryItem *)queryItemWithName:(NSString *)queryItemName forParamKey:(NSString *)key {
+ NSString *value = [parameters_ objectForKey:key];
+ NSString *escapedValue = [value stringByAddingPercentEncodingWithAllowedCharacters:
+ [NSCharacterSet URLQueryAllowedCharacterSet]];
+ return [NSURLQueryItem queryItemWithName:queryItemName value:escapedValue];
+}
+
+//=============================================================================
- (void)report {
NSURL *url = [NSURL URLWithString:[parameters_ objectForKey:@BREAKPAD_URL]];
+
+ NSString *serverType = [parameters_ objectForKey:@BREAKPAD_SERVER_TYPE];
+ if ([serverType length] == 0 || [serverType isEqualToString:kGoogleServerType]) {
+ // when communicating to Crash @ Google, add URL params which identify the product
+ NSURLComponents *urlComponents = [NSURLComponents componentsWithURL:url
+ resolvingAgainstBaseURL:false];
+ NSMutableArray *queryItemsToAdd = [urlComponents.queryItems mutableCopyWithZone:nil];
+ if (queryItemsToAdd == nil) {
+ queryItemsToAdd = [[NSMutableArray alloc] init];
+ }
+
+ NSURLQueryItem *queryItemProduct = [self queryItemWithName:@"product"
+ forParamKey:@BREAKPAD_PRODUCT];
+ NSURLQueryItem *queryItemVersion = [self queryItemWithName:@"version"
+ forParamKey:@BREAKPAD_VERSION];
+ NSURLQueryItem *queryItemGuid = [self queryItemWithName:@"guid" forParamKey:@"guid"];
+
+ if (queryItemProduct != nil) [queryItemsToAdd addObject:queryItemProduct];
+ if (queryItemVersion != nil) [queryItemsToAdd addObject:queryItemVersion];
+ if (queryItemGuid != nil) [queryItemsToAdd addObject:queryItemGuid];
+
+ urlComponents.queryItems = queryItemsToAdd;
+ url = [urlComponents URL];
+ }
+
HTTPMultipartUpload *upload = [[HTTPMultipartUpload alloc] initWithURL:url];
NSMutableDictionary *uploadParameters = [NSMutableDictionary dictionary];