Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 15 additions & 12 deletions Source/ARTAuth.m
Original file line number Diff line number Diff line change
Expand Up @@ -493,21 +493,24 @@ - (void)handleAuthUrlResponse:(NSHTTPURLResponse *)response
- (NSObject<ARTCancellable> *)executeTokenRequest:(ARTTokenRequest *)tokenRequest
callback:(ARTTokenDetailsCallback)callback {
id<ARTEncoder> encoder = _rest.defaultEncoder;

NSURL *requestUrl = [NSURL URLWithString:[NSString stringWithFormat:@"/keys/%@/requestToken?format=%@", tokenRequest.keyName, [encoder formatAsString]]
relativeToURL:_rest.baseUrl];
NSError *error = nil;
NSData *bodyData = [encoder encodeTokenRequest:tokenRequest error:&error];
if (error) {
callback(nil, error);
return nil;
}

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:requestUrl];
request.HTTPMethod = @"POST";

NSError *encodeError = nil;
request.HTTPBody = [encoder encodeTokenRequest:tokenRequest error:&encodeError];
if (encodeError) {
callback(nil, encodeError);
NSMutableURLRequest *request = [_rest buildRequest:@"POST"
path:[NSString stringWithFormat:@"/keys/%@/requestToken", tokenRequest.keyName]
baseUrl:nil
params:@{ @"format": encoder.formatAsString }
body:bodyData
headers:nil
error:&error];
if (error) {
callback(nil, error);
return nil;
}
[request setValue:[encoder mimeType] forHTTPHeaderField:@"Accept"];
[request setValue:[encoder mimeType] forHTTPHeaderField:@"Content-Type"];

return [_rest executeAblyRequest:request withAuthOption:ARTAuthenticationOff wrapperSDKAgents:nil completion:^(NSHTTPURLResponse *response, NSData *data, NSError *error) {
if (error) {
Expand Down
32 changes: 11 additions & 21 deletions Source/ARTDataQuery.m
Original file line number Diff line number Diff line change
Expand Up @@ -22,18 +22,18 @@ - (instancetype)init {
}
}

- (NSMutableArray *)asQueryItems:(NSError *_Nullable*)error {
NSMutableArray *items = [NSMutableArray array];
- (NSStringDictionary *)asQueryParams {
NSMutableStringDictionary *items = [NSMutableStringDictionary dictionary];

if (self.start) {
[items addObject:[NSURLQueryItem queryItemWithName:@"start" value:[NSString stringWithFormat:@"%llu", dateToMilliseconds(self.start)]]];
items[@"start"] = [NSString stringWithFormat:@"%llu", dateToMilliseconds(self.start)];
}
if (self.end) {
[items addObject:[NSURLQueryItem queryItemWithName:@"end" value:[NSString stringWithFormat:@"%llu", dateToMilliseconds(self.end)]]];
items[@"end"] = [NSString stringWithFormat:@"%llu", dateToMilliseconds(self.end)];
}

[items addObject:[NSURLQueryItem queryItemWithName:@"limit" value:[NSString stringWithFormat:@"%hu", self.limit]]];
[items addObject:[NSURLQueryItem queryItemWithName:@"direction" value:queryDirectionToString(self.direction)]];
items[@"limit"] = [NSString stringWithFormat:@"%hu", self.limit];
items[@"direction"] = queryDirectionToString(self.direction);

return items;
}
Expand All @@ -42,20 +42,10 @@ - (NSMutableArray *)asQueryItems:(NSError *_Nullable*)error {

@implementation ARTRealtimeHistoryQuery

- (NSMutableArray *)asQueryItems:(NSError **)errorPtr {
NSMutableArray *items = [super asQueryItems:errorPtr];
if (*errorPtr) {
return nil;
}
if (self.untilAttach) {
NSAssert(self.realtimeChannel, @"ARTRealtimeHistoryQuery used from outside ARTRealtimeChannel.history");
if (self.realtimeChannel.state_nosync != ARTRealtimeChannelAttached) {
*errorPtr = [NSError errorWithDomain:ARTAblyErrorDomain code:ARTRealtimeHistoryErrorNotAttached userInfo:@{NSLocalizedDescriptionKey:@"ARTRealtimeHistoryQuery: untilAttach used in channel that isn't attached"}];
return nil;
}
[items addObject:[NSURLQueryItem queryItemWithName:@"fromSerial" value:self.realtimeChannel.attachSerial]];
}
return items;
- (NSStringDictionary *)asQueryParams {
NSMutableStringDictionary *params = super.asQueryParams.mutableCopy;
params[@"fromSerial"] = self.realtimeChannelAttachSerial;
return params;
}

@end
2 changes: 1 addition & 1 deletion Source/ARTJsonLikeEncoder.m
Original file line number Diff line number Diff line change
Expand Up @@ -617,7 +617,7 @@ - (ARTAuthDetails *)authDetailsFromDictionary:(NSDictionary *)input {
return [[ARTAuthDetails alloc] initWithToken:[input artString:@"accessToken"]];
}

- (NSArray *)messagesToArray:(NSArray *)messages {
- (NSArray<NSDictionary *> *)messagesToArray:(NSArray<ARTMessage *> *)messages {
NSMutableArray *output = [NSMutableArray array];

for (ARTMessage *message in messages) {
Expand Down
14 changes: 14 additions & 0 deletions Source/ARTNSString+ARTUtil.m
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,18 @@ - (BOOL)isNotEmptyString {
return ![self isEmptyString];
}

- (NSString *)encodePathSegment {
// Source: https://datatracker.ietf.org/doc/html/rfc3986#section-3.3
// i.e. segment = unreserved / pct-encoded / sub-delims / ":" / "@", where
// unreserved = ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~
// pct-encoded = %XX
// sub-delims = !$&'()*+,;=
NSCharacterSet *allowedSet = [NSCharacterSet characterSetWithCharactersInString:@"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~!$&'()*+,;=:@"];
NSString *escaped = [self stringByAddingPercentEncodingWithAllowedCharacters:allowedSet];
if (!escaped) {
[NSException raise:NSInternalInconsistencyException format:@"String '%@' can't be percent encoded.", self];
}
Comment thread
maratal marked this conversation as resolved.
return escaped;
}

@end
77 changes: 59 additions & 18 deletions Source/ARTPushActivationStateMachine.m
Original file line number Diff line number Diff line change
Expand Up @@ -190,11 +190,19 @@ - (void)deviceRegistration:(ARTErrorInfo *)error {
}

void (^doDeviceRegistration)(void) = ^{
// Asynchronous HTTP request
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"/push/deviceRegistrations"]];
request.HTTPMethod = @"POST";
request.HTTPBody = [[self->_rest defaultEncoder] encodeLocalDevice:local error:nil];
[request setValue:[[self->_rest defaultEncoder] mimeType] forHTTPHeaderField:@"Content-Type"];
NSError *error = nil;
NSMutableURLRequest *request = [self->_rest buildRequest:@"POST"
path:@"/push/deviceRegistrations"
baseUrl:self->_rest.baseUrl
params:nil
body:[self->_rest.defaultEncoder encodeLocalDevice:local error:nil]
headers:nil
error:&error];
if (error) {
ARTLogError(self->_logger, @"%@: device registration failed (%@)", NSStringFromClass(self.class), error.localizedDescription);
[self sendEvent:[ARTPushActivationEventGettingDeviceRegistrationFailed newWithError:[ARTErrorInfo createFromNSError:error]]];
return;
}
Comment thread
coderabbitai[bot] marked this conversation as resolved.

ARTLogDebug(self->_logger, @"%@: device registration with request %@", NSStringFromClass(self.class), request);
[self->_rest executeAblyRequest:request withAuthOption:ARTAuthenticationOn wrapperSDKAgents:nil completion:^(NSHTTPURLResponse *response, NSData *data, NSError *error) {
Expand Down Expand Up @@ -252,14 +260,26 @@ - (void)deviceUpdateRegistration:(ARTErrorInfo *)error {
return;
}

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[[NSURL URLWithString:@"/push/deviceRegistrations"] URLByAppendingPathComponent:local.id]];
request.HTTPMethod = @"PATCH";
request.HTTPBody = [[_rest defaultEncoder] encode:@{
NSDictionary *bodyDict = @{
@"push": @{
@"recipient": local.push.recipient
}
} error:nil];
[request setValue:[[_rest defaultEncoder] mimeType] forHTTPHeaderField:@"Content-Type"];
};

NSError *requestError = nil;
NSMutableURLRequest *request = [_rest buildRequest:@"PATCH"
path:[@"/push/deviceRegistrations" stringByAppendingPathComponent:local.id]
baseUrl:_rest.baseUrl
params:nil
body:bodyDict
headers:nil
error:&requestError];
if (requestError) {
ARTLogError(self->_logger, @"%@: device update failed (%@)", NSStringFromClass(self.class), requestError.localizedDescription);
[self sendEvent:[ARTPushActivationEventSyncRegistrationFailed newWithError:[ARTErrorInfo createFromNSError:requestError]]];
return;
}

[request setDeviceAuthentication:local];

ARTLogDebug(_logger, @"%@: update device with request %@", NSStringFromClass(self.class), request);
Expand Down Expand Up @@ -303,17 +323,26 @@ - (void)syncDevice {

void (^doDeviceSync)(void) = ^{
// Asynchronous HTTP request
NSString *const path = [@"/push/deviceRegistrations" stringByAppendingPathComponent:local.id];
NSMutableURLRequest *const request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:path]];
request.HTTPMethod = @"PUT";
request.HTTPBody = [[self->_rest defaultEncoder] encodeDeviceDetails:local error:nil];
[request setValue:[[self->_rest defaultEncoder] mimeType] forHTTPHeaderField:@"Content-Type"];
NSError *requestError = nil;
NSMutableURLRequest *request = [self->_rest buildRequest:@"PUT"
path:[@"/push/deviceRegistrations" stringByAppendingPathComponent:local.id]
baseUrl:self->_rest.baseUrl
params:nil
body:[self->_rest.defaultEncoder encodeDeviceDetails:local error:nil]
headers:nil
error:&requestError];
if (requestError) {
ARTLogError(self->_logger, @"%@: device sync failed (%@)", NSStringFromClass(self.class), requestError.localizedDescription);
[self sendEvent:[ARTPushActivationEventSyncRegistrationFailed newWithError:[ARTErrorInfo createFromNSError:requestError]]];
return;
}
Comment thread
maratal marked this conversation as resolved.

[request setDeviceAuthentication:local];

ARTLogDebug(self->_logger, @"%@: sync device with request %@", NSStringFromClass(self.class), request);
[self->_rest executeAblyRequest:request withAuthOption:ARTAuthenticationOn wrapperSDKAgents:nil completion:^(NSHTTPURLResponse *response, NSData *data, NSError *error) {
if (error) {
ARTLogError(self->_logger, @"%@: device registration failed (%@)", NSStringFromClass(self.class), error.localizedDescription);
ARTLogError(self->_logger, @"%@: device sync failed (%@)", NSStringFromClass(self.class), error.localizedDescription);
[self sendEvent:[ARTPushActivationEventSyncRegistrationFailed newWithError:[ARTErrorInfo createFromNSError:error]]];
return;
}
Expand Down Expand Up @@ -361,8 +390,20 @@ - (void)deviceUnregistration:(ARTErrorInfo *)error {
}

// Asynchronous HTTP request
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[[NSURL URLWithString:@"/push/deviceRegistrations"] URLByAppendingPathComponent:local.id]];
request.HTTPMethod = @"DELETE";
NSError *requestError = nil;
NSMutableURLRequest *request = [_rest buildRequest:@"DELETE"
path:[@"/push/deviceRegistrations" stringByAppendingPathComponent:local.id]
baseUrl:_rest.baseUrl
params:nil
body:nil
headers:nil
error:&requestError];
if (requestError) {
ARTLogError(self->_logger, @"%@: device deregistration failed (%@)", NSStringFromClass(self.class), requestError.localizedDescription);
[self sendEvent:[ARTPushActivationEventDeregistrationFailed newWithError:[ARTErrorInfo createFromNSError:requestError]]];
return;
}

[request setDeviceAuthentication:local];

ARTLogDebug(_logger, @"%@: device deregistration with request %@", NSStringFromClass(self.class), request);
Expand Down
16 changes: 12 additions & 4 deletions Source/ARTPushAdmin.m
Original file line number Diff line number Diff line change
Expand Up @@ -75,13 +75,21 @@ - (void)publish:(ARTPushRecipient *)recipient data:(ARTJsonObject *)data wrapper
return;
}

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"/push/publish"]];
request.HTTPMethod = @"POST";
NSMutableDictionary *body = [NSMutableDictionary dictionary];
[body setObject:recipient forKey:@"recipient"];
[body addEntriesFromDictionary:data];
request.HTTPBody = [[self->_rest defaultEncoder] encode:body error:nil];
[request setValue:[[self->_rest defaultEncoder] mimeType] forHTTPHeaderField:@"Content-Type"];
NSError *error = nil;
NSMutableURLRequest *request = [self->_rest buildRequest:@"POST"
path:@"/push/publish"
baseUrl:self->_rest.baseUrl
params:nil
body:body
headers:nil
error:&error];
if (error) {
if (callback) callback([ARTErrorInfo createFromNSError:error]);
return;
}

ARTLogDebug(self->_logger, @"push notification to a single device %@", request);
[self->_rest executeAblyRequest:request withAuthOption:ARTAuthenticationOn wrapperSDKAgents:wrapperSDKAgents completion:^(NSHTTPURLResponse *response, NSData *data, NSError *error) {
Expand Down
Loading
Loading