00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 @import "CPObject.j"
00024 @import "CPRunLoop.j"
00025 @import "CPURLRequest.j"
00026 @import "CPURLResponse.j"
00027
00028
00029 var CPURLConnectionDelegate = nil;
00030
00075 @implementation CPURLConnection : CPObject
00076 {
00077 CPURLRequest _request;
00078 id _delegate;
00079 BOOL _isCanceled;
00080 BOOL _isLocalFileConnection;
00081
00082 HTTPRequest _HTTPRequest;
00083 }
00084
00085 + (void)setClassDelegate:(id)delegate
00086 {
00087 CPURLConnectionDelegate = delegate;
00088 }
00089
00090
00091
00092
00093
00094
00095
00096
00097 + (CPData)sendSynchronousRequest:(CPURLRequest)aRequest returningResponse:({CPURLResponse})aURLResponse
00098 {
00099 try
00100 {
00101 var request = new CFHTTPRequest();
00102
00103 request.open([aRequest HTTPMethod], [[aRequest URL] absoluteString], NO);
00104
00105 var fields = [aRequest allHTTPHeaderFields],
00106 key = nil,
00107 keys = [fields keyEnumerator];
00108
00109 while (key = [keys nextObject])
00110 request.setRequestHeader(key, [fields objectForKey:key]);
00111
00112 request.send([aRequest HTTPBody]);
00113
00114 return [CPData dataWithRawString:request.responseText()];
00115 }
00116 catch (anException)
00117 {
00118 }
00119
00120 return nil;
00121 }
00122
00123
00124
00125
00126
00127
00128
00129 + (CPURLConnection)connectionWithRequest:(CPURLRequest)aRequest delegate:(id)aDelegate
00130 {
00131 return [[self alloc] initWithRequest:aRequest delegate:aDelegate];
00132 }
00133
00134
00135
00136
00137
00138
00139
00140
00141 - (id)initWithRequest:(CPURLRequest)aRequest delegate:(id)aDelegate startImmediately:(BOOL)shouldStartImmediately
00142 {
00143 self = [super init];
00144
00145 if (self)
00146 {
00147 _request = aRequest;
00148 _delegate = aDelegate;
00149 _isCanceled = NO;
00150
00151 var URL = [_request URL],
00152 scheme = [URL scheme];
00153
00154
00155 _isLocalFileConnection = scheme === "file" ||
00156 ((scheme === "http" || scheme === "https:") &&
00157 window.location &&
00158 (window.location.protocol === "file:" || window.location.protocol === "app:"));
00159
00160 _HTTPRequest = new CFHTTPRequest();
00161
00162 if (shouldStartImmediately)
00163 [self start];
00164 }
00165
00166 return self;
00167 }
00168
00169 - (id)initWithRequest:(CPURLRequest)aRequest delegate:(id)aDelegate
00170 {
00171 return [self initWithRequest:aRequest delegate:aDelegate startImmediately:YES];
00172 }
00173
00174
00175
00176
00177 - (id)delegate
00178 {
00179 return _delegate;
00180 }
00181
00182
00183
00184
00185 - (void)start
00186 {
00187 _isCanceled = NO;
00188
00189 try
00190 {
00191 _HTTPRequest.open([_request HTTPMethod], [[_request URL] absoluteString], YES);
00192
00193 _HTTPRequest.onreadystatechange = function() { [self _readyStateDidChange]; }
00194
00195 var fields = [_request allHTTPHeaderFields],
00196 key = nil,
00197 keys = [fields keyEnumerator];
00198
00199 while (key = [keys nextObject])
00200 _HTTPRequest.setRequestHeader(key, [fields objectForKey:key]);
00201
00202 _HTTPRequest.send([_request HTTPBody]);
00203 }
00204 catch (anException)
00205 {
00206 if ([_delegate respondsToSelector:@selector(connection:didFailWithError:)])
00207 [_delegate connection:self didFailWithError:anException];
00208 }
00209 }
00210
00211
00212
00213
00214 - (void)cancel
00215 {
00216 _isCanceled = YES;
00217
00218 try
00219 {
00220 _HTTPRequest.abort();
00221 }
00222
00223 catch (anException)
00224 {
00225 }
00226 }
00227
00228 - (BOOL)isLocalFileConnection
00229 {
00230 return _isLocalFileConnection;
00231 }
00232
00233
00234 - (void)_readyStateDidChange
00235 {
00236 if (_HTTPRequest.readyState() === CFHTTPRequest.CompleteState)
00237 {
00238 var statusCode = _HTTPRequest.status(),
00239 URL = [_request URL];
00240
00241 if ([_delegate respondsToSelector:@selector(connection:didReceiveResponse:)])
00242 {
00243 if (_isLocalFileConnection)
00244 [_delegate connection:self didReceiveResponse:[[CPURLResponse alloc] initWithURL:URL]];
00245 else
00246 {
00247 var response = [[CPHTTPURLResponse alloc] initWithURL:URL];
00248
00249 [response _setStatusCode:statusCode];
00250
00251 [_delegate connection:self didReceiveResponse:response];
00252 }
00253 }
00254 if (!_isCanceled)
00255 {
00256 if (statusCode === 401 && [CPURLConnectionDelegate respondsToSelector:@selector(connectionDidReceiveAuthenticationChallenge:)])
00257 [CPURLConnectionDelegate connectionDidReceiveAuthenticationChallenge:self];
00258 else
00259 {
00260 if ([_delegate respondsToSelector:@selector(connection:didReceiveData:)])
00261 [_delegate connection:self didReceiveData:_HTTPRequest.responseText()];
00262 if ([_delegate respondsToSelector:@selector(connectionDidFinishLoading:)])
00263 [_delegate connectionDidFinishLoading:self];
00264 }
00265 }
00266 }
00267
00268 [[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode];
00269 }
00270
00271
00272 - (HTTPRequest)_HTTPRequest
00273 {
00274 return _HTTPRequest;
00275 }
00276
00277 @end
00278
00279 @implementation CPURLConnection (Deprecated)
00280
00281 + (CPData)sendSynchronousRequest:(CPURLRequest)aRequest returningResponse:({CPURLResponse})aURLResponse error:(id)anError
00282 {
00283 _CPReportLenientDeprecation(self, _cmd, @selector(sendSynchronousRequest:returningResponse:));
00284
00285 return [self sendSynchronousRequest:aRequest returningResponse:aURLResponse];
00286 }
00287
00288 - (HTTPRequest)_XMLHTTPRequest
00289 {
00290 _CPReportLenientDeprecation(self, _cmd, @selector(_HTTPRequest));
00291
00292 return [self _HTTPRequest];
00293 }
00294
00295 @end