From b6cfc7d8120401cb09e314ffad98f2bcd7681d60 Mon Sep 17 00:00:00 2001 From: Josh Tynjala Date: Fri, 11 Aug 2023 13:42:44 -0700 Subject: [PATCH] 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 --- .../backend/flash/FlashHTTPRequest.hx | 12 ++++--- .../backend/html5/HTML5HTTPRequest.hx | 35 +++++++++---------- .../backend/native/NativeHTTPRequest.hx | 13 ++++--- src/lime/net/HTTPRequest.hx | 21 +++++++++-- 4 files changed, 52 insertions(+), 29 deletions(-) diff --git a/src/lime/_internal/backend/flash/FlashHTTPRequest.hx b/src/lime/_internal/backend/flash/FlashHTTPRequest.hx index 6c11c209e..67861d810 100644 --- a/src/lime/_internal/backend/flash/FlashHTTPRequest.hx +++ b/src/lime/_internal/backend/flash/FlashHTTPRequest.hx @@ -117,12 +117,13 @@ class FlashHTTPRequest 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) { - promise.error(403); + promise.error(new _HTTPRequestErrorResponse(403, null)); }); urlLoader.addEventListener(Event.COMPLETE, function(event) @@ -156,12 +157,13 @@ class FlashHTTPRequest 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) { - promise.error(403); + promise.error(new _HTTPRequestErrorResponse(403, null)); }); urlLoader.addEventListener(Event.COMPLETE, function(event) @@ -172,4 +174,4 @@ class FlashHTTPRequest urlLoader.load(urlRequest); return promise.future; } -} +} \ No newline at end of file diff --git a/src/lime/_internal/backend/html5/HTML5HTTPRequest.hx b/src/lime/_internal/backend/html5/HTML5HTTPRequest.hx index a45d34c0d..d6f741f3a 100644 --- a/src/lime/_internal/backend/html5/HTML5HTTPRequest.hx +++ b/src/lime/_internal/backend/html5/HTML5HTTPRequest.hx @@ -407,29 +407,28 @@ class HTML5HTTPRequest { 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))) { - 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(); promise.complete(bytes); } else { processResponse(); - promise.error(request.status); + promise.error(new _HTTPRequestErrorResponse(request.status, bytes)); } request = null; @@ -482,7 +481,7 @@ class HTML5HTTPRequest activeRequests--; processQueue(); - promise.error(event.detail); + promise.error(new _HTTPRequestErrorResponse(event.detail, null)); }, false); image.src = uri; @@ -505,7 +504,7 @@ class HTML5HTTPRequest request.onerror = function(event:ErrorEvent) { - promise.error(event.message); + promise.error(new _HTTPRequestErrorResponse(event.message, null)); } request.onprogress = function(event:ProgressEvent) @@ -542,7 +541,7 @@ class HTML5HTTPRequest else { processResponse(); - promise.error(request.status); + promise.error(new _HTTPRequestErrorResponse(request.status, request.responseText)); } request = null; diff --git a/src/lime/_internal/backend/native/NativeHTTPRequest.hx b/src/lime/_internal/backend/native/NativeHTTPRequest.hx index 0236551ec..04b102757 100644 --- a/src/lime/_internal/backend/native/NativeHTTPRequest.hx +++ b/src/lime/_internal/backend/native/NativeHTTPRequest.hx @@ -465,7 +465,7 @@ class NativeHTTPRequest private static function localThreadPool_onError(state:{instance:NativeHTTPRequest, promise:Promise, error:String}):Void { var promise:Promise = state.promise; - promise.error(state.error); + promise.error(new _HTTPRequestErrorResponse(state.error, null)); var instance = state.instance; @@ -576,16 +576,21 @@ class NativeHTTPRequest } 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 { - instance.promise.error('Status ${state.status}'); + var error = 'Status ${state.status}'; + var responseData = instance.buildBuffer(); + instance.promise.error(new _HTTPRequestErrorResponse(error, responseData)); } } 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) diff --git a/src/lime/net/HTTPRequest.hx b/src/lime/net/HTTPRequest.hx index ce5a0eaa7..6627103db 100644 --- a/src/lime/net/HTTPRequest.hx +++ b/src/lime/net/HTTPRequest.hx @@ -106,7 +106,11 @@ public function load(uri:String = null):Future var future = __backend.loadData(this.uri); future.onProgress(promise.progress); - future.onError(promise.error); + future.onError(function(errorResponse:_HTTPRequestErrorResponse) + { + responseData = errorResponse.responseData; + promise.error(errorResponse.error); + }); future.onComplete(function(bytes) { @@ -140,7 +144,11 @@ public function load(uri:String = null):Future var future = __backend.loadText(this.uri); future.onProgress(promise.progress); - future.onError(promise.error); + future.onError(function(errorResponse:_HTTPRequestErrorResponse) + { + responseData = errorResponse.responseData; + promise.error(errorResponse.error); + }); future.onComplete(function(text) { @@ -152,6 +160,15 @@ public function load(uri:String = null):Future } } +@:noCompletion class _HTTPRequestErrorResponse { + public var error:Dynamic; + public var responseData:T; + public function new(error:Dynamic, responseData:T) { + this.error = error; + this.responseData = responseData; + } +} + @:noCompletion interface _IHTTPRequest { public var contentType:String;