-
Notifications
You must be signed in to change notification settings - Fork 9
/
NSURL+L0URLResolvingRedirects.m
141 lines (110 loc) · 2.77 KB
/
NSURL+L0URLResolvingRedirects.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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
//
// NSURL+L0URLResolvingRedirects.m
// MuiKit
//
// Created by ∞ on 17/07/09.
// Copyright 2009 __MyCompanyName__. All rights reserved.
//
#import "NSURL+L0URLResolvingRedirects.h"
@interface L0URLRedirectsResolver : NSObject {
NSURLConnection* connection;
id delegate;
SEL selector;
#if __BLOCKS__
L0URLResolvingDidEndBlock block;
#endif
NSURL* lastSeenURL;
}
- (id) initWithURL:(NSURL*) url delegate:(id) delegate selector:(SEL) selector;
#if __BLOCKS__
- (id) initWithURL:(NSURL*) url didEndBlock:(L0URLResolvingDidEndBlock) block;
#endif
- (void) startWithURL:(NSURL*) u;
- (void) finish;
@property(copy) NSURL* lastSeenURL;
@end
// ------------------
@implementation NSURL (L0URLResolvingRedirects)
- (void) beginResolvingRedirectsWithDelegate:(id) delegate selector:(SEL) selector;
{
if (![[self scheme] isEqual:@"http"] && ![[self scheme] isEqual:@"https"]) {
[delegate performSelector:selector withObject:self];
return;
}
[[[L0URLRedirectsResolver alloc] initWithURL:self delegate:delegate selector:selector] autorelease];
}
#if __BLOCKS__
- (void) beginResolvingRedirectsAndInvoke:(L0URLResolvingDidEndBlock) block;
{
if (![[self scheme] isEqual:@"http"] && ![[self scheme] isEqual:@"https"]) {
block(self);
return;
}
[[[L0URLRedirectsResolver alloc] initWithURL:self didEndBlock:block] autorelease];
}
#endif
@end
@implementation L0URLRedirectsResolver
- (id) initWithURL:(NSURL*) url delegate:(id) d selector:(SEL) s;
{
if (self = [super init]) {
delegate = d;
selector = s;
[self startWithURL:url];
}
return self;
}
#if __BLOCKS__
- (id) initWithURL:(NSURL*) url didEndBlock:(L0URLResolvingDidEndBlock) b;
{
if (self = [super init]) {
block = [b copy];
[self startWithURL:url];
}
return self;
}
#endif
- (void) startWithURL:(NSURL*) u;
{
self.lastSeenURL = u;
connection = [[NSURLConnection alloc] initWithRequest:[NSURLRequest requestWithURL:u] delegate:self];
[self retain]; // balanced in -finish
}
- (NSURLRequest*) connection:(NSURLConnection*) c willSendRequest:(NSURLRequest*) request redirectResponse:(NSURLResponse*) response;
{
if (request)
self.lastSeenURL = [request URL];
return request;
}
- (void) connectionDidFinishLoading:(NSURLConnection*) c;
{
[self finish];
}
- (void) connection:(NSURLConnection*) c didFailWithError:(NSError*) e;
{
self.lastSeenURL = nil;
[self finish];
}
- (void) finish;
{
if (delegate && selector)
[delegate performSelector:selector withObject:self.lastSeenURL];
#if __BLOCKS__
if (block)
block(self.lastSeenURL);
#endif
[connection release];
connection = nil;
[self autorelease]; // balances the retain in -startWithURL:
}
@synthesize lastSeenURL;
- (void) dealloc;
{
[connection release];
self.lastSeenURL = nil;
#if __BLOCKS__
[block release];
#endif
[super dealloc];
}
@end