HTTPRequest: fix missing response data for HTTP status codes (closes #1699)
Backends now return error and response data, but public API has not changed. This allows OpenFL to expose URLLoader.data on IOErrorEvent.IO_ERROR to match the behavior of Flash
This commit is contained in:
@@ -117,12 +117,13 @@ class FlashHTTPRequest
|
|||||||
|
|
||||||
urlLoader.addEventListener(IOErrorEvent.IO_ERROR, function(event)
|
urlLoader.addEventListener(IOErrorEvent.IO_ERROR, function(event)
|
||||||
{
|
{
|
||||||
promise.error(event.errorID);
|
var bytes = Bytes.ofData(cast(urlLoader.data, ByteArray));
|
||||||
|
promise.error(new _HTTPRequestErrorResponse(event.errorID, bytes));
|
||||||
});
|
});
|
||||||
|
|
||||||
urlLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, function(event)
|
urlLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, function(event)
|
||||||
{
|
{
|
||||||
promise.error(403);
|
promise.error(new _HTTPRequestErrorResponse(403, null));
|
||||||
});
|
});
|
||||||
|
|
||||||
urlLoader.addEventListener(Event.COMPLETE, function(event)
|
urlLoader.addEventListener(Event.COMPLETE, function(event)
|
||||||
@@ -156,12 +157,13 @@ class FlashHTTPRequest
|
|||||||
|
|
||||||
urlLoader.addEventListener(IOErrorEvent.IO_ERROR, function(event)
|
urlLoader.addEventListener(IOErrorEvent.IO_ERROR, function(event)
|
||||||
{
|
{
|
||||||
promise.error(event.errorID);
|
var responseData = cast(urlLoader.data, String);
|
||||||
|
promise.error(new _HTTPRequestErrorResponse(event.errorID, responseData));
|
||||||
});
|
});
|
||||||
|
|
||||||
urlLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, function(event)
|
urlLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, function(event)
|
||||||
{
|
{
|
||||||
promise.error(403);
|
promise.error(new _HTTPRequestErrorResponse(403, null));
|
||||||
});
|
});
|
||||||
|
|
||||||
urlLoader.addEventListener(Event.COMPLETE, function(event)
|
urlLoader.addEventListener(Event.COMPLETE, function(event)
|
||||||
@@ -172,4 +174,4 @@ class FlashHTTPRequest
|
|||||||
urlLoader.load(urlRequest);
|
urlLoader.load(urlRequest);
|
||||||
return promise.future;
|
return promise.future;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -407,29 +407,28 @@ class HTML5HTTPRequest
|
|||||||
{
|
{
|
||||||
if (request.readyState != 4) return;
|
if (request.readyState != 4) return;
|
||||||
|
|
||||||
|
var bytes = null;
|
||||||
|
if (request.responseType == NONE)
|
||||||
|
{
|
||||||
|
if (request.responseText != null)
|
||||||
|
{
|
||||||
|
bytes = Bytes.ofString(request.responseText);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (request.response != null)
|
||||||
|
{
|
||||||
|
bytes = Bytes.ofData(request.response);
|
||||||
|
}
|
||||||
|
|
||||||
if (request.status != null && ((request.status >= 200 && request.status < 400) || (validStatus0 && request.status == 0)))
|
if (request.status != null && ((request.status >= 200 && request.status < 400) || (validStatus0 && request.status == 0)))
|
||||||
{
|
{
|
||||||
var bytes = null;
|
|
||||||
|
|
||||||
if (request.responseType == NONE)
|
|
||||||
{
|
|
||||||
if (request.responseText != null)
|
|
||||||
{
|
|
||||||
bytes = Bytes.ofString(request.responseText);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (request.response != null)
|
|
||||||
{
|
|
||||||
bytes = Bytes.ofData(request.response);
|
|
||||||
}
|
|
||||||
|
|
||||||
processResponse();
|
processResponse();
|
||||||
promise.complete(bytes);
|
promise.complete(bytes);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
processResponse();
|
processResponse();
|
||||||
promise.error(request.status);
|
promise.error(new _HTTPRequestErrorResponse(request.status, bytes));
|
||||||
}
|
}
|
||||||
|
|
||||||
request = null;
|
request = null;
|
||||||
@@ -482,7 +481,7 @@ class HTML5HTTPRequest
|
|||||||
activeRequests--;
|
activeRequests--;
|
||||||
processQueue();
|
processQueue();
|
||||||
|
|
||||||
promise.error(event.detail);
|
promise.error(new _HTTPRequestErrorResponse(event.detail, null));
|
||||||
}, false);
|
}, false);
|
||||||
|
|
||||||
image.src = uri;
|
image.src = uri;
|
||||||
@@ -505,7 +504,7 @@ class HTML5HTTPRequest
|
|||||||
|
|
||||||
request.onerror = function(event:ErrorEvent)
|
request.onerror = function(event:ErrorEvent)
|
||||||
{
|
{
|
||||||
promise.error(event.message);
|
promise.error(new _HTTPRequestErrorResponse(event.message, null));
|
||||||
}
|
}
|
||||||
|
|
||||||
request.onprogress = function(event:ProgressEvent)
|
request.onprogress = function(event:ProgressEvent)
|
||||||
@@ -542,7 +541,7 @@ class HTML5HTTPRequest
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
processResponse();
|
processResponse();
|
||||||
promise.error(request.status);
|
promise.error(new _HTTPRequestErrorResponse(request.status, request.responseText));
|
||||||
}
|
}
|
||||||
|
|
||||||
request = null;
|
request = null;
|
||||||
|
|||||||
@@ -465,7 +465,7 @@ class NativeHTTPRequest
|
|||||||
private static function localThreadPool_onError(state:{instance:NativeHTTPRequest, promise:Promise<Bytes>, error:String}):Void
|
private static function localThreadPool_onError(state:{instance:NativeHTTPRequest, promise:Promise<Bytes>, error:String}):Void
|
||||||
{
|
{
|
||||||
var promise:Promise<Bytes> = state.promise;
|
var promise:Promise<Bytes> = state.promise;
|
||||||
promise.error(state.error);
|
promise.error(new _HTTPRequestErrorResponse(state.error, null));
|
||||||
|
|
||||||
var instance = state.instance;
|
var instance = state.instance;
|
||||||
|
|
||||||
@@ -576,16 +576,21 @@ class NativeHTTPRequest
|
|||||||
}
|
}
|
||||||
else if (instance.bytes != null)
|
else if (instance.bytes != null)
|
||||||
{
|
{
|
||||||
instance.promise.error(instance.bytes.getString(0, instance.bytes.length));
|
var error = instance.bytes.getString(0, instance.bytes.length);
|
||||||
|
var responseData = instance.buildBuffer();
|
||||||
|
instance.promise.error(new _HTTPRequestErrorResponse(error, responseData));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
instance.promise.error('Status ${state.status}');
|
var error = 'Status ${state.status}';
|
||||||
|
var responseData = instance.buildBuffer();
|
||||||
|
instance.promise.error(new _HTTPRequestErrorResponse(error, responseData));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
instance.promise.error(CURL.strerror(state.result));
|
var error = CURL.strerror(state.result);
|
||||||
|
instance.promise.error(new _HTTPRequestErrorResponse(error, null));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (instance.timeout != null)
|
if (instance.timeout != null)
|
||||||
|
|||||||
@@ -106,7 +106,11 @@ public function load(uri:String = null):Future<T>
|
|||||||
var future = __backend.loadData(this.uri);
|
var future = __backend.loadData(this.uri);
|
||||||
|
|
||||||
future.onProgress(promise.progress);
|
future.onProgress(promise.progress);
|
||||||
future.onError(promise.error);
|
future.onError(function(errorResponse:_HTTPRequestErrorResponse<T>)
|
||||||
|
{
|
||||||
|
responseData = errorResponse.responseData;
|
||||||
|
promise.error(errorResponse.error);
|
||||||
|
});
|
||||||
|
|
||||||
future.onComplete(function(bytes)
|
future.onComplete(function(bytes)
|
||||||
{
|
{
|
||||||
@@ -140,7 +144,11 @@ public function load(uri:String = null):Future<T>
|
|||||||
var future = __backend.loadText(this.uri);
|
var future = __backend.loadText(this.uri);
|
||||||
|
|
||||||
future.onProgress(promise.progress);
|
future.onProgress(promise.progress);
|
||||||
future.onError(promise.error);
|
future.onError(function(errorResponse:_HTTPRequestErrorResponse<T>)
|
||||||
|
{
|
||||||
|
responseData = errorResponse.responseData;
|
||||||
|
promise.error(errorResponse.error);
|
||||||
|
});
|
||||||
|
|
||||||
future.onComplete(function(text)
|
future.onComplete(function(text)
|
||||||
{
|
{
|
||||||
@@ -152,6 +160,15 @@ public function load(uri:String = null):Future<T>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@:noCompletion class _HTTPRequestErrorResponse<T> {
|
||||||
|
public var error:Dynamic;
|
||||||
|
public var responseData:T;
|
||||||
|
public function new(error:Dynamic, responseData:T) {
|
||||||
|
this.error = error;
|
||||||
|
this.responseData = responseData;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@:noCompletion interface _IHTTPRequest
|
@:noCompletion interface _IHTTPRequest
|
||||||
{
|
{
|
||||||
public var contentType:String;
|
public var contentType:String;
|
||||||
|
|||||||
Reference in New Issue
Block a user