From patrice.karatchentzeff at gmail.com Thu Jun 1 09:17:31 2023 From: patrice.karatchentzeff at gmail.com (Patrice Karatchentzeff) Date: Thu, 1 Jun 2023 09:17:31 +0200 Subject: [Perl] Auth0 et Dancer2 Message-ID: Salut, Je développe une application avec un front-end en native React et un back-end en perl Dancer2. J'ai un peu de mal à utiliser l'authentification côté Dancer2. J'ai facilement mis en place une authentification par login et mot de passe, côté Dancer2. Je ne sais pas comment l'utiliser simplement côté React. Manifestement, c'est assez simple, quand on utilise un truc plus gros, comme l'auth0 côté serveur. Le problème est qu'il semble y avoir des modules *client* pour Dancer2, mais pas des modules serveur (ou j'ai mal cherché... ou mal compris). Quelqu'un a une idée comment je dois m'y prendre ? Merci PK -- |\ _,,,---,,_ Patrice KARATCHENTZEFF ZZZzz /,`.-'`' -. ;-;;,_ mailto:patrice.karatchentzeff at gmail.com |,4- ) )-,_. ,\ ( `'-' '---''(_/--' `-'\_) From sebastien at feugere.net Thu Jun 1 13:59:02 2023 From: sebastien at feugere.net (=?utf-8?Q?S=C3=A9bastien_Feug=C3=A8re?=) Date: Thu, 1 Jun 2023 13:59:02 +0200 Subject: [Perl] Auth0 et Dancer2 In-Reply-To: References: Message-ID: Une pièce jointe HTML a été nettoyée... URL: -------------- section suivante -------------- Une pièce jointe autre que texte a été nettoyée... Nom: apple-touch-icon.png Type: image/png Taille: 10523 octets Desc: non disponible URL: From paul.gaborit at gmail.com Fri Jun 2 18:23:22 2023 From: paul.gaborit at gmail.com (Paul Gaborit) Date: Fri, 2 Jun 2023 18:23:22 +0200 Subject: [Perl] Auth0 et Dancer2 In-Reply-To: References: Message-ID: <48f353d8-01b5-08ca-7fab-b6a8b3e1c8bc@gmail.com> Le 01/06/2023 à 09:17, Patrice Karatchentzeff a écrit : > Salut, Bonjour, > Je développe une application avec un front-end en native React et un > back-end en perl Dancer2. J'ai un peu de mal à utiliser > l'authentification côté Dancer2. > > J'ai facilement mis en place une authentification par login et mot de > passe, côté Dancer2. Je ne sais pas comment l'utiliser simplement côté > React. Heu... Les deux paragraphes semblent un peu contradictoires: facile ou pas l'authentification côté Dancer2 ? Par ailleurs, "l'authentification" côté client (donc React) n'a pas vraiment de sens. Le contrôle d'accès aux ressources ne peut se faire que côté serveur. Bref, la demande n'étant pas claire... il est difficile de donner une réponse. ;-) Cordialement, -- Paul Gaborit From patrice.karatchentzeff at gmail.com Fri Jun 2 18:43:13 2023 From: patrice.karatchentzeff at gmail.com (Patrice Karatchentzeff) Date: Fri, 2 Jun 2023 18:43:13 +0200 Subject: [Perl] Auth0 et Dancer2 In-Reply-To: <48f353d8-01b5-08ca-7fab-b6a8b3e1c8bc@gmail.com> References: <48f353d8-01b5-08ca-7fab-b6a8b3e1c8bc@gmail.com> Message-ID: Alors, je reformule... J'ai mis en place une authentification (facilement) côté Dancer2 à base de login/mot de passe. Pour le moment, le login/mot de passe est dans le code, mais ça me suffit pour le moment. Je voudrais utiliser facilement cela pour m'authentifier côté React Native. Je n'ai pas trouvé de module proposant/basé sur une bête authentification côté serveur à base de login/mot de passe. Du coup, il faut tout coder à la main, alors que si j'avais une authentification assez avancée (de type auth0 par exemple), ce serait plus simple, car il y a des modules ad hoc (même si cela reste assez complexe). J'ai trouvé un module côté Dancer2 pour simuler un serveur Auth0, mais pour le moment, j'aimerais rester dans du simple. Le truc est un POC, et je ne voudrais pas m'embarquer dans des trucs trop compliqués... Merci PK Le ven. 2 juin 2023 à 18:23, Paul Gaborit a écrit : > > Le 01/06/2023 à 09:17, Patrice Karatchentzeff a écrit : > > Salut, > > Bonjour, > > > Je développe une application avec un front-end en native React et un > > back-end en perl Dancer2. J'ai un peu de mal à utiliser > > l'authentification côté Dancer2. > > > > J'ai facilement mis en place une authentification par login et mot de > > passe, côté Dancer2. Je ne sais pas comment l'utiliser simplement côté > > React. > > Heu... Les deux paragraphes semblent un peu contradictoires: facile ou > pas l'authentification côté Dancer2 ? > > Par ailleurs, "l'authentification" côté client (donc React) n'a pas > vraiment de sens. Le contrôle d'accès aux ressources ne peut se faire > que côté serveur. > > Bref, la demande n'étant pas claire... il est difficile de donner une > réponse. ;-) > > > Cordialement, > -- > Paul Gaborit > > _______________________________________________ > Perl mailing list > Perl at mongueurs.net > http://listes.mongueurs.net/mailman/listinfo/perl > Attention, les archives sont publiques -- |\ _,,,---,,_ Patrice KARATCHENTZEFF ZZZzz /,`.-'`' -. ;-;;,_ mailto:patrice.karatchentzeff at gmail.com |,4- ) )-,_. ,\ ( `'-' '---''(_/--' `-'\_) From patrice.karatchentzeff at gmail.com Mon Jun 5 09:52:04 2023 From: patrice.karatchentzeff at gmail.com (Patrice Karatchentzeff) Date: Mon, 5 Jun 2023 09:52:04 +0200 Subject: [Perl] CORS et Dancer2 Message-ID: Salut, J'ai un truc bizarre avec Dancer2. J'ai besoin d'autoriser CORS et pour le dév, je le mets à tout le monde (*) pour ne pas me prendre la tête. Dancer2 est pour le back-end et j'ai un front-end en javascript (React Native)/ Le plus simple est de faire un hook avant une route : hook 'before' => sub { response_header 'Access-Control-Allow-Origin' => '*'; }; Si je veux lire un JSON sur le serveur (GET), ça fonctionne. get '/message' => sub { my @data = ( { id => 1, username => 42, name => 100234, email => [qw(one two three)], }, { id => 2, username => "toto", name => "SiSi", email => [qw(4 5 6)], }, ); send_as JSON => \@data; }; Si je veux en envoyer un (POST), le débogueur m'indique que la requête est interdite, parce que CORS n'est pas actif ! get '/login' => sub { my $post = from_json( request->body ); print $post; }; J'ai essayé de généraliser avec Plack : use Plack::Builder; builder { enable 'CrossOrigin', origins => '*'; dance; }; Mais ça ne fonctionne pas mieux :( Est-ce que vous avez une piste pour me dépanner ? Merci PK -- |\ _,,,---,,_ Patrice KARATCHENTZEFF ZZZzz /,`.-'`' -. ;-;;,_ mailto:patrice.karatchentzeff at gmail.com |,4- ) )-,_. ,\ ( `'-' '---''(_/--' `-'\_) From patrice.karatchentzeff at gmail.com Mon Jun 5 13:43:51 2023 From: patrice.karatchentzeff at gmail.com (Patrice Karatchentzeff) Date: Mon, 5 Jun 2023 13:43:51 +0200 Subject: [Perl] CORS et Dancer2 In-Reply-To: References: Message-ID: Bon, j'ai viré le problème en réussissant à désactiver CORS dans la requête de départ en javascript. Mais le problème demeure... Et j'avais une erreur stupide : get '/login' => sub { my $post = from_json( request->body ); print $post; }; C'est un post et pas un get :( PK Le lun. 5 juin 2023 à 09:52, Patrice Karatchentzeff a écrit : > > Salut, > > J'ai un truc bizarre avec Dancer2. J'ai besoin d'autoriser CORS et > pour le dév, je le mets à tout le monde (*) pour ne pas me prendre la > tête. Dancer2 est pour le back-end et j'ai un front-end en javascript > (React Native)/ > > Le plus simple est de faire un hook avant une route : > > hook 'before' => sub { > response_header 'Access-Control-Allow-Origin' => '*'; > }; > > Si je veux lire un JSON sur le serveur (GET), ça fonctionne. > > get '/message' => sub { > my @data = ( { > id => 1, > username => 42, > name => 100234, > email => [qw(one two three)], > }, > { > id => 2, > username => "toto", > name => "SiSi", > email => [qw(4 5 6)], > }, > ); > send_as JSON => \@data; > }; > > Si je veux en envoyer un (POST), le débogueur m'indique que la requête > est interdite, parce que CORS n'est pas actif ! > > get '/login' => sub { > my $post = from_json( request->body ); > print $post; > }; > > J'ai essayé de généraliser avec Plack : > > use Plack::Builder; > > builder { > enable 'CrossOrigin', origins => '*'; > dance; > }; > > Mais ça ne fonctionne pas mieux :( > > Est-ce que vous avez une piste pour me dépanner ? > > Merci > > PK > > -- > |\ _,,,---,,_ Patrice KARATCHENTZEFF > ZZZzz /,`.-'`' -. ;-;;,_ mailto:patrice.karatchentzeff at gmail.com > |,4- ) )-,_. ,\ ( `'-' > '---''(_/--' `-'\_) -- |\ _,,,---,,_ Patrice KARATCHENTZEFF ZZZzz /,`.-'`' -. ;-;;,_ mailto:patrice.karatchentzeff at gmail.com |,4- ) )-,_. ,\ ( `'-' '---''(_/--' `-'\_) From sebastien at feugere.net Mon Jun 5 13:57:24 2023 From: sebastien at feugere.net (=?utf-8?Q?S=C3=A9bastien_Feug=C3=A8re?=) Date: Mon, 5 Jun 2023 13:57:24 +0200 Subject: [Perl] CORS et Dancer2 In-Reply-To: References: Message-ID: <8DD3DC6E-E6E4-4B95-A021-617F7D932454@feugere.net> Une pièce jointe HTML a été nettoyée... URL: -------------- section suivante -------------- Une pièce jointe autre que texte a été nettoyée... Nom: apple-touch-icon.png Type: image/png Taille: 10523 octets Desc: non disponible URL: From patrice.karatchentzeff at gmail.com Mon Jun 5 20:01:27 2023 From: patrice.karatchentzeff at gmail.com (Patrice Karatchentzeff) Date: Mon, 5 Jun 2023 20:01:27 +0200 Subject: [Perl] CORS et Dancer2 In-Reply-To: <8DD3DC6E-E6E4-4B95-A021-617F7D932454@feugere.net> References: <8DD3DC6E-E6E4-4B95-A021-617F7D932454@feugere.net> Message-ID: Merci. Je l'avais vu, mais comme il est taggué Dancer et non Dancer2, je pense qu'il ne conviendra pas. Merci PK Le lun. 5 juin 2023 à 13:57, Sébastien Feugère a écrit : > Il faudra sûrement résoudre le problème à la base pour passer le site en > production. Je recommanderais l?utilisation d?un plug-in Dancer qui permet > d?activer CORS sur toutes les routes souhaitées: > > Dancer::Plugin::CORS::Sharing > > metacpan.org > [image: apple-touch-icon.png] > > > > > Sébastien Feugère > > Le 5 juin 2023 à 13:44, Patrice Karatchentzeff < > patrice.karatchentzeff at gmail.com> a écrit : > > ?Bon, j'ai viré le problème en réussissant à désactiver CORS dans la > requête de départ en javascript. Mais le problème demeure... > > Et j'avais une erreur stupide : > > get '/login' => sub { > my $post = from_json( request->body ); > print $post; > }; > > C'est un post et pas un get :( > > PK > > Le lun. 5 juin 2023 à 09:52, Patrice Karatchentzeff > a écrit : > > > Salut, > > > J'ai un truc bizarre avec Dancer2. J'ai besoin d'autoriser CORS et > > pour le dév, je le mets à tout le monde (*) pour ne pas me prendre la > > tête. Dancer2 est pour le back-end et j'ai un front-end en javascript > > (React Native)/ > > > Le plus simple est de faire un hook avant une route : > > > hook 'before' => sub { > > response_header 'Access-Control-Allow-Origin' => '*'; > > }; > > > Si je veux lire un JSON sur le serveur (GET), ça fonctionne. > > > get '/message' => sub { > > my @data = ( { > > id => 1, > > username => 42, > > name => 100234, > > email => [qw(one two three)], > > }, > > { > > id => 2, > > username => "toto", > > name => "SiSi", > > email => [qw(4 5 6)], > > }, > > ); > > send_as JSON => \@data; > > }; > > > Si je veux en envoyer un (POST), le débogueur m'indique que la requête > > est interdite, parce que CORS n'est pas actif ! > > > get '/login' => sub { > > my $post = from_json( request->body ); > > print $post; > > }; > > > J'ai essayé de généraliser avec Plack : > > > use Plack::Builder; > > > builder { > > enable 'CrossOrigin', origins => '*'; > > dance; > > }; > > > Mais ça ne fonctionne pas mieux :( > > > Est-ce que vous avez une piste pour me dépanner ? > > > Merci > > > PK > > > -- > > |\ _,,,---,,_ Patrice KARATCHENTZEFF > > ZZZzz /,`.-'`' -. ;-;;,_ mailto:patrice.karatchentzeff at gmail.com > > |,4- ) )-,_. ,\ ( `'-' > > '---''(_/--' `-'\_) > > > > > -- > |\ _,,,---,,_ Patrice KARATCHENTZEFF > ZZZzz /,`.-'`' -. ;-;;,_ mailto:patrice.karatchentzeff at gmail.com > |,4- ) )-,_. ,\ ( `'-' > '---''(_/--' `-'\_) > _______________________________________________ > Perl mailing list > Perl at mongueurs.net > http://listes.mongueurs.net/mailman/listinfo/perl > Attention, les archives sont publiques > > _______________________________________________ > Perl mailing list > Perl at mongueurs.net > http://listes.mongueurs.net/mailman/listinfo/perl > Attention, les archives sont publiques -- |\ _,,,---,,_ Patrice KARATCHENTZEFF ZZZzz /,`.-'`' -. ;-;;,_ mailto:patrice.karatchentzeff at gmail.com |,4- ) )-,_. ,\ ( `'-' '---''(_/--' `-'\_) -------------- section suivante -------------- Une pièce jointe HTML a été nettoyée... URL: -------------- section suivante -------------- Une pièce jointe autre que texte a été nettoyée... Nom: apple-touch-icon.png Type: image/png Taille: 10523 octets Desc: non disponible URL: From patrice.karatchentzeff at gmail.com Thu Jun 8 09:10:25 2023 From: patrice.karatchentzeff at gmail.com (Patrice Karatchentzeff) Date: Thu, 8 Jun 2023 09:10:25 +0200 Subject: [Perl] Dancer2 et Native React Message-ID: Salut, Je poste ici, un peu en désespoir de cause... J'ai isolé mon problème, donc ce sera plus facile. Je cherche à me connecter à un back-end Dancer2 avec un simple login+mot de passe depuis une appli en Native React. Tout est hard-codé pour plus de simplicité. Je poste une requête json (login+mot de passe) et le serveur répond en json (connecté ou pas connecté selon la valeur de la requête initiale). J'ai un résultat bizarre. Je n'arrive pas à incriminer exactement le responsable. Ça marchotte avec Firefox, mais foire avec Chrome. Le problème identifié : la valeur de retour du json (donc côté Dancer2) serait mal formattée. Firefox gueule, mais récupère le json pourtant correctement. Chrome ne négocie rien du tout et s'arrête en cours. Voici le code isolé en react native (désolé, GMail ne veut pas d'attaché en javascript) : % cat App.js import React, { useState, useEffect } from 'react'; import { View, Text, } from 'react-native'; const ipAddress = "192.168.1.103"; const portAddress ="5000"; const httpProtocol = "http"; const uriBase = httpProtocol + "://" + ipAddress + ":" + portAddress ; function App() { const jsonReader = { 'login':"PK", 'password':"PK" }; let string = JSON.stringify(jsonReader); const [message, setMessage] = useState("disconnected"); const submitConnectAsync2 = async () => { return fetch( uriBase + '/connect', { //'http://jsonplaceholder.typicode.com/posts', { mode: 'no-cors', // beurk... method: 'POST', headers: { 'Accept' : 'application/json', 'Content-Type' : 'application/json', }, body: JSON.stringify(jsonReader), }) .then( (response) => { //response.text(); response.json(); //console.log("Response:", response.text()); console.log("Response:", response.json()); console.log("Fin de l'envoi"); }) .then(text => { console.log(`Received ${JSON.stringify(text)}`); console.log("text :", text); //let json = JSON.parse(text); //setMessage(json); console.log("Coucou2"); }) .then( (json) => { setMessage("Connecté à la main"); console.log("(1) connection state:", message); console.log("Fin de la réception"); }) .catch( error => { console.log("Transaction error:", error); //console.log("body:", JSON.stringify(jsonReader)); //console.log("response:", response.son()); //console.log("json:", json); }); }; console.log("(2) connection state:", message); useEffect(() => { submitConnectAsync2(); }, []); return ( {message} ); } export default App; Voici le code côté Dancer2 : % cat server.pm package server; use Dancer2; set session => "Simple"; set serializer => 'JSON'; hook 'before' => sub { response_header 'Access-Control-Allow-Origin' => '*'; }; post '/connect' => sub { my $post = from_json( request->body ); debug request->body; my $login = params('body')->{login}; my $password = params('body')->{password}; debug "\t\t login : $login password : $password"; if ( ($login eq 'PK') && ($password eq 'PK') ) { # nothing possible to add after sending a request debug "\t\t Valid login and password : state connected\n"; session user => $login; debug "\t\t", ({"ConnectionState" => "connected"}); my %state = ( ConnectionState => "connected" ); debug "\t\t", %state; #send_as JSON => ({"ConnectionState" => "connected"}); send_as JSON => \%state; } else { debug "\t\t Invalid login and password : state unconnected\n"; debug "\t\t", ({"ConnectionState" => "unconnected"}); send_as JSON => ({"ConnectionState" => "unconnected"}); }; }; true; (le hook ne sert à rien, puisque je désactive le CORS dans l'envoi) Il faut aussi ajouter dans le fichier de conf % cat config.yml logger: Console engines: logger: Console: log_level: core pour activer les debug, sinon remplacer par des print perl suffit. Le serveur « semble » fonctionner correctement : % curl --header "Content-Type: application/json" \ --request POST \ --data '{"login":"PK","password":"PK"}' \ http://localhost:5000/connect {"ConnectionState":"connected"} % curl --header "Content-Type: application/json" --request POST --data '{"login":"PK","password":""}' http://localhost:5000/connect {"ConnectionState":"unconnected"} % curl --header "Content-Type: application/json" --request POST http://localhost:5000/connect {"ConnectionState":"unconnected"} % curl http://localhost:5000/connect {"status":404,"title":"Error 404 - Not Found","message":"/connect"} % curl --header "Content-Type: application/json" --request POST http://localhost:5000/connect {"ConnectionState":"unconnected"} Le débogueur de Firefox gueule sur le retour de json : 08:44:52,153 (2) connection state: disconnected App.js:58 08:44:52,407 Response: Promise { : "pending" } App.js:36 08:44:52,408 Fin de l'envoi App.js:37 08:44:52,408 Received undefined App.js:40 08:44:52,408 text : undefined App.js:41 08:44:52,408 Coucou2 App.js:44 08:44:52,409 (1) connection state: disconnected App.js:48 08:44:52,409 Fin de la réception App.js:49 08:44:52,409 (2) connection state: Connecté à la main App.js:58 08:44:52,413 Uncaught (in promise) SyntaxError: JSON.parse: unexpected end of data at line 1 column 1 of the JSON data La promesse n'est pas tenue, le response.json semble mal formaté. Pourtant, dans l'onglet Réseau, j'ai bien la négociation correcte et il lit correctement la réponse ! Ça fonctionne en changeant les valeurs des logins/mot de passe. Le log de Dancer2 est en phase : tout semble se passer correctement... sauf que je ne peux pas récupérer en interne la valeur de response.json comme le montre la sortie console de FF. L'erreur est donc « exacte » si je puis m'exprimer ainsi. Chrome est plus brutal. (2) connection state: disconnected App.js:36 Response: Promise {: SyntaxError: Unexpected end of input at http://localhost:19006/static/js/bundle.js:54:43} App.js:37 Fin de l'envoi App.js:40 Received undefined App.js:41 text : undefined App.js:44 Coucou2 App.js:48 (1) connection state: disconnected App.js:49 Fin de la réception App.js:58 (2) connection state: Connecté à la main App.js:34 Uncaught (in promise) SyntaxError: Unexpected end of input (at App.js:34:1) at App.js:34:1 App.js:36 Uncaught (in promise) SyntaxError: Unexpected end of input (at App.js:36:1) at App.js:36:1 et il y a plus logiquement aucun échange dans l'onglet Réseau. Dancer2 renvoie alors bien un 404. Je nage complètement. Le code native semble correct et a l'air de fonctionner chez les autres. J'ai réinstallé node/nvm/native... et Dancer2 semble fonctionner correctement. J'ai même essayé avec un serveur en ligne, sans plus de succès, ce qui me laisse penser que Dancer2 n'est pas en cause. J'ai aussi essayé toutes les versions de nvm :( Bref, je ne sais plus qui incriminer, à part moi ! Un ?il neuf serait aussi bienvenu qu'un conseil... Merci PK PS : pour installer mon exemple en native : % npx install expo-cli % npx create-expo-app App % cd App Remplacer App.js par mon exemple % nps expo install react-dom react-native-web @expo/webpack-config % npx expo start -- -c taper w pour le serveur Changer la valeur des IP pour adapter à votre réseau ! -- |\ _,,,---,,_ Patrice KARATCHENTZEFF ZZZzz /,`.-'`' -. ;-;;,_ mailto:patrice.karatchentzeff at gmail.com |,4- ) )-,_. ,\ ( `'-' '---''(_/--' `-'\_) From sebastien at feugere.net Thu Jun 8 21:46:56 2023 From: sebastien at feugere.net (=?UTF-8?Q?S=c3=a9bastien_Feug=c3=a8re?=) Date: Thu, 8 Jun 2023 21:46:56 +0200 Subject: [Perl] Dancer2 et Native React In-Reply-To: References: Message-ID: <1fe728e2-6620-cdc3-c893-6f994855acd9@feugere.net> Les messages d'erreur de Firefox et de Chrome semblent indiquer que les navigateurs essaient de parser du JSON qui n'en est pas, ou qui n'est pas valide... Peut être une page 404 ? J'ai mis la même route dans une application Dancer crée avec le générateur par défaut. params('body')->{login}; params('body')->{password}; sont tous les deux undef, car dans cette situation, params('body') retourne un hash vide... Je ne vois pas comment ce code peut fonctionner avec cURL. Donc dans une application React, encore moins. my $post = from_json( request->body ); my $login = $post->{login}; my $password = $post->{password}; Avec ceci, j'ai pu me "connecter" avec cURL, pas de soucis et le JSON est bien valide,  en utilisant : curl --header "Content-Type: application/json"   --request POST   --data '{"login":"PK","password":"PK"}' http://localhost:5000/connect En espérant que cela puisse aider... On 08/06/2023 09:10, Patrice Karatchentzeff wrote: > Salut, > > Je poste ici, un peu en désespoir de cause... > > J'ai isolé mon problème, donc ce sera plus facile. Je cherche à me > connecter à un back-end Dancer2 avec un simple login+mot de passe > depuis une appli en Native React. Tout est hard-codé pour plus de > simplicité. Je poste une requête json (login+mot de passe) et le > serveur répond en json (connecté ou pas connecté selon la valeur de la > requête initiale). > > J'ai un résultat bizarre. Je n'arrive pas à incriminer exactement le > responsable. Ça marchotte avec Firefox, mais foire avec Chrome. > > Le problème identifié : la valeur de retour du json (donc côté > Dancer2) serait mal formattée. Firefox gueule, mais récupère le json > pourtant correctement. Chrome ne négocie rien du tout et s'arrête en > cours. > > Voici le code isolé en react native (désolé, GMail ne veut pas > d'attaché en javascript) : > > % cat App.js > import React, { useState, useEffect } from 'react'; > import { > View, > Text, > } from 'react-native'; > > const ipAddress = "192.168.1.103"; > const portAddress ="5000"; > const httpProtocol = "http"; > const uriBase = httpProtocol + "://" + ipAddress + ":" + portAddress ; > > > function App() { > > const jsonReader = { 'login':"PK", 'password':"PK" }; > let string = JSON.stringify(jsonReader); > > const [message, setMessage] = useState("disconnected"); > > const submitConnectAsync2 = async () => { > return fetch( > uriBase + '/connect', { > //'http://jsonplaceholder.typicode.com/posts', { > mode: 'no-cors', // beurk... > method: 'POST', > headers: { > 'Accept' : 'application/json', > 'Content-Type' : 'application/json', > }, > body: JSON.stringify(jsonReader), > }) > .then( (response) => { > //response.text(); > response.json(); > //console.log("Response:", response.text()); > console.log("Response:", response.json()); > console.log("Fin de l'envoi"); > }) > .then(text => { > console.log(`Received ${JSON.stringify(text)}`); > console.log("text :", text); > //let json = JSON.parse(text); > //setMessage(json); > console.log("Coucou2"); > }) > .then( (json) => { > setMessage("Connecté à la main"); > console.log("(1) connection state:", message); > console.log("Fin de la réception"); > }) > .catch( error => { > console.log("Transaction error:", error); > //console.log("body:", JSON.stringify(jsonReader)); > //console.log("response:", response.son()); > //console.log("json:", json); > }); > }; > console.log("(2) connection state:", message); > > useEffect(() => { > submitConnectAsync2(); > }, []); > > > return ( > > > {message} > > > ); > > > } > > export default App; > > Voici le code côté Dancer2 : > > % cat server.pm > package server; > use Dancer2; > > set session => "Simple"; > set serializer => 'JSON'; > > hook 'before' => sub { > response_header 'Access-Control-Allow-Origin' => '*'; > }; > > post '/connect' => sub { > my $post = from_json( request->body ); > debug request->body; > my $login = params('body')->{login}; > my $password = params('body')->{password}; > debug "\t\t login : $login password : $password"; > if ( ($login eq 'PK') && ($password eq 'PK') ) { > # nothing possible to add after sending a request > debug "\t\t Valid login and password : state connected\n"; > session user => $login; > debug "\t\t", ({"ConnectionState" => "connected"}); > my %state = ( ConnectionState => "connected" ); > debug "\t\t", %state; > #send_as JSON => ({"ConnectionState" => "connected"}); > send_as JSON => \%state; > } > else { > debug "\t\t Invalid login and password : state unconnected\n"; > debug "\t\t", ({"ConnectionState" => "unconnected"}); > send_as JSON => ({"ConnectionState" => "unconnected"}); > }; > }; > > true; > > (le hook ne sert à rien, puisque je désactive le CORS dans l'envoi) > Il faut aussi ajouter dans le fichier de conf > > % cat config.yml > logger: Console > > engines: > logger: > Console: > log_level: core > > pour activer les debug, sinon remplacer par des print perl suffit. > > Le serveur « semble » fonctionner correctement : > > % curl --header "Content-Type: application/json" \ > --request POST \ > --data '{"login":"PK","password":"PK"}' \ > http://localhost:5000/connect > {"ConnectionState":"connected"} > > % curl --header "Content-Type: application/json" --request POST --data > '{"login":"PK","password":""}'http://localhost:5000/connect > {"ConnectionState":"unconnected"} > > % curl --header "Content-Type: application/json" --request POST > http://localhost:5000/connect > {"ConnectionState":"unconnected"} > > % curlhttp://localhost:5000/connect > {"status":404,"title":"Error 404 - Not Found","message":"/connect"} > > % curl --header "Content-Type: application/json" --request POST > http://localhost:5000/connect > {"ConnectionState":"unconnected"} > > Le débogueur de Firefox gueule sur le retour de json : > > 08:44:52,153 (2) connection state: disconnected App.js:58 > 08:44:52,407 Response: > Promise { : "pending" } > App.js:36 > 08:44:52,408 Fin de l'envoi App.js:37 > 08:44:52,408 Received undefined App.js:40 > 08:44:52,408 text : undefined App.js:41 > 08:44:52,408 Coucou2 App.js:44 > 08:44:52,409 (1) connection state: disconnected App.js:48 > 08:44:52,409 Fin de la réception App.js:49 > 08:44:52,409 (2) connection state: Connecté à la main App.js:58 > 08:44:52,413 Uncaught (in promise) SyntaxError: JSON.parse: unexpected > end of data at line 1 column 1 of the JSON data > > La promesse n'est pas tenue, le response.json semble mal formaté. > Pourtant, dans l'onglet Réseau, j'ai bien la négociation correcte et > il lit correctement la réponse ! Ça fonctionne en changeant les > valeurs des logins/mot de passe. > > Le log de Dancer2 est en phase : tout semble se passer correctement... > sauf que je ne peux pas récupérer en interne la valeur de > response.json comme le montre la sortie console de FF. L'erreur est > donc « exacte » si je puis m'exprimer ainsi. > > Chrome est plus brutal. > > (2) connection state: disconnected > App.js:36 Response: Promise {: SyntaxError: Unexpected end of input > athttp://localhost:19006/static/js/bundle.js:54:43} > App.js:37 Fin de l'envoi > App.js:40 Received undefined > App.js:41 text : undefined > App.js:44 Coucou2 > App.js:48 (1) connection state: disconnected > App.js:49 Fin de la réception > App.js:58 (2) connection state: Connecté à la main > App.js:34 Uncaught (in promise) SyntaxError: Unexpected end of input > (at App.js:34:1) > at App.js:34:1 > App.js:36 Uncaught (in promise) SyntaxError: Unexpected end of input > (at App.js:36:1) > at App.js:36:1 > > et il y a plus logiquement aucun échange dans l'onglet Réseau. Dancer2 > renvoie alors bien un 404. > > Je nage complètement. Le code native semble correct et a l'air de > fonctionner chez les autres. J'ai réinstallé node/nvm/native... et > Dancer2 semble fonctionner correctement. J'ai même essayé avec un > serveur en ligne, sans plus de succès, ce qui me laisse penser que > Dancer2 n'est pas en cause. J'ai aussi essayé toutes les versions de > nvm :( > > Bref, je ne sais plus qui incriminer, à part moi ! > > Un ?il neuf serait aussi bienvenu qu'un conseil... > > Merci > > PK > > > PS : pour installer mon exemple en native : > > % npx install expo-cli > % npx create-expo-app App > % cd App > Remplacer App.js par mon exemple > % nps expo install react-dom react-native-web @expo/webpack-config > % npx expo start -- -c > taper w pour le serveur > > Changer la valeur des IP pour adapter à votre réseau ! > -- Sébastien Feugère -------------- section suivante -------------- Une pièce jointe HTML a été nettoyée... URL: From patrice.karatchentzeff at gmail.com Fri Jun 9 06:25:54 2023 From: patrice.karatchentzeff at gmail.com (Patrice Karatchentzeff) Date: Fri, 9 Jun 2023 06:25:54 +0200 Subject: [Perl] Dancer2 et Native React In-Reply-To: <1fe728e2-6620-cdc3-c893-6f994855acd9@feugere.net> References: <1fe728e2-6620-cdc3-c893-6f994855acd9@feugere.net> Message-ID: Merci de ta réponse. Je ne me souviens plus d'où j'ai récupéré ce code, mais je crois qu'il est dans la doc officielle de Dancer2. Avec ta modif, j'ai exactement le même comportement, sauf que cela ajoute une erreur côté Dancer en cas de chaîne vide : % curl --header "Content-Type: application/json" --request POST http://localhost:5000/connect {"title":"Error 500 - Internal Server Error","status":500,"exception":"Can't use string (\"\") as a HASH ref while \"strict refs\" in use at... confirmée dans les logs : [xx:704249] error @2023-06-09 06:21:38> Route exception: Can't use string ("") as a HASH ref while "strict refs" in use at /home/pk/... line 94. in /home/pk/perl5/lib/perl5/Dancer2/Core/App.pm l. 1516 [xx:704249] core @2023-06-09 06:21:38> Entering hook core.error.init in (eval 245) l. 1 [xx:704249] core @2023-06-09 06:21:38> Entering hook core.error.before in (eval 245) l. 1 [xx:704249] core @2023-06-09 06:21:38> Entering hook core.error.after in (eval 245) l. 1 127.0.0.1 - - [09/Jun/2023:06:21:38 +0200] "POST /connect HTTP/1.1" 500 256 "-" "curl/7.81.0" Donc, ça me dégrade plutôt les choses. Avec le code initial, j'ai : % curl --header "Content-Type: application/json" --request POST http://localhost:5000/connect {"ConnectionState":"unconnected"} ce qui est le comportement attendu. Merci en tout cas d'avoir essayé de m'indiquer une piste. Je pense désormais à un bogue, côté React. J'ai déposé un bug request dans le github de React Native. Je verrais bien... Merci PK Le jeu. 8 juin 2023 à 21:47, Sébastien Feugère a écrit : > > Les messages d'erreur de Firefox et de Chrome semblent indiquer que les navigateurs essaient de parser du JSON qui n'en est pas, ou qui n'est pas valide... Peut être une page 404 ? > > J'ai mis la même route dans une application Dancer crée avec le générateur par défaut. > > params('body')->{login}; > > params('body')->{password}; > > > sont tous les deux undef, car dans cette situation, params('body') retourne un hash vide... Je ne vois pas comment ce code peut fonctionner avec cURL. Donc dans une application React, encore moins. > > my $post = from_json( request->body ); > my $login = $post->{login}; > my $password = $post->{password}; > > Avec ceci, j'ai pu me "connecter" avec cURL, pas de soucis et le JSON est bien valide, en utilisant : > > curl --header "Content-Type: application/json" --request POST --data '{"login":"PK","password":"PK"}' http://localhost:5000/connect > > En espérant que cela puisse aider... > > On 08/06/2023 09:10, Patrice Karatchentzeff wrote: > > Salut, > > Je poste ici, un peu en désespoir de cause... > > J'ai isolé mon problème, donc ce sera plus facile. Je cherche à me > connecter à un back-end Dancer2 avec un simple login+mot de passe > depuis une appli en Native React. Tout est hard-codé pour plus de > simplicité. Je poste une requête json (login+mot de passe) et le > serveur répond en json (connecté ou pas connecté selon la valeur de la > requête initiale). > > J'ai un résultat bizarre. Je n'arrive pas à incriminer exactement le > responsable. Ça marchotte avec Firefox, mais foire avec Chrome. > > Le problème identifié : la valeur de retour du json (donc côté > Dancer2) serait mal formattée. Firefox gueule, mais récupère le json > pourtant correctement. Chrome ne négocie rien du tout et s'arrête en > cours. > > Voici le code isolé en react native (désolé, GMail ne veut pas > d'attaché en javascript) : > > % cat App.js > import React, { useState, useEffect } from 'react'; > import { > View, > Text, > } from 'react-native'; > > const ipAddress = "192.168.1.103"; > const portAddress ="5000"; > const httpProtocol = "http"; > const uriBase = httpProtocol + "://" + ipAddress + ":" + portAddress ; > > > function App() { > > const jsonReader = { 'login':"PK", 'password':"PK" }; > let string = JSON.stringify(jsonReader); > > const [message, setMessage] = useState("disconnected"); > > const submitConnectAsync2 = async () => { > return fetch( > uriBase + '/connect', { > //'http://jsonplaceholder.typicode.com/posts', { > mode: 'no-cors', // beurk... > method: 'POST', > headers: { > 'Accept' : 'application/json', > 'Content-Type' : 'application/json', > }, > body: JSON.stringify(jsonReader), > }) > .then( (response) => { > //response.text(); > response.json(); > //console.log("Response:", response.text()); > console.log("Response:", response.json()); > console.log("Fin de l'envoi"); > }) > .then(text => { > console.log(`Received ${JSON.stringify(text)}`); > console.log("text :", text); > //let json = JSON.parse(text); > //setMessage(json); > console.log("Coucou2"); > }) > .then( (json) => { > setMessage("Connecté à la main"); > console.log("(1) connection state:", message); > console.log("Fin de la réception"); > }) > .catch( error => { > console.log("Transaction error:", error); > //console.log("body:", JSON.stringify(jsonReader)); > //console.log("response:", response.son()); > //console.log("json:", json); > }); > }; > console.log("(2) connection state:", message); > > useEffect(() => { > submitConnectAsync2(); > }, []); > > > return ( > > > {message} > > > ); > > > } > > export default App; > > Voici le code côté Dancer2 : > > % cat server.pm > package server; > use Dancer2; > > set session => "Simple"; > set serializer => 'JSON'; > > hook 'before' => sub { > response_header 'Access-Control-Allow-Origin' => '*'; > }; > > post '/connect' => sub { > my $post = from_json( request->body ); > debug request->body; > my $login = params('body')->{login}; > my $password = params('body')->{password}; > debug "\t\t login : $login password : $password"; > if ( ($login eq 'PK') && ($password eq 'PK') ) { > # nothing possible to add after sending a request > debug "\t\t Valid login and password : state connected\n"; > session user => $login; > debug "\t\t", ({"ConnectionState" => "connected"}); > my %state = ( ConnectionState => "connected" ); > debug "\t\t", %state; > #send_as JSON => ({"ConnectionState" => "connected"}); > send_as JSON => \%state; > } > else { > debug "\t\t Invalid login and password : state unconnected\n"; > debug "\t\t", ({"ConnectionState" => "unconnected"}); > send_as JSON => ({"ConnectionState" => "unconnected"}); > }; > }; > > true; > > (le hook ne sert à rien, puisque je désactive le CORS dans l'envoi) > Il faut aussi ajouter dans le fichier de conf > > % cat config.yml > logger: Console > > engines: > logger: > Console: > log_level: core > > pour activer les debug, sinon remplacer par des print perl suffit. > > Le serveur « semble » fonctionner correctement : > > % curl --header "Content-Type: application/json" \ > --request POST \ > --data '{"login":"PK","password":"PK"}' \ > http://localhost:5000/connect > {"ConnectionState":"connected"} > > % curl --header "Content-Type: application/json" --request POST --data > '{"login":"PK","password":""}' http://localhost:5000/connect > {"ConnectionState":"unconnected"} > > % curl --header "Content-Type: application/json" --request POST > http://localhost:5000/connect > {"ConnectionState":"unconnected"} > > % curl http://localhost:5000/connect > {"status":404,"title":"Error 404 - Not Found","message":"/connect"} > > % curl --header "Content-Type: application/json" --request POST > http://localhost:5000/connect > {"ConnectionState":"unconnected"} > > Le débogueur de Firefox gueule sur le retour de json : > > 08:44:52,153 (2) connection state: disconnected App.js:58 > 08:44:52,407 Response: > Promise { : "pending" } > App.js:36 > 08:44:52,408 Fin de l'envoi App.js:37 > 08:44:52,408 Received undefined App.js:40 > 08:44:52,408 text : undefined App.js:41 > 08:44:52,408 Coucou2 App.js:44 > 08:44:52,409 (1) connection state: disconnected App.js:48 > 08:44:52,409 Fin de la réception App.js:49 > 08:44:52,409 (2) connection state: Connecté à la main App.js:58 > 08:44:52,413 Uncaught (in promise) SyntaxError: JSON.parse: unexpected > end of data at line 1 column 1 of the JSON data > > La promesse n'est pas tenue, le response.json semble mal formaté. > Pourtant, dans l'onglet Réseau, j'ai bien la négociation correcte et > il lit correctement la réponse ! Ça fonctionne en changeant les > valeurs des logins/mot de passe. > > Le log de Dancer2 est en phase : tout semble se passer correctement... > sauf que je ne peux pas récupérer en interne la valeur de > response.json comme le montre la sortie console de FF. L'erreur est > donc « exacte » si je puis m'exprimer ainsi. > > Chrome est plus brutal. > > (2) connection state: disconnected > App.js:36 Response: Promise {: SyntaxError: Unexpected end of input > at http://localhost:19006/static/js/bundle.js:54:43} > App.js:37 Fin de l'envoi > App.js:40 Received undefined > App.js:41 text : undefined > App.js:44 Coucou2 > App.js:48 (1) connection state: disconnected > App.js:49 Fin de la réception > App.js:58 (2) connection state: Connecté à la main > App.js:34 Uncaught (in promise) SyntaxError: Unexpected end of input > (at App.js:34:1) > at App.js:34:1 > App.js:36 Uncaught (in promise) SyntaxError: Unexpected end of input > (at App.js:36:1) > at App.js:36:1 > > et il y a plus logiquement aucun échange dans l'onglet Réseau. Dancer2 > renvoie alors bien un 404. > > Je nage complètement. Le code native semble correct et a l'air de > fonctionner chez les autres. J'ai réinstallé node/nvm/native... et > Dancer2 semble fonctionner correctement. J'ai même essayé avec un > serveur en ligne, sans plus de succès, ce qui me laisse penser que > Dancer2 n'est pas en cause. J'ai aussi essayé toutes les versions de > nvm :( > > Bref, je ne sais plus qui incriminer, à part moi ! > > Un ?il neuf serait aussi bienvenu qu'un conseil... > > Merci > > PK > > > PS : pour installer mon exemple en native : > > % npx install expo-cli > % npx create-expo-app App > % cd App > Remplacer App.js par mon exemple > % nps expo install react-dom react-native-web @expo/webpack-config > % npx expo start -- -c > taper w pour le serveur > > Changer la valeur des IP pour adapter à votre réseau ! > > -- > Sébastien Feugère > > _______________________________________________ > Perl mailing list > Perl at mongueurs.net > http://listes.mongueurs.net/mailman/listinfo/perl > Attention, les archives sont publiques -- |\ _,,,---,,_ Patrice KARATCHENTZEFF ZZZzz /,`.-'`' -. ;-;;,_ mailto:patrice.karatchentzeff at gmail.com |,4- ) )-,_. ,\ ( `'-' '---''(_/--' `-'\_) From philippe.delavalade at orange.fr Sun Jun 11 17:34:53 2023 From: philippe.delavalade at orange.fr (Philippe Delavalade) Date: Sun, 11 Jun 2023 17:34:53 +0200 Subject: [Perl] =?utf-8?q?Probl=C3=A8me_de_parenth=C3=A8ses?= Message-ID: Bonjour. J'espère que ma question n'est pas idiote ou simpliste... J'ai un fichier contenant plus de mille lignes, chaque ligne étant composée de formules faisant intervenir pas mal de parenthèses du genre (...(...(...)...)...(...)...(...(...(...)...(...)...)...)...)...(...) Y aurait-il un moyen simple de trouver la prenthèse fermante corespondant à une parenthèse ouvrante donnée ? Le but est de transformer la quantité entre parenthèses. Merci par avance de vos lumières ou conseils. -- Philippe From sylvain at lhullier.org Sun Jun 11 17:53:43 2023 From: sylvain at lhullier.org (Sylvain Lhullier) Date: Sun, 11 Jun 2023 17:53:43 +0200 Subject: [Perl] =?utf-8?b?W0hTXSBQcm9ibMOobWUgZGUgcGFyZW50aMOoc2Vz?= In-Reply-To: References: Message-ID: Philippe Delavalade a écrit : > J'ai un fichier contenant plus de mille lignes, chaque ligne étant composée > de formules faisant intervenir pas mal de parenthèses du genre > (...(...(...)...)...(...)...(...(...(...)...(...)...)...)...)...(...) > Y aurait-il un moyen simple de trouver la prenthèse fermante corespondant à > une parenthèse ouvrante donnée ? Le but est de transformer la quantité entre parenthèses. Bonjour, Je ne sais pas si ta question concerne Perl, mais posée comme ça, j'utiliserais vi. Avec vi (ou vim), la parenthèse correspondante est indiquée en couleur si elle est à l'écran. Mais surtout, il suffit en mode commande d'utiliser % pour passer la la parenthèse ouvrante à la fermante et inversement. En suite, comme toute commande de déplacement, on peut l'utiliser pour faire du copier/coller. En se mettant sur la parenthèse ouvrante, on tape : y% pour copier ou d% pour couper (il existe aussi c% pour remplacer en direct : couper + passage en mode insersion). Après cela, on déplace le curseur, puis avec la commande p ou P on colle. Voila, la réponse n'a rien à voir avec Perl, mais c'est comme cela que je ferais :-) Librement, -- Sylvain Lhullier Formation Perl https://formation-perl.fr/ Vice-président des Mongueurs de Perl http://mongueurs.net/ From philippe.delavalade at orange.fr Sun Jun 11 18:28:50 2023 From: philippe.delavalade at orange.fr (Philippe Delavalade) Date: Sun, 11 Jun 2023 18:28:50 +0200 Subject: [Perl] =?utf-8?q?***_SPAM_***_Re=3A__=5BHS=5D_Probl=C3=A8me_de_pa?= =?utf-8?q?renth=C3=A8ses?= In-Reply-To: References: Message-ID: Le dimanche 11 juin à 17:53, Sylvain Lhullier a écrit : > Philippe Delavalade a écrit : > > J'ai un fichier contenant plus de mille lignes, chaque ligne étant composée > > de formules faisant intervenir pas mal de parenthèses du genre > > (...(...(...)...)...(...)...(...(...(...)...(...)...)...)...)...(...) > > Y aurait-il un moyen simple de trouver la prenthèse fermante corespondant à > > une parenthèse ouvrante donnée ? Le but est de transformer la quantité entre parenthèses. > > Bonjour, > > Je ne sais pas si ta question concerne Perl, mais posée comme ça, > j'utiliserais vi. En fait, pour moi, je pensais utiliser un script perl pour agir ligne par ligne sur tout le fichier avec un truc du genre $ligne =~ s/bonneouvrante(_dutext_bonnefermante)/(nouveautexte)/g; Je ne pratique pas du tou vim mais je peux essayer ce que tu me dis. Peut-être est-ce aussi possible avec emacs qui est mon logiciel habituel. Merci. -- Philippe > > Avec vi (ou vim), la parenthèse correspondante est indiquée en couleur si elle est à l'écran. > > Mais surtout, il suffit en mode commande d'utiliser % > pour passer la la parenthèse ouvrante à la fermante et inversement. > > En suite, comme toute commande de déplacement, on peut l'utiliser pour faire du copier/coller. > En se mettant sur la parenthèse ouvrante, on tape : > y% pour copier ou > d% pour couper > (il existe aussi c% pour remplacer en direct : couper + passage en mode insersion). > Après cela, on déplace le curseur, puis avec la commande p ou P on colle. > > Voila, la réponse n'a rien à voir avec Perl, mais c'est comme cela que je ferais :-) > > Librement, > > -- > Sylvain Lhullier > Formation Perl https://formation-perl.fr/ > Vice-président des Mongueurs de Perl http://mongueurs.net/ > _______________________________________________ > Perl mailing list > Perl at mongueurs.net > http://listes.mongueurs.net/mailman/listinfo/perl > Attention, les archives sont publiques From anaseto at bardinflor.perso.aquilenet.fr Sun Jun 11 20:00:19 2023 From: anaseto at bardinflor.perso.aquilenet.fr (Yon) Date: Sun, 11 Jun 2023 18:00:19 +0000 Subject: [Perl] =?utf-8?q?***_SPAM_***_Re=3A_=5BHS=5D_Probl=C3=A8me_de_par?= =?utf-8?b?ZW50aMOoc2Vz?= In-Reply-To: References: Message-ID: On Sun, Jun 11, 2023 at 06:28:50PM +0200, Philippe Delavalade wrote: > En fait, pour moi, je pensais utiliser un script perl pour agir ligne par > ligne sur tout le fichier avec un truc du genre > > $ligne =~ s/bonneouvrante(_dutext_bonnefermante)/(nouveautexte)/g; Regexp::Common exporte une regexp qui gère les parenthèses bien équilibrées : https://metacpan.org/pod/Regexp::Common::balanced -- Yon From xlat at cpan.org Sun Jun 11 20:03:18 2023 From: xlat at cpan.org (Nicolas GEORGES) Date: Sun, 11 Jun 2023 19:03:18 +0100 Subject: [Perl] =?utf-8?b?W0hTXSBQcm9ibMOobWUgZGUgcGFyZW50aMOoc2Vz?= In-Reply-To: References: Message-ID: Bonjour, Côté perl il y a par exemple Regexp::Common::balanced mais il te faudrait lire tout ton fichier en mémoire et jouer sur l'option de regex 's' pour gérer les retours à la ligne pouvant être inclus entre parenthèses. print pack'b*',join'',map{$_.($_+0?'010':'100')}unpack('b*',pack'w*',7376,16,193516616,0,1508,0,11289860)=~/...../g print pack'b*',join'',map{$_.($_+0?'010':'100')}unpack('b*',pack'w*',7376,16,193516616,0,1508,0,11289860)=~/...../g Le dim. 11 juin 2023 à 16:53, Sylvain Lhullier a écrit : > Philippe Delavalade a écrit : > > J'ai un fichier contenant plus de mille lignes, chaque ligne étant > composée > > de formules faisant intervenir pas mal de parenthèses du genre > > (...(...(...)...)...(...)...(...(...(...)...(...)...)...)...)...(...) > > Y aurait-il un moyen simple de trouver la prenthèse fermante > corespondant à > > une parenthèse ouvrante donnée ? Le but est de transformer la quantité > entre parenthèses. > > Bonjour, > > Je ne sais pas si ta question concerne Perl, mais posée comme ça, > j'utiliserais vi. > > Avec vi (ou vim), la parenthèse correspondante est indiquée en couleur si > elle est à l'écran. > > Mais surtout, il suffit en mode commande d'utiliser % > pour passer la la parenthèse ouvrante à la fermante et inversement. > > En suite, comme toute commande de déplacement, on peut l'utiliser pour > faire du copier/coller. > En se mettant sur la parenthèse ouvrante, on tape : > y% pour copier ou > d% pour couper > (il existe aussi c% pour remplacer en direct : couper + passage en > mode insersion). > Après cela, on déplace le curseur, puis avec la commande p ou P > on colle. > > Voila, la réponse n'a rien à voir avec Perl, mais c'est comme cela que je > ferais :-) > > Librement, > > -- > Sylvain Lhullier > Formation Perl https://formation-perl.fr/ > Vice-président des Mongueurs de Perl http://mongueurs.net/ > _______________________________________________ > Perl mailing list > Perl at mongueurs.net > http://listes.mongueurs.net/mailman/listinfo/perl > Attention, les archives sont publiques > -------------- section suivante -------------- Une pièce jointe HTML a été nettoyée... URL: From sebastien at feugere.net Sun Jun 11 20:06:32 2023 From: sebastien at feugere.net (=?UTF-8?Q?S=c3=a9bastien_Feug=c3=a8re?=) Date: Sun, 11 Jun 2023 20:06:32 +0200 Subject: [Perl] =?utf-8?q?***_SPAM_***_Re=3A_=5BHS=5D_Probl=C3=A8me_de_par?= =?utf-8?b?ZW50aMOoc2Vz?= In-Reply-To: References: Message-ID: Beaucoup d'éditeurs devraient fournir des fonctionnalités permettant de mettre en avant les parenthèses correspondantes (voir replier le code dans le parenthèses???). Pour Emacs, il permet de surligner visuellement les parenthèses qui vont ensemble et de se balader dedans. Çà ne nécessite à priori pas de module additionnel, bien qu'on puisse en trouver avec de fonctionnalités plus poussées, si besoin. https://www.gnu.org/software/emacs/manual/html_node/emacs/Matching.html https://melpa.org/#/?q=paren On 11/06/2023 18:28, Philippe Delavalade wrote: > Le dimanche 11 juin à 17:53, Sylvain Lhullier a écrit : >> Philippe Delavalade a écrit : >>> J'ai un fichier contenant plus de mille lignes, chaque ligne étant composée >>> de formules faisant intervenir pas mal de parenthèses du genre >>> (...(...(...)...)...(...)...(...(...(...)...(...)...)...)...)...(...) >>> Y aurait-il un moyen simple de trouver la prenthèse fermante corespondant à >>> une parenthèse ouvrante donnée ? Le but est de transformer la quantité entre parenthèses. >> Bonjour, >> >> Je ne sais pas si ta question concerne Perl, mais posée comme ça, >> j'utiliserais vi. > En fait, pour moi, je pensais utiliser un script perl pour agir ligne par > ligne sur tout le fichier avec un truc du genre > > $ligne =~ s/bonneouvrante(_dutext_bonnefermante)/(nouveautexte)/g; > > Je ne pratique pas du tou vim mais je peux essayer ce que tu me > dis. Peut-être est-ce aussi possible avec emacs qui est mon logiciel > habituel. > > Merci. > -- Sébastien Feugère -------------- section suivante -------------- Une pièce jointe HTML a été nettoyée... URL: From patrice.karatchentzeff at gmail.com Mon Jun 12 08:08:16 2023 From: patrice.karatchentzeff at gmail.com (Patrice Karatchentzeff) Date: Mon, 12 Jun 2023 08:08:16 +0200 Subject: [Perl] Dancer2 et Native React In-Reply-To: References: <1fe728e2-6620-cdc3-c893-6f994855acd9@feugere.net> Message-ID: Salut, Bon, j'avance... Mais lentement. En réalité, je soupçonne désormais plutôt un bogue dans Dancer2. En effet, en virant le code React Native par un bête script javascript full-native, je reproduis le phénomène. Voici le javascript : % cat index.html et le code pour Dancer2 (j'ai amélioré en ajoutant les status de retour corrects) : % cat server.pm package server; use Dancer2; set session => "Simple"; set serializer => 'JSON'; hook 'before' => sub { response_header 'Access-Control-Allow-Origin' => '*'; }; hook before => sub { if (!session('user') && request->path !~ m{^/connect}) { forward '/connect', { requested_path => request->path }; } }; post '/connect' => sub { my $post = from_json( request->body ); debug "\t\t", request->body; my $login = params('body')->{login}; my $password = params('body')->{password}; status 200; debug "\t\t login : $login password : $password"; if ( ($login eq 'PK') && ($password eq 'PK') ) { # nothing possible to add after sending a request debug "\t\t Valid login and password : state connected\n"; session user => $login; debug "\t\t", ({"ConnectionState" => "connected"}); my %state = ( ConnectionState => "connected" ); debug "\t\t", %state; #send_as JSON => ({"ConnectionState" => "connected"}); status 201; #send_as JSON => \%state; send_as JSON => {"OK"}; } else { debug "\t\t Unvalid login and password : state unconnected\n"; debug "\t\t", ({"ConnectionState" => "unconnected"}); status 401; session flash => 'Unvalid login and password match!'; send_as JSON => ({"ConnectionState" => "unconnected"}); redirect '/connect?failed=1'; }; true; (le hook ne sert à rien, puisque je désactive le CORS dans l'envoi) Il faut aussi ajouter dans le fichier de conf % cat config.yml logger: Console engines: logger: Console: log_level: core Le test est toujours valide avec cURL (cf. mon premier post), ce qui prouve que ce test n'est pas correct pour valider le serveur Dancer2. En revanche, en testant dans FF et Chromium, j'ai toujours les 2 mêmes erreurs (c'est-à-dire une erreur de parsing du json retour pour FF, qui trouve pourtant la requête retour, et Chrome qui s'arrête dès l'erreur). Du coup, je suis obligé de penser que l'erreur vient de Dancer2, puisque le script javascript est bon et si je remplace Dancer2 par un serveur en javascript, il fonctionne... Donc soit mon code contient une erreur, soit Dancer2 est bogué... J'aurais tendance à incriminer mon code, mais là, je sèche :( PK Le ven. 9 juin 2023 à 06:25, Patrice Karatchentzeff < patrice.karatchentzeff at gmail.com> a écrit : > Merci de ta réponse. > > Je ne me souviens plus d'où j'ai récupéré ce code, mais je crois qu'il > est dans la doc officielle de Dancer2. > > Avec ta modif, j'ai exactement le même comportement, sauf que cela > ajoute une erreur côté Dancer en cas de chaîne vide : > > % curl --header "Content-Type: application/json" --request POST > http://localhost:5000/connect > {"title":"Error 500 - Internal Server > Error","status":500,"exception":"Can't use string (\"\") as a HASH ref > while \"strict refs\" in use at... > > confirmée dans les logs : > > [xx:704249] error @2023-06-09 06:21:38> Route exception: Can't use > string ("") as a HASH ref while "strict refs" in use at /home/pk/... > line 94. in /home/pk/perl5/lib/perl5/Dancer2/Core/App.pm l. 1516 > [xx:704249] core @2023-06-09 06:21:38> Entering hook core.error.init > in (eval 245) l. 1 > [xx:704249] core @2023-06-09 06:21:38> Entering hook core.error.before > in (eval 245) l. 1 > [xx:704249] core @2023-06-09 06:21:38> Entering hook core.error.after > in (eval 245) l. 1 > 127.0.0.1 - - [09/Jun/2023:06:21:38 +0200] "POST /connect HTTP/1.1" > 500 256 "-" "curl/7.81.0" > > Donc, ça me dégrade plutôt les choses. Avec le code initial, j'ai : > > % curl --header "Content-Type: application/json" --request POST > http://localhost:5000/connect > {"ConnectionState":"unconnected"} > > ce qui est le comportement attendu. > > Merci en tout cas d'avoir essayé de m'indiquer une piste. > > Je pense désormais à un bogue, côté React. J'ai déposé un bug request > dans le github de React Native. Je verrais bien... > > Merci > > PK > > Le jeu. 8 juin 2023 à 21:47, Sébastien Feugère a > écrit : > > > > Les messages d'erreur de Firefox et de Chrome semblent indiquer que les > navigateurs essaient de parser du JSON qui n'en est pas, ou qui n'est pas > valide... Peut être une page 404 ? > > > > J'ai mis la même route dans une application Dancer crée avec le > générateur par défaut. > > > > params('body')->{login}; > > > > params('body')->{password}; > > > > > > sont tous les deux undef, car dans cette situation, params('body') > retourne un hash vide... Je ne vois pas comment ce code peut fonctionner > avec cURL. Donc dans une application React, encore moins. > > > > my $post = from_json( request->body ); > > my $login = $post->{login}; > > my $password = $post->{password}; > > > > Avec ceci, j'ai pu me "connecter" avec cURL, pas de soucis et le JSON > est bien valide, en utilisant : > > > > curl --header "Content-Type: application/json" --request POST --data > '{"login":"PK","password":"PK"}' http://localhost:5000/connect > > > > En espérant que cela puisse aider... > > > > On 08/06/2023 09:10, Patrice Karatchentzeff wrote: > > > > Salut, > > > > Je poste ici, un peu en désespoir de cause... > > > > J'ai isolé mon problème, donc ce sera plus facile. Je cherche à me > > connecter à un back-end Dancer2 avec un simple login+mot de passe > > depuis une appli en Native React. Tout est hard-codé pour plus de > > simplicité. Je poste une requête json (login+mot de passe) et le > > serveur répond en json (connecté ou pas connecté selon la valeur de la > > requête initiale). > > > > J'ai un résultat bizarre. Je n'arrive pas à incriminer exactement le > > responsable. Ça marchotte avec Firefox, mais foire avec Chrome. > > > > Le problème identifié : la valeur de retour du json (donc côté > > Dancer2) serait mal formattée. Firefox gueule, mais récupère le json > > pourtant correctement. Chrome ne négocie rien du tout et s'arrête en > > cours. > > > > Voici le code isolé en react native (désolé, GMail ne veut pas > > d'attaché en javascript) : > > > > % cat App.js > > import React, { useState, useEffect } from 'react'; > > import { > > View, > > Text, > > } from 'react-native'; > > > > const ipAddress = "192.168.1.103"; > > const portAddress ="5000"; > > const httpProtocol = "http"; > > const uriBase = httpProtocol + "://" + ipAddress + ":" + > portAddress ; > > > > > > function App() { > > > > const jsonReader = { 'login':"PK", 'password':"PK" }; > > let string = JSON.stringify(jsonReader); > > > > const [message, setMessage] = useState("disconnected"); > > > > const submitConnectAsync2 = async () => { > > return fetch( > > uriBase + '/connect', { > > //'http://jsonplaceholder.typicode.com/posts', { > > mode: 'no-cors', // beurk... > > method: 'POST', > > headers: { > > 'Accept' : 'application/json', > > 'Content-Type' : 'application/json', > > }, > > body: JSON.stringify(jsonReader), > > }) > > .then( (response) => { > > //response.text(); > > response.json(); > > //console.log("Response:", response.text()); > > console.log("Response:", response.json()); > > console.log("Fin de l'envoi"); > > }) > > .then(text => { > > console.log(`Received ${JSON.stringify(text)}`); > > console.log("text :", text); > > //let json = JSON.parse(text); > > //setMessage(json); > > console.log("Coucou2"); > > }) > > .then( (json) => { > > setMessage("Connecté à la main"); > > console.log("(1) connection state:", message); > > console.log("Fin de la réception"); > > }) > > .catch( error => { > > console.log("Transaction error:", error); > > //console.log("body:", JSON.stringify(jsonReader)); > > //console.log("response:", response.son()); > > //console.log("json:", json); > > }); > > }; > > console.log("(2) connection state:", message); > > > > useEffect(() => { > > submitConnectAsync2(); > > }, []); > > > > > > return ( > > > > > > {message} > > > > > > ); > > > > > > } > > > > export default App; > > > > Voici le code côté Dancer2 : > > > > % cat server.pm > > package server; > > use Dancer2; > > > > set session => "Simple"; > > set serializer => 'JSON'; > > > > hook 'before' => sub { > > response_header 'Access-Control-Allow-Origin' => '*'; > > }; > > > > post '/connect' => sub { > > my $post = from_json( request->body ); > > debug request->body; > > my $login = params('body')->{login}; > > my $password = params('body')->{password}; > > debug "\t\t login : $login password : $password"; > > if ( ($login eq 'PK') && ($password eq 'PK') ) { > > # nothing possible to add after sending a request > > debug "\t\t Valid login and password : state connected\n"; > > session user => $login; > > debug "\t\t", ({"ConnectionState" => "connected"}); > > my %state = ( ConnectionState => "connected" ); > > debug "\t\t", %state; > > #send_as JSON => ({"ConnectionState" => "connected"}); > > send_as JSON => \%state; > > } > > else { > > debug "\t\t Invalid login and password : state unconnected\n"; > > debug "\t\t", ({"ConnectionState" => "unconnected"}); > > send_as JSON => ({"ConnectionState" => "unconnected"}); > > }; > > }; > > > > true; > > > > (le hook ne sert à rien, puisque je désactive le CORS dans l'envoi) > > Il faut aussi ajouter dans le fichier de conf > > > > % cat config.yml > > logger: Console > > > > engines: > > logger: > > Console: > > log_level: core > > > > pour activer les debug, sinon remplacer par des print perl suffit. > > > > Le serveur « semble » fonctionner correctement : > > > > % curl --header "Content-Type: application/json" \ > > --request POST \ > > --data '{"login":"PK","password":"PK"}' \ > > http://localhost:5000/connect > > {"ConnectionState":"connected"} > > > > % curl --header "Content-Type: application/json" --request POST --data > > '{"login":"PK","password":""}' http://localhost:5000/connect > > {"ConnectionState":"unconnected"} > > > > % curl --header "Content-Type: application/json" --request POST > > http://localhost:5000/connect > > {"ConnectionState":"unconnected"} > > > > % curl http://localhost:5000/connect > > {"status":404,"title":"Error 404 - Not Found","message":"/connect"} > > > > % curl --header "Content-Type: application/json" --request POST > > http://localhost:5000/connect > > {"ConnectionState":"unconnected"} > > > > Le débogueur de Firefox gueule sur le retour de json : > > > > 08:44:52,153 (2) connection state: disconnected App.js:58 > > 08:44:52,407 Response: > > Promise { : "pending" } > > App.js:36 > > 08:44:52,408 Fin de l'envoi App.js:37 > > 08:44:52,408 Received undefined App.js:40 > > 08:44:52,408 text : undefined App.js:41 > > 08:44:52,408 Coucou2 App.js:44 > > 08:44:52,409 (1) connection state: disconnected App.js:48 > > 08:44:52,409 Fin de la réception App.js:49 > > 08:44:52,409 (2) connection state: Connecté à la main App.js:58 > > 08:44:52,413 Uncaught (in promise) SyntaxError: JSON.parse: unexpected > > end of data at line 1 column 1 of the JSON data > > > > La promesse n'est pas tenue, le response.json semble mal formaté. > > Pourtant, dans l'onglet Réseau, j'ai bien la négociation correcte et > > il lit correctement la réponse ! Ça fonctionne en changeant les > > valeurs des logins/mot de passe. > > > > Le log de Dancer2 est en phase : tout semble se passer correctement... > > sauf que je ne peux pas récupérer en interne la valeur de > > response.json comme le montre la sortie console de FF. L'erreur est > > donc « exacte » si je puis m'exprimer ainsi. > > > > Chrome est plus brutal. > > > > (2) connection state: disconnected > > App.js:36 Response: Promise {: SyntaxError: Unexpected end of > input > > at http://localhost:19006/static/js/bundle.js:54:43} > > App.js:37 Fin de l'envoi > > App.js:40 Received undefined > > App.js:41 text : undefined > > App.js:44 Coucou2 > > App.js:48 (1) connection state: disconnected > > App.js:49 Fin de la réception > > App.js:58 (2) connection state: Connecté à la main > > App.js:34 Uncaught (in promise) SyntaxError: Unexpected end of input > > (at App.js:34:1) > > at App.js:34:1 > > App.js:36 Uncaught (in promise) SyntaxError: Unexpected end of input > > (at App.js:36:1) > > at App.js:36:1 > > > > et il y a plus logiquement aucun échange dans l'onglet Réseau. Dancer2 > > renvoie alors bien un 404. > > > > Je nage complètement. Le code native semble correct et a l'air de > > fonctionner chez les autres. J'ai réinstallé node/nvm/native... et > > Dancer2 semble fonctionner correctement. J'ai même essayé avec un > > serveur en ligne, sans plus de succès, ce qui me laisse penser que > > Dancer2 n'est pas en cause. J'ai aussi essayé toutes les versions de > > nvm :( > > > > Bref, je ne sais plus qui incriminer, à part moi ! > > > > Un ?il neuf serait aussi bienvenu qu'un conseil... > > > > Merci > > > > PK > > > > > > PS : pour installer mon exemple en native : > > > > % npx install expo-cli > > % npx create-expo-app App > > % cd App > > Remplacer App.js par mon exemple > > % nps expo install react-dom react-native-web @expo/webpack-config > > % npx expo start -- -c > > taper w pour le serveur > > > > Changer la valeur des IP pour adapter à votre réseau ! > > > > -- > > Sébastien Feugère > > > > _______________________________________________ > > Perl mailing list > > Perl at mongueurs.net > > http://listes.mongueurs.net/mailman/listinfo/perl > > Attention, les archives sont publiques > > > > -- > |\ _,,,---,,_ Patrice KARATCHENTZEFF > ZZZzz /,`.-'`' -. ;-;;,_ mailto:patrice.karatchentzeff at gmail.com > |,4- ) )-,_. ,\ ( `'-' > '---''(_/--' `-'\_) > -- |\ _,,,---,,_ Patrice KARATCHENTZEFF ZZZzz /,`.-'`' -. ;-;;,_ mailto:patrice.karatchentzeff at gmail.com |,4- ) )-,_. ,\ ( `'-' '---''(_/--' `-'\_) -------------- section suivante -------------- Une pièce jointe HTML a été nettoyée... URL: From philippe.delavalade at orange.fr Mon Jun 12 10:10:30 2023 From: philippe.delavalade at orange.fr (Philippe Delavalade) Date: Mon, 12 Jun 2023 10:10:30 +0200 Subject: [Perl] =?utf-8?q?***_SPAM_***_Re=3A__=5BHS=5D_Probl=C3=A8me_de_pa?= =?utf-8?q?renth=C3=A8ses?= In-Reply-To: References: Message-ID: Merci à tous pour les réponses. Je viens d'installer Regexp::Common ; j'ai jeté un coup d'?il rapide à la doc et pour l'instant ça me semble un peu nébuleux mais je vais faire des tests. Les propositions faisant appel à des éditeurs de texte et à des principes de colorisation ne me conviennent pas puisque je suis aveugle. Merci encore. -- Philippe From paul.gaborit at gmail.com Mon Jun 12 16:48:36 2023 From: paul.gaborit at gmail.com (Paul Gaborit) Date: Mon, 12 Jun 2023 16:48:36 +0200 Subject: [Perl] =?utf-8?b?W0hTXSBQcm9ibMOobWUgZGUgcGFyZW50aMOoc2Vz?= In-Reply-To: References: Message-ID: <2868373e-f28a-bb96-1aef-3df47fb4b815@gmail.com> Le 12/06/2023 à 10:10, Philippe Delavalade a écrit : > Je viens d'installer Regexp::Common ; j'ai jeté un coup d'?il rapide à la > doc et pour l'instant ça me semble un peu nébuleux mais je vais faire des > tests. Est-ce que l'exemple suivant aide: ################### use Regexp::Common; my $data = " (aaa) (aaa (bbb) (ccc) ddd) (multiline (ffff) (ggg hhh)) "; while ($data =~ m/$RE{balanced}{-parens=>'()'}/g) { print "=>", $1, "\n"; } ################### Cordialement, -- Paul Gaborit From mc at unistra.fr Mon Jun 12 17:47:09 2023 From: mc at unistra.fr (Marc Chantreux) Date: Mon, 12 Jun 2023 17:47:09 +0200 Subject: [Perl] =?iso-8859-1?q?Probl=E8me_de_parenth=E8ses?= In-Reply-To: References: Message-ID: salut, personnellement, j'aurais tendance à déplacer le curseur avec une boucle //cg. pour obtenir (...(222(...)222)...(222)...(222(...(...)...(...)...)222)...)...(...) depuis l'exemple, j'ai écris: perl -nE' pos $_ =0; while (not /\G$/cg) { if (/\G\(/cg) { ++$level; print $&; next } if (/\G\)/cg) { --$level; print $&; next } /\G[^()]+/cg; if ( $level == 2) { print $& =~ s/./2/rg } else { print $& } } ' <<% (...(...(...)...)...(...)...(...(...(...)...(...)...)...)...)...(...) cordialement, marc From mc at unistra.fr Mon Jun 12 18:00:07 2023 From: mc at unistra.fr (Marc Chantreux) Date: Mon, 12 Jun 2023 18:00:07 +0200 Subject: [Perl] =?iso-8859-1?q?=5BHS=5D_Probl=E8me_de_parenth=E8ses?= In-Reply-To: References: Message-ID: Le Sun, Jun 11, 2023 at 05:53:43PM +0200, Sylvain Lhullier a écrit : > Mais surtout, il suffit en mode commande d'utiliser % > pour passer la la parenthèse ouvrante à la fermante et inversement. j'avais mis un peu de temps à le découvrir mais il n'est nul besoin d'être déjà sur la parenthèse. quand tu es au début de la ligne et que tu veux transformer foo(bar(bang)) foo(),bar(bang) en foo(),bar(bang) tu fais fbc%a,p et si on est dans du scheme, un truc que j'adore est qu'une selection visuelle peut remonter une structure avec le bon selecteur (this (is (an exemple))) fxva(a(a( fxvi(i(i( (this (is (an exemple))) je trouve ça super beau :) marc From philippe.delavalade at orange.fr Tue Jun 13 11:41:51 2023 From: philippe.delavalade at orange.fr (Philippe Delavalade) Date: Tue, 13 Jun 2023 11:41:51 +0200 Subject: [Perl] =?utf-8?q?***_SPAM_***_Re=3A__=5BHS=5D_Probl=C3=A8me_de_pa?= =?utf-8?q?renth=C3=A8ses?= In-Reply-To: <2868373e-f28a-bb96-1aef-3df47fb4b815@gmail.com> References: <2868373e-f28a-bb96-1aef-3df47fb4b815@gmail.com> Message-ID: Le lundi 12 juin à 16:48, Paul Gaborit a écrit : > Le 12/06/2023 à 10:10, Philippe Delavalade a écrit : > > Je viens d'installer Regexp::Common ; j'ai jeté un coup d'?il rapide à la > > doc et pour l'instant ça me semble un peu nébuleux mais je vais faire des > > tests. > > Est-ce que l'exemple suivant aide: Oui, merci beaucoup. Cordialement. -- Philippe > > ################### > use Regexp::Common; > > my $data = " > (aaa) > (aaa (bbb) (ccc) ddd) > (multiline (ffff) (ggg > hhh)) > "; > while ($data =~ m/$RE{balanced}{-parens=>'()'}/g) { > print "=>", $1, "\n"; > } > ################### > > Cordialement, > -- > Paul Gaborit > > _______________________________________________ > Perl mailing list > Perl at mongueurs.net > http://listes.mongueurs.net/mailman/listinfo/perl > Attention, les archives sont publiques From emmanuel at seyman.fr Tue Jun 20 01:31:35 2023 From: emmanuel at seyman.fr (Emmanuel Seyman) Date: Tue, 20 Jun 2023 01:31:35 +0200 Subject: [Perl] =?iso-8859-1?q?R=E9daction_d=27un_article_Perl_5=2E38=2E0_?= =?iso-8859-1?q?sur_LinuxFR?= Message-ID: Bonjour à tous. La version 5.38.0 RC1 de Perl est sorti il y a quelques jours et on a maintenant une très bonne idée de ce que contiendra 5.38.0 à sa sortie. Comme l'année dernière, j'ai commencé un article sur LinuxFR pour parler des nouveautés et des changements de cette version. Si ça vous intéresse de participer à cet article, vous pouvez aller sur l'espace de rédaction de LinuxFR et choisir un paragraphe sur lequel travailler (bien entendu, il faut un compte sur LinuxFR pour y accéder). https://linuxfr.org/redaction/news/nouvelle-depeche-n-41553 Emmanuel