[API] erreur sur l'api local alors que api cloud OK

L'utilisation de api.eedomus.com et de l'eedomus toolbox

Re: [API] erreur sur l'api local alors que api cloud OK

Messagepar danardf » 29 Déc 2024 08:27

La différence d'entête est flagrante.

En local:
Code : Tout sélectionner
Date: Sun, 29 Dec 2024 07:21:37 GMT
Server: Apache
Access-Control-Allow-Origin: *
Set-Cookie: PHPSESSID=40ad65b829fece8195c689ed7eda3c61; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Transfer-Encoding: chunked
Content-Type: text/html


Pour le serveur eedomus:

Code : Tout sélectionner
Date: Sun, 29 Dec 2024 07:14:25 GMT
Server: eedomus
Access-Control-Allow-Origin: *
Vary: Accept-Encoding
Content-Length: 46
Content-Type: text/html; charset=ISO-8859-1
danardf
 
Messages : 85
Inscription : 27 Juil 2018

Re: [API] erreur sur l'api local alors que api cloud OK

Messagepar danardf » 29 Déc 2024 09:55

Bon j'ai réussi à palier au problème.
Comme j'utilise un raspberry pi, j'ai créé un proxy pointant sur la box eedomus et reformatant la requête.

Marches à suivre en considérant qu'apache soit déjà installé.

installer les modules apache manquants:
Code : Tout sélectionner
sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod headers
sudo systemctl restart apache2


Créer un virtial host:

Code : Tout sélectionner
sudo nano /etc/apache2/sites-available/eedomus-proxy.conf

<VirtualHost *:8080>
    ServerName eedomus-proxy.local

    # Proxy vers la box EEdomus
    ProxyPreserveHost On
    ProxyPass / http://<IP_DE_LA_BOX>/
    ProxyPassReverse / http://<IP_DE_LA_BOX>/

    # Désactiver Transfer-Encoding: chunked
    Header edit Transfer-Encoding ^(.*)$ ""

    # Gérer les erreurs du serveur local
    SetEnv proxy-sendchunked 0
    SetEnv force-proxy-request-1.0 1
    SetEnv proxy-nokeepalive 1

    ErrorLog ${APACHE_LOG_DIR}/eedomus-proxy-error.log
    CustomLog ${APACHE_LOG_DIR}/eedomus-proxy-access.log combined
</VirtualHost>


Sauvegarder la conf via CTRL + O et CTRL + X

Appliquer la conf;

Code : Tout sélectionner
sudo a2ensite eedomus-proxy.conf
sudo systemctl restart apache2


Activer l'écoute du port 8080:
Code : Tout sélectionner
sudo nano /etc/apache2/ports.conf


Rajouter :
Code : Tout sélectionner
Listen 8080


Appliquer les changements:
Code : Tout sélectionner
sudo systemctl restart apache2


Tester si l'écoute du port 8080 fonctionne:
Code : Tout sélectionner
sudo netstat -tuln | grep 8080


Réponse:
Code : Tout sélectionner
sudo netstat -tuln | grep 8080
tcp6       0      0 :::8080                 :::*                    LISTEN


Sur Node Red, dans chaque nœud HTTP, remplacer l'adresse IP de l'eeddomus par l'adresse ip du proxy:8080

Pour moi ça fonctionne.

ça peut être fastidieux, mais en quelques minutes, on pour retrouver une fonctionnalité normale et certainement plus réactive que le support eedomus.

Bon weekend à tous.
danardf
 
Messages : 85
Inscription : 27 Juil 2018

Re: [API] erreur sur l'api local alors que api cloud OK

Messagepar Clark (eedomus team) » 30 Déc 2024 21:22

Bonjour,

Un utilisateur nous a signalé ce fil dans un ticket.

Il n'y a pas de changement dans le format de l'API côté eedomus. Le serveur Apache/software est différent entre la box et le cloud.
L'API locale eedomus répond avec le header "Transfer-Encoding: chunked" en HTTP 1.1 (et répond sans ce champ en HTTP 1.0), ce qui est une réponse normale.
L'API cloud eedomus répond différemment (avec le champ "Content-Length").

Nodered est assez tatillon sur les formats. Il n'accepte visiblement pas ce header HTTP "chunked" qui semble pourtant bien dans la norme HTTP1.1. Il ne permet pas non plus de choisir la version HTTP (d'anciennes versions de nodered le permettaient a priori).

Nous n'avons pas de contournement immédiat (si ce n'est un proxy sur l'OS de nodered).

Nous le noterons sur ce fil si nous trouvons un contournement de notre côté.

Bien cordialement
Image L'équipe eedomus
http://www.eedomus.com
Clark (eedomus team)
 
Messages : 58
Inscription : 23 Sep 2013

Re: [API] erreur sur l'api local alors que api cloud OK

Messagepar danardf » 31 Déc 2024 08:12

Clark (eedomus team) a écrit:Bonjour,

Un utilisateur nous a signalé ce fil dans un ticket.

Il n'y a pas de changement dans le format de l'API côté eedomus. Le serveur Apache/software est différent entre la box et le cloud.
L'API locale eedomus répond avec le header "Transfer-Encoding: chunked" en HTTP 1.1 (et répond sans ce champ en HTTP 1.0), ce qui est une réponse normale.
L'API cloud eedomus répond différemment (avec le champ "Content-Length").

Nodered est assez tatillon sur les formats. Il n'accepte visiblement pas ce header HTTP "chunked" qui semble pourtant bien dans la norme HTTP1.1. Il ne permet pas non plus de choisir la version HTTP (d'anciennes versions de nodered le permettaient a priori).

Nous n'avons pas de contournement immédiat (si ce n'est un proxy sur l'OS de nodered).

Nous le noterons sur ce fil si nous trouvons un contournement de notre côté.

Bien cordialement


Bien, cette réponse reste inadmissible.
Si le fait de modifier l'entête pour corriger le caractère indésirable qui se trouve dans le header html.
Il est tout à fait possible pour vous de corriger ce soucis.et de monter une maquette Node Red pour tester, ne vous soit pas possible. J'ai un doute.

Par ailleurs, je trouve étonnant de ne pas trouver dans l'entête :
Code : Tout sélectionner
Content-Type: application/json


Ce n'est pas à l'utilisateur final de régler ce type de soucis.
Lorsque que vous affirmer que Node Red n'accepte pas l'entête chunck, c'est faux! Après correction via le proxy, l'entête est toujours présente mais nettoyée.

Copie de l'entête reçue en locale:
Code : Tout sélectionner
Date: Tue, 31 Dec 2024 07:20:25 GMT
Server: Apache
Access-Control-Allow-Origin: *
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Type: text/html
Vary: Accept-Encoding
Transfer-Encoding: chunked


et ho miracle, ça fonctionne même avec chuncked!

Sans proxy, il indique :
Code : Tout sélectionner
msg : error
"RequestError: Parse Error: Invalid character in chunk size"


Donc Invalid character vient bien du fait que vous envoyez un caractère invalide provenant de la box.

Je rajouterais également ceci.
Côté Node Red, j'ai utilisé une autre librairie pour parser le HTML (axio) et il me retourne exactement la même erreur.
danardf
 
Messages : 85
Inscription : 27 Juil 2018

Re: [API] erreur sur l'api local alors que api cloud OK

Messagepar danardf » 31 Déc 2024 09:14

J'ai fait un petit code PHP qui démontre que le chuncked fonctionne bien.
Sauf qu'il faut envoyer le contenu immédiatement.

Code : Tout sélectionner
<?php
header("Date: Tue, 31 Dec 2024 07:20:25 GMT");
header("Server: Apache");
header("Access-Control-Allow-Origin: *");
header("Expires: Thu, 19 Nov 1981 08:52:00 GMT");
header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0");
header("Pragma: no-cache");
header("Content-Type: text/html");
header("Vary: Accept-Encoding");
header("Transfer-Encoding: chunked");

$chunked_response = [
    '{"success": 1,',
    '"body": {',
    '"last_value": 20.24}}'
];

foreach ($chunked_response as $chunk) {
    $length = dechex(strlen($chunk));
    echo "{$length}\r\n{$chunk}\r\n";
}

echo "0\r\n\r\n";
flush();
?>


Sans flush(), le problème apparaît.
Avec flush(); le problème disparaît.
Bonne pratique pour le mode chunked serait celle-ci:
Avec un Transfer-Encoding: chunked, toujours appeler flush() après avoir envoyé chaque chunk, pour garantir que les données arrivent dans l'ordre attendu.
danardf
 
Messages : 85
Inscription : 27 Juil 2018

Précédent

Retour vers API eedomus & eedomus toolbox

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 11 invité(s)