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:
Josh Tynjala
2023-08-11 13:42:44 -07:00
parent c16f27818d
commit b6cfc7d812
4 changed files with 52 additions and 29 deletions

View File

@@ -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)

View File

@@ -407,10 +407,7 @@ class HTML5HTTPRequest
{ {
if (request.readyState != 4) return; if (request.readyState != 4) return;
if (request.status != null && ((request.status >= 200 && request.status < 400) || (validStatus0 && request.status == 0)))
{
var bytes = null; var bytes = null;
if (request.responseType == NONE) if (request.responseType == NONE)
{ {
if (request.responseText != null) if (request.responseText != null)
@@ -423,13 +420,15 @@ class HTML5HTTPRequest
bytes = Bytes.ofData(request.response); bytes = Bytes.ofData(request.response);
} }
if (request.status != null && ((request.status >= 200 && request.status < 400) || (validStatus0 && request.status == 0)))
{
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;

View File

@@ -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)

View File

@@ -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;