-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathENGAOperation.m
105 lines (94 loc) · 2.79 KB
/
ENGAOperation.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
//
// ENGAOperation.m
// ENGoogleMeasurementProtocol
//
// Created by Steve High on 1/7/14.
// Copyright (c) 2014 Evilnode Software. All rights reserved.
//
#import "ENGAOperation.h"
#import <stdlib.h>
@interface ENGAOperation()
@property (nonatomic) BOOL ready;
@property (nonatomic) BOOL finished;
@end
@implementation ENGAOperation
@synthesize ready = _ready;
@synthesize finished = _finished;
- (id) init
{
self = [super init];
if (self) {
_ready = YES;
_finished = NO;
}
return self;
}
+ (id) operation
{
ENGAOperation *ret = [[ENGAOperation alloc] init];
#ifdef ENGA_DEFAULT_QUEUE_PRIORITY
[ret setQueuePriority:(NSOperationQueuePriority)ENGA_DEFAULT_QUEUE_PRIORITY];
#else
[ret setQueuePriority:NSOperationQueuePriorityVeryLow];
#endif
#ifdef ENGA_DEFAULT_THREAD_PRIORITY
[ret setThreadPriority:ENGA_DEFAULT_THREAD_PRIORITY];
#else
[ret setThreadPriority:0.1];
#endif
return ret;
}
- (void) start
{
self.ready = NO;
#ifdef ENGA_NO_SSL
NSString *endpoint = ENGA_ENDPOINT_NO_SSL;
#else
NSString *endpoint = ENGA_ENDPOINT_SSL;
#endif
NSString *userAgent = self.requestParams[@(kReservedUserAgentKey)];
NSMutableArray *keyValuePairs = [NSMutableArray arrayWithCapacity:[self.rawParams count]];
for (NSString *key in self.rawParams) {
id value = self.rawParams[key];
[keyValuePairs addObject:
[NSString stringWithFormat:@"%@=%@",key, [[value description] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]];
}
NSString *queryString = [keyValuePairs componentsJoinedByString:@"&"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:endpoint]];
[request addValue:userAgent forHTTPHeaderField:@"User-Agent"];
for (NSString *headerKey in self.requestHeaders) {
[request addValue:self.requestHeaders[headerKey] forHTTPHeaderField:headerKey];
}
NSDictionary *userHeaders = self.requestParams[@(kReservedUserDefinedHeaderKey)];
for (NSString *key in userHeaders) {
[request addValue:self.requestHeaders[key] forHTTPHeaderField:key];
}
#ifdef ENGA_NO_POST
// add cache buster to the end of query string for GET requests
endpoint = [NSString stringWithFormat:@"%@?%@&z=%d", endpoint, queryString, (arc4random() % 9999999)];
#else
[request setHTTPMethod:@"POST"];
[request setHTTPBody:[queryString dataUsingEncoding:NSUTF8StringEncoding]];
#endif
NSHTTPURLResponse *response = nil;
NSError *error = nil;
[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
self.finished = YES;
}
- (BOOL)isConcurrent
{
return YES;
}
- (BOOL)isExecuting
{
return !(_ready || _finished);
}
- (BOOL)isFinished
{
return _finished;
}
- (BOOL)isReady
{
return _ready;
}
@end