Forum Programmation.autre Groovy : récupérer les cookies d'en-tête et les renvoyer à la requête suivante.

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
1
7
sept.
2021

Hello.

J'utilise Groovy pour faire des requêtes dans JIRA.

Pour s'authentifier, il faut exécuter une requete POST sur l'endpoint /rest/auth/1/session. J'ai réussi à faire ça à l'aide de la lib groovy groovyx.net.http.RESTClient. Jusque là tout va bien.

Par contre, dans l'entete de la réponse, je récupère des cookies que j'ai besoin de renvoyer ensuite si je veux pouvoir continuer à interroer l'API, ett je ne sais pas trop comment faire. Les morceaux de code que j'ai trouvé sur le net ne m'aident pas beaucoup, car il semble y avoir pléthore de lib pour interroger des API en groovy et d'un exemple à l'autre ça change tout le temps.

Quand je regarde la doc de la lib ( http://javadox.com/org.codehaus.groovy.modules.http-builder/http-builder/0.6/groovyx/net/http/RESTClient.html#post(java.util.Map) ), je ne vois pas trop comment je dois faire, ni ou je dois positionner les cookies récupérés lors de la requête précédente. Auriez-vous une piste à me donner, ou un lien vers un exemple ?

Merci d'avance.

  • # En ligne de commande ?

    Posté par  . Évalué à 4. Dernière modification le 08 septembre 2021 à 05:50.

    Salut,

    Avant de vouloir le faire programmatiquement, tu y arrive en ligne de commande avec curl ou wget, déjà ?

    J'avais galéré un peu avec jenkins pour accéder au endpoint lançant un build d'un projet lorsque celui-ci nécessite une authentification (la doc n'était pas très claire si ma mémoire est exacte, ou les exemples glanés par recherche pas à jour). Je sais que ce n'est pas JIRA, mais c'est un peu la même "famille", disons.

    Ensuite, je ne pense pas que ça se configure aussi haut, il faut descendre au moins au client HTTP, et peut-être au contexte HTTP (moins sûr).

    Exemple en client http java

    Pour Jenkins, j'avais fini par réussir en ligne de commande avec (me demande pas pourquoi ce xpath pour récupérer son crumb…) :

    CRUMB=$(curl -ks https://jenkins.host.name/crumbIssuer/api/xml?xpath=concat\(//crumbRequestField,%22:%22,//crumb\) -c cookies.txt --user "monUserJenkins")
    curl -X POST -b cookies.txt -H "${CRUMB}" -u monUserJenkins https://jenkins.host.name/job/leProjetTopSecret/build

    On voit dans le POST que j'ai besoin du crumb dans les headers, pas uniquement des cookies

    Matricule 23415

    • [^] # Re: En ligne de commande ?

      Posté par  . Évalué à 1.

      Hello.

      Je m'étais frotté à ce genre de problématique pour Jenkins il y a quelques temps,et j'avais été confronté au même problème pur le crumb :)

      Sinon entre temps, j'ai cherché un peu de mon côté. Mon problème vient du fait que je dois envoyer des cookies lors de la requête en plus du JSESSIONID : je pense que c'est parce que le service est exposé sur le net et qu'il y a un proxy devant (il me semble avoir fait les requêtes depuis le réseau interne et je ne me souviens pas avoir eu ce genre de problème - à moins que la nécessité d'utiliser les cookies ait étéimplémentée entre temps).

      Toujours est-il que mon problème venait du fait que le serveur me retournait 3 cookies, non pas avec le parametre Set-Cookie + 3 cookies séparés par ";", mais il y a 3 occurences de "set-Cookie" dans le header, et je ne savais pas trop comment m'en servir.

      En cherchant, j'ai vu que je devais les récupérer, les assembler dans un seul élément "Set-Cookie" au niveau du header et les séparer par des ";". J'ai fait une petite classe pour ça (ya des trucs tout fait qui existent, mais je risque de prendre plus de temps à chercher à comprendre comment ça marche plutot que de parser l'entête, récupérer tous les set-cookies dans un tableau, et faire un simple join avec les ";" à la fin). J'ai pas encore testé mais je pense que c'est comme ça que ça doit se faire.

      • [^] # Re: En ligne de commande ?

        Posté par  . Évalué à 2.

        J'ai fait une petite classe pour ça

        sinon reprendre tel quel les 3 set-cookie et les remettre dans ta requête ?

        • [^] # Re: En ligne de commande ?

          Posté par  . Évalué à 1.

          Disons qu'en cherchant dans les RFC, je ne peux pas les reprendre comme ça : il semble que les requêtes ne doivent contenir qu'un sul set-cookie, et doivent être séparés par un ";". C'est d'ailleurs le point qui me gênait : les outils groovy pour faire des requetes utilisent des maps, et par définition tu ne peux pas avoir de maps avec plusieurs fois la même clé …

          • [^] # Re: En ligne de commande ?

            Posté par  . Évalué à 2.

            c'est sur que qui l'outil ne respectent pas les RFC, ca va pas aider à causer avec lui ;)

            • [^] # Re: En ligne de commande ?

              Posté par  . Évalué à 1.

              En fait d'après ce que j'ai compris, un serveur peut retourner plusieurs set-ookies dans son en-tête, mais un client qui fait la requête ne peut en envoyer qu'une seule. D'ou le besoin de parser l'en-tête, et récupérer :

              https://datatracker.ietf.org/doc/html/rfc6265#section-5.4

              5.4. The Cookie Header

              The user agent includes stored cookies in the Cookie HTTP request
              header.

              When the user agent generates an HTTP request, the user agent MUST
              NOT attach more than one Cookie header field.

              Il semble que cette restriction n'existe pas pour le serveur.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.