Skip to content

Commit 80c6434

Browse files
author
Peter
committedNov 23, 2018
no message
1 parent 695590b commit 80c6434

27 files changed

+452
-1467
lines changed
 

‎MTDNS.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,6 @@
55
@interface MTDNS : NSObject
66

77
+ (MTSignal *)resolveHostname:(NSString *)hostname;
8+
+ (MTSignal *)resolveHostnameNative:(NSString *)hostname port:(int32_t)port;
89

910
@end

‎MTDNS.m

Lines changed: 208 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,17 @@
11
#import "MTDNS.h"
22

3+
#import <arpa/inet.h>
4+
#include <netinet/tcp.h>
5+
#import <fcntl.h>
6+
#import <ifaddrs.h>
7+
#import <netdb.h>
8+
#import <netinet/in.h>
9+
#import <net/if.h>
10+
311
#if defined(MtProtoKitDynamicFramework)
12+
# import <MTProtoKitDynamic/MTQueue.h>
413
# import <MTProtoKitDynamic/MTSignal.h>
14+
# import <MTProtoKitDynamic/MTBag.h>
515
# import <MTProtoKitDynamic/MTAtomic.h>
616
# import <MTProtoKitDynamic/MTHttpRequestOperation.h>
717
# import <MTProtoKitDynamic/MTEncryption.h>
@@ -15,7 +25,9 @@
1525
# import <MTProtoKitDynamic/MTSerialization.h>
1626
# import <MTProtoKitDynamic/MTLogging.h>
1727
#elif defined(MtProtoKitMacFramework)
28+
# import <MTProtoKitMac/MTQueue.h>
1829
# import <MTProtoKitMac/MTSignal.h>
30+
# import <MTProtoKitMac/MTBag.h>
1931
# import <MTProtoKitMac/MTAtomic.h>
2032
# import <MTProtoKitMac/MTHttpRequestOperation.h>
2133
# import <MTProtoKitMac/MTEncryption.h>
@@ -29,7 +41,9 @@
2941
# import <MTProtoKitMac/MTSerialization.h>
3042
# import <MTProtoKitMac/MTLogging.h>
3143
#else
44+
# import <MTProtoKit/MTQueue.h>
3245
# import <MTProtoKit/MTSignal.h>
46+
# import <MTProtoKit/MTBag.h>
3347
# import <MTProtoKit/MTAtomic.h>
3448
# import <MTProtoKit/MTHttpRequestOperation.h>
3549
# import <MTProtoKit/MTEncryption.h>
@@ -47,6 +61,189 @@
4761
#import <netinet/in.h>
4862
#import <arpa/inet.h>
4963

64+
@interface MTDNSHostContext : NSObject {
65+
MTBag *_subscribers;
66+
id<MTDisposable> _disposable;
67+
}
68+
69+
@end
70+
71+
@implementation MTDNSHostContext
72+
73+
- (instancetype)initWithHost:(NSString *)host disposable:(id<MTDisposable>)disposable {
74+
self = [super init];
75+
if (self != nil) {
76+
_subscribers = [[MTBag alloc] init];
77+
}
78+
return self;
79+
}
80+
81+
- (void)dealloc {
82+
[_disposable dispose];
83+
}
84+
85+
- (NSInteger)addSubscriber:(void (^)(NSString *))completion {
86+
return [_subscribers addItem:[completion copy]];
87+
}
88+
89+
- (void)removeSubscriber:(NSInteger)index {
90+
[_subscribers removeItem:index];
91+
}
92+
93+
- (bool)isEmpty {
94+
return [_subscribers isEmpty];
95+
}
96+
97+
- (void)complete:(NSString *)result {
98+
for (void (^completion)(NSString *) in [_subscribers copyItems]) {
99+
completion(result);
100+
}
101+
}
102+
103+
@end
104+
105+
@interface MTDNSContext : NSObject {
106+
NSMutableDictionary<NSString *, MTDNSHostContext *> *_contexts;
107+
}
108+
109+
@end
110+
111+
@implementation MTDNSContext
112+
113+
+ (MTQueue *)sharedQueue {
114+
static MTQueue *queue = nil;
115+
static dispatch_once_t onceToken;
116+
dispatch_once(&onceToken, ^{
117+
queue = [[MTQueue alloc] init];
118+
});
119+
return queue;
120+
}
121+
122+
+ (MTSignal *)shared {
123+
return [[[MTSignal alloc] initWithGenerator:^id<MTDisposable>(MTSubscriber *subscriber) {
124+
static MTDNSContext *instance = nil;
125+
static dispatch_once_t onceToken;
126+
dispatch_once(&onceToken, ^{
127+
instance = [[MTDNSContext alloc] init];
128+
});
129+
[subscriber putNext:instance];
130+
[subscriber putCompletion];
131+
return nil;
132+
}] startOn:[self sharedQueue]];
133+
}
134+
135+
- (instancetype)init {
136+
self = [super init];
137+
if (self != nil) {
138+
_contexts = [[NSMutableDictionary alloc] init];
139+
}
140+
return self;
141+
}
142+
143+
- (id<MTDisposable>)subscribe:(NSString *)host port:(int32_t)port completion:(void (^)(NSString *))completion {
144+
NSString *key = [NSString stringWithFormat:@"%@:%d", host, port];
145+
146+
MTMetaDisposable *disposable = nil;
147+
if (_contexts[key] == nil) {
148+
disposable = [[MTMetaDisposable alloc] init];
149+
_contexts[key] = [[MTDNSHostContext alloc] initWithHost:host disposable:disposable];
150+
}
151+
MTDNSHostContext *context = _contexts[key];
152+
153+
NSInteger index = [context addSubscriber:^(NSString *result) {
154+
if (completion) {
155+
completion(result);
156+
}
157+
}];
158+
159+
if (disposable != nil) {
160+
__weak MTDNSContext *weakSelf = self;
161+
[disposable setDisposable:[[[self performLookup:host port:port] deliverOn:[MTDNSContext sharedQueue]] startWithNext:^(NSString *result) {
162+
__strong MTDNSContext *strongSelf = weakSelf;
163+
if (strongSelf == nil) {
164+
return;
165+
}
166+
if (strongSelf->_contexts[key] != nil) {
167+
[strongSelf->_contexts[key] complete:result];
168+
[strongSelf->_contexts removeObjectForKey:key];
169+
}
170+
}]];
171+
}
172+
173+
__weak MTDNSContext *weakSelf = self;
174+
__weak MTDNSHostContext *weakContext = context;
175+
return [[MTBlockDisposable alloc] initWithBlock:^{
176+
[[MTDNSContext sharedQueue] dispatchOnQueue:^{
177+
__strong MTDNSContext *strongSelf = weakSelf;
178+
__strong MTDNSHostContext *strongContext = weakContext;
179+
if (strongSelf == nil || strongContext == nil) {
180+
return;
181+
}
182+
if (strongSelf->_contexts[key] != nil && strongSelf->_contexts[key] == strongContext) {
183+
[strongSelf->_contexts[key] removeSubscriber:index];
184+
if ([strongSelf->_contexts[key] isEmpty]) {
185+
[strongSelf->_contexts removeObjectForKey:key];
186+
}
187+
}
188+
}];
189+
}];
190+
}
191+
192+
- (MTSignal *)performLookup:(NSString *)host port:(int32_t)port {
193+
MTSignal *lookupOnce = [[MTSignal alloc] initWithGenerator:^id<MTDisposable>(MTSubscriber *subscriber) {
194+
MTMetaDisposable *disposable = [[MTMetaDisposable alloc] init];
195+
[[MTQueue concurrentDefaultQueue] dispatchOnQueue:^{
196+
struct addrinfo hints, *res, *res0;
197+
198+
memset(&hints, 0, sizeof(hints));
199+
hints.ai_family = PF_UNSPEC;
200+
hints.ai_socktype = SOCK_STREAM;
201+
hints.ai_protocol = IPPROTO_TCP;
202+
203+
NSString *portStr = [NSString stringWithFormat:@"%d", port];
204+
int gai_error = getaddrinfo([host UTF8String], [portStr UTF8String], &hints, &res0);
205+
206+
NSString *address4 = nil;
207+
NSString *address6 = nil;
208+
209+
if (gai_error == 0) {
210+
for(res = res0; res; res = res->ai_next) {
211+
if ((address4 == nil) && (res->ai_family == AF_INET)) {
212+
struct sockaddr_in *addr_in = (struct sockaddr_in *)res->ai_addr;
213+
char *s = malloc(INET_ADDRSTRLEN);
214+
inet_ntop(AF_INET, &(addr_in->sin_addr), s, INET_ADDRSTRLEN);
215+
address4 = [NSString stringWithUTF8String:s];
216+
free(s);
217+
} else if ((address6 == nil) && (res->ai_family == AF_INET6)) {
218+
struct sockaddr_in6 *addr_in6 = (struct sockaddr_in6 *)res->ai_addr;
219+
char *s = malloc(INET6_ADDRSTRLEN);
220+
inet_ntop(AF_INET6, &(addr_in6->sin6_addr), s, INET6_ADDRSTRLEN);
221+
address6 = [NSString stringWithUTF8String:s];
222+
free(s);
223+
}
224+
}
225+
freeaddrinfo(res0);
226+
}
227+
228+
if (address4 != nil) {
229+
[subscriber putNext:address4];
230+
[subscriber putCompletion];
231+
} else if (address6 != nil) {
232+
[subscriber putNext:address6];
233+
[subscriber putCompletion];
234+
} else {
235+
[subscriber putError:nil];
236+
}
237+
}];
238+
return disposable;
239+
}];
240+
return [[lookupOnce catch:^MTSignal *(__unused id error) {
241+
return [[MTSignal complete] delay:2.0 onQueue:[MTDNSContext sharedQueue]];
242+
}] take:1];
243+
}
244+
245+
@end
246+
50247
@interface MTDNSCachedHostname : NSObject
51248

52249
@property (nonatomic, strong) NSString *ip;
@@ -144,4 +341,15 @@ + (MTSignal *)resolveHostname:(NSString *)hostname {
144341
}];
145342
}
146343

344+
+ (MTSignal *)resolveHostnameNative:(NSString *)hostname port:(int32_t)port {
345+
return [[MTDNSContext shared] mapToSignal:^MTSignal *(MTDNSContext *context) {
346+
return [[MTSignal alloc] initWithGenerator:^id<MTDisposable>(MTSubscriber *subscriber) {
347+
return [context subscribe:hostname port:port completion:^(NSString *result) {
348+
[subscriber putNext:result];
349+
[subscriber putCompletion];
350+
}];
351+
}];
352+
}];
353+
}
354+
147355
@end

‎MTDiscoverConnectionSignals.m

Lines changed: 1 addition & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,20 @@
11
#import "MTDiscoverConnectionSignals.h"
22

33
#import "MTTcpConnection.h"
4-
#import "MTHttpWorker.h"
54

65
#if defined(MtProtoKitDynamicFramework)
76
# import <MTProtoKitDynamic/MTTransportScheme.h>
87
# import <MTProtoKitDynamic/MTTcpTransport.h>
9-
# import <MTProtoKitDynamic/MTHttpTransport.h>
108
# import <MTProtoKitDynamic/MTQueue.h>
119
# import <MTProtoKitDynamic/MTProtoKitDynamic.h>
1210
#elif defined(MtProtoKitMacFramework)
1311
# import <MTProtoKitMac/MTTransportScheme.h>
1412
# import <MTProtoKitMac/MTTcpTransport.h>
15-
# import <MTProtoKitMac/MTHttpTransport.h>
1613
# import <MTProtoKitMac/MTQueue.h>
1714
# import <MTProtoKitMac/MTProtoKitMac.h>
1815
#else
1916
# import <MTProtoKit/MTTransportScheme.h>
2017
# import <MTProtoKit/MTTcpTransport.h>
21-
# import <MTProtoKit/MTHttpTransport.h>
2218
# import <MTProtoKit/MTQueue.h>
2319
# import <MTProtoKit/MTProtoKit.h>
2420
#endif
@@ -120,7 +116,7 @@ + (MTSignal *)tcpConnectionWithContext:(MTContext *)context datacenterId:(NSUInt
120116
MTPayloadData payloadData;
121117
NSData *data = [self payloadData:&payloadData context:context address:address];
122118

123-
MTTcpConnection *connection = [[MTTcpConnection alloc] initWithContext:context datacenterId:datacenterId address:address interface:nil usageCalculationInfo:nil];
119+
MTTcpConnection *connection = [[MTTcpConnection alloc] initWithContext:context datacenterId:datacenterId scheme:[[MTTransportScheme alloc] initWithTransportClass:[MTTcpTransport class] address:address media:false] interface:nil usageCalculationInfo:nil];
124120
__weak MTTcpConnection *weakConnection = connection;
125121
connection.connectionOpened = ^
126122
{
@@ -173,40 +169,6 @@ + (MTSignal *)tcpConnectionWithContext:(MTContext *)context datacenterId:(NSUInt
173169
}] startOn:[MTTcpConnection tcpQueue]];
174170
}
175171

176-
+ (MTSignal *)httpConnectionWithAddress:(MTDatacenterAddress *)address context:(MTContext *)context
177-
{
178-
return [[MTSignal alloc] initWithGenerator:^id<MTDisposable>(MTSubscriber *subscriber)
179-
{
180-
MTPayloadData payloadData;
181-
NSData *data = [self payloadData:&payloadData context:context address:address];
182-
183-
MTHttpWorkerBlockDelegate *delegate = [[MTHttpWorkerBlockDelegate alloc] init];
184-
185-
delegate.completedWithData = ^(NSData *data)
186-
{
187-
if ([self isResponseValid:data payloadData:payloadData])
188-
[subscriber putCompletion];
189-
else
190-
[subscriber putError:nil];
191-
};
192-
delegate.failed = ^
193-
{
194-
[subscriber putError:nil];
195-
};
196-
197-
if (MTLogEnabled()) {
198-
MTLog(@"trying http://%@:%d", address.ip, (int)address.port);
199-
}
200-
MTHttpWorker *httpWorker = [[MTHttpWorker alloc] initWithDelegate:delegate address:address payloadData:data performsLongPolling:false];
201-
202-
return [[MTBlockDisposable alloc] initWithBlock:^
203-
{
204-
[delegate description]; // keep reference
205-
[httpWorker stop];
206-
}];
207-
}];
208-
}
209-
210172
+ (MTSignal *)discoverSchemeWithContext:(MTContext *)context datacenterId:(NSInteger)datacenterId addressList:(NSArray *)addressList media:(bool)media isProxy:(bool)isProxy
211173
{
212174
NSMutableArray *bestAddressList = [[NSMutableArray alloc] init];
@@ -238,7 +200,6 @@ + (MTSignal *)discoverSchemeWithContext:(MTContext *)context datacenterId:(NSInt
238200

239201
for (MTDatacenterAddress *address in bestAddressList) {
240202
MTTransportScheme *tcpTransportScheme = [[MTTransportScheme alloc] initWithTransportClass:[MTTcpTransport class] address:address media:media];
241-
//MTTransportScheme *httpTransportScheme = [[MTTransportScheme alloc] initWithTransportClass:[MTHttpTransport class] address:address media:media];
242203

243204
if ([self isIpv6:address.ip])
244205
{
@@ -274,24 +235,6 @@ + (MTSignal *)discoverSchemeWithContext:(MTContext *)context datacenterId:(NSInt
274235
}
275236
}
276237
}
277-
278-
/*if (!address.restrictToTcp && !isProxy) {
279-
MTSignal *signal = [[[[self httpConnectionWithAddress:address] then:[MTSignal single:httpTransportScheme]] timeout:5.0 onQueue:[MTQueue concurrentDefaultQueue] orSignal:[MTSignal fail:nil]] catch:^MTSignal *(__unused id error)
280-
{
281-
return [MTSignal complete];
282-
}];
283-
[bestHttpSignals addObject:signal];
284-
285-
if (address.port != 80) {
286-
MTDatacenterAddress *httpAddress = [[MTDatacenterAddress alloc] initWithIp:address.ip port:80 preferForMedia:address.preferForMedia restrictToTcp:false cdn:address.cdn preferForProxy:address.preferForProxy];
287-
288-
MTTransportScheme *alternateHttpTransportScheme = [[MTTransportScheme alloc] initWithTransportClass:[MTHttpTransport class] address:httpAddress media:media];
289-
290-
[bestHttpSignals addObject:[[[[self httpConnectionWithAddress:httpAddress] then:[MTSignal single:alternateHttpTransportScheme]] timeout:5.0 onQueue:[MTQueue concurrentDefaultQueue] orSignal:[MTSignal fail:nil]] catch:^MTSignal *(__unused id error) {
291-
return [MTSignal complete];
292-
}]];
293-
}
294-
}*/
295238
}
296239

297240
MTSignal *repeatDelaySignal = [[MTSignal complete] delay:1.0 onQueue:[MTQueue concurrentDefaultQueue]];

‎MTProtoKit/MTContext.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
- (void)contextDatacenterAddressSetUpdated:(MTContext *)context datacenterId:(NSInteger)datacenterId addressSet:(MTDatacenterAddressSet *)addressSet;
2626
- (void)contextDatacenterAuthInfoUpdated:(MTContext *)context datacenterId:(NSInteger)datacenterId authInfo:(MTDatacenterAuthInfo *)authInfo;
2727
- (void)contextDatacenterAuthTokenUpdated:(MTContext *)context datacenterId:(NSInteger)datacenterId authToken:(id)authToken;
28-
- (void)contextDatacenterTransportSchemeUpdated:(MTContext *)context datacenterId:(NSInteger)datacenterId transportScheme:(MTTransportScheme *)transportScheme media:(bool)media;
28+
- (void)contextDatacenterTransportSchemesUpdated:(MTContext *)context datacenterId:(NSInteger)datacenterId;
2929
- (void)contextIsPasswordRequiredUpdated:(MTContext *)context datacenterId:(NSInteger)datacenterId;
3030
- (void)contextDatacenterPublicKeysUpdated:(MTContext *)context datacenterId:(NSInteger)datacenterId publicKeys:(NSArray<NSDictionary *> *)publicKeys;
3131
- (MTSignal *)fetchContextDatacenterPublicKeys:(MTContext *)context datacenterId:(NSInteger)datacenterId;
@@ -86,7 +86,8 @@
8686
- (void)reportTransportSchemeSuccessForDatacenterId:(NSInteger)datacenterId transportScheme:(MTTransportScheme *)transportScheme;
8787
- (void)invalidateTransportSchemesForDatacenterIds:(NSArray<NSNumber *> * _Nonnull)datacenterIds;
8888
- (void)invalidateTransportSchemesForKnownDatacenterIds;
89-
- (MTTransportScheme *)transportSchemeForDatacenterWithId:(NSInteger)datacenterId media:(bool)media isProxy:(bool)isProxy;
89+
- (MTTransportScheme * _Nullable)chooseTransportSchemeForConnectionToDatacenterId:(NSInteger)datacenterId schemes:(NSArray<MTTransportScheme *> * _Nonnull)schemes;
90+
- (NSArray<MTTransportScheme *> * _Nonnull)transportSchemesForDatacenterWithId:(NSInteger)datacenterId media:(bool)media enforceMedia:(bool)enforceMedia isProxy:(bool)isProxy;
9091
- (void)transportSchemeForDatacenterWithIdRequired:(NSInteger)datacenterId media:(bool)media;
9192
- (void)invalidateTransportSchemeForDatacenterId:(NSInteger)datacenterId transportScheme:(MTTransportScheme *)transportScheme isProbablyHttp:(bool)isProbablyHttp media:(bool)media;
9293
- (void)revalidateTransportSchemeForDatacenterId:(NSInteger)datacenterId transportScheme:(MTTransportScheme *)transportScheme media:(bool)media;

0 commit comments

Comments
 (0)
Please sign in to comment.