diff --git a/Pod/Classes/Categories/NSString+SnapchatKit.h b/Pod/Classes/Categories/NSString+SnapchatKit.h index 3c6f45b..c67da4a 100755 --- a/Pod/Classes/Categories/NSString+SnapchatKit.h +++ b/Pod/Classes/Categories/NSString+SnapchatKit.h @@ -32,6 +32,8 @@ + (NSString *)timestamp; + (NSString *)timestampFrom:(NSDate *)date; + (NSString *)queryStringWithParams:(NSDictionary *)params; ++ (NSString *)queryStringWithParams:(NSDictionary *)params URLEscapeValues:(BOOL)escapeValues; + @end diff --git a/Pod/Classes/Categories/NSString+SnapchatKit.m b/Pod/Classes/Categories/NSString+SnapchatKit.m index 394eab2..d82d4d5 100755 --- a/Pod/Classes/Categories/NSString+SnapchatKit.m +++ b/Pod/Classes/Categories/NSString+SnapchatKit.m @@ -109,12 +109,21 @@ + (NSString *)timestampFrom:(NSDate *)date { } + (NSString *)queryStringWithParams:(NSDictionary *)params { + return [NSString queryStringWithParams:params URLEscapeValues:NO]; +} + ++ (NSString *)queryStringWithParams:(NSDictionary *)params URLEscapeValues:(BOOL)escapeValues { if (params.allKeys.count == 0) return @""; NSMutableString *q = [NSMutableString string]; [params enumerateKeysAndObjectsUsingBlock:^(NSString *key, id value, BOOL *stop) { - if ([value isKindOfClass:[NSString class]]) - value = [(NSString *)value stringByReplacingOccurrencesOfString:@" " withString:@"+"]; + if ([value isKindOfClass:[NSString class]]) { + if (escapeValues) { + value = [(NSString *)value urlencode]; + } else { + value = [(NSString *)value stringByReplacingOccurrencesOfString:@" " withString:@"+"]; + } + } [q appendFormat:@"%@=%@&", key, value]; }]; @@ -123,6 +132,26 @@ + (NSString *)queryStringWithParams:(NSDictionary *)params { return q; } +- (NSString *)urlencode { + NSMutableString *output = [NSMutableString string]; + const unsigned char *source = (const unsigned char *)[self UTF8String]; + int sourceLen = (int)strlen((const char *)source); + for (int i = 0; i < sourceLen; ++i) { + const unsigned char thisChar = source[i]; + if (thisChar == ' '){ + [output appendString:@"+"]; + } else if (thisChar == '.' || thisChar == '-' || thisChar == '_' || thisChar == '~' || + (thisChar >= 'a' && thisChar <= 'z') || + (thisChar >= 'A' && thisChar <= 'Z') || + (thisChar >= '0' && thisChar <= '9')) { + [output appendFormat:@"%c", thisChar]; + } else { + [output appendFormat:@"%%%02X", thisChar]; + } + } + return output; +} + @end diff --git a/Pod/Classes/Networking/SKClient.m b/Pod/Classes/Networking/SKClient.m index 25fac8c..b51bd24 100755 --- a/Pod/Classes/Networking/SKClient.m +++ b/Pod/Classes/Networking/SKClient.m @@ -339,11 +339,11 @@ - (void)getAttestation:(NSString *)username password:(NSString *)password ts:(NS @"apk_digest": SKAttestation.digest9_14_2}; request.URL = [NSURL URLWithString:SKAttestation.protobufPOSTURL]; - request.HTTPBody = [[NSString queryStringWithParams:query] dataUsingEncoding:NSUTF8StringEncoding]; + request.HTTPBody = [[NSString queryStringWithParamsForAttestion:query] dataUsingEncoding:NSUTF8StringEncoding]; + [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; + [[session dataTaskWithRequest:request completionHandler:^(NSData *data2, NSURLResponse *response2, NSError *error2) { - ///////////////////////////////// - // This is where I get the 400 // - ///////////////////////////////// + if (!error2 && [(NSHTTPURLResponse *)response2 statusCode] == 200) { jsonError = nil; json = [NSJSONSerialization JSONObjectWithData:data2 options:0 error:&jsonError]; @@ -355,6 +355,8 @@ - (void)getAttestation:(NSString *)username password:(NSString *)password ts:(NS request.URL = [NSURL URLWithString:SKAttestation.attestationURL]; request.HTTPBody = [json[@"binary"] base64DecodedData]; [request setValue:SKAttestation.userAgent forHTTPHeaderField:SKHeaders.userAgent]; + [request setValue:SKHeaders.values.protobuf forHTTPHeaderField:SKHeaders.contentType]; + [[session dataTaskWithRequest:request completionHandler:^(NSData *data3, NSURLResponse *response3, NSError *error3) { if (!error3 && [(NSHTTPURLResponse *)response3 statusCode] == 200) { jsonError = nil;