capacitor-community / http

Community plugin for native HTTP
MIT License
208 stars 135 forks source link

HTTP Get not handling connection errors properly #232

Open nickredding opened 2 years ago

nickredding commented 2 years ago

Describe the bug When a call to HTTP Get results in a connection error (e.g. "ConnectException") the routine Capacitor.fromNative traps trying to invoke

new Capacitor.Exception('')

which does not exist. As a result neither the resolve nor the reject functions of the promise are invoked.

To Reproduce Steps to reproduce the behavior: run the following code

Capacitor.Plugins.Http.get({url: 'https://www.nonexistant.com'}). then( function(response) { console.log('Success:', response.data); }, function (err) { console.log('Error:', err); });

The console displays:

(index):218 native Http.get (#64819015) undefined (index):192 result Http.get (#64819015) (index):200 {message: 'ConnectException'} (anonymous) @ (index):200 cap.fromNative @ (index):400 (anonymous) @ VM24:1 (index):446 TypeError: cap.Exception is not a constructor at Object.cap.fromNative ((index):413:32) at :1:18

Expected behavior The reject routine should be invoked.

Setting Capacitor.Exception = function(){ return {message:''}; }; enables the correct response.

native Http.get (#51752015) undefined (index):192 result Http.get (#51752015) testhttp.js:103 Error: {message: 'ConnectException'}

Smartphone (please complete the following information):

Additional context It occurs to me that this might be an attempt to provide an exception traceback, but this is of no use if the reject routine of the promise is never invoked.

matonga commented 2 years ago

This should be fixed upstream. Find:

@capacitor/android/capacitor/src/main/assets/native-bridge.js

inside your node_modules.

Scroll down to:

    function initNativeBridge(win) {
        const cap = win.Capacitor || {};

And add this line:

        if (!cap.Exception) cap.Exception = Error;

Now it should look like this:

    (...)
    function initNativeBridge(win) {
        const cap = win.Capacitor || {};
        if (!cap.Exception) cap.Exception = Error;
    (...)

Remember to do npx cap sync after that (just in case, don't know if needed). Then rebuild.