Appel HTTP : java.nio.channels.ClosedChannelException

Bonjour,
j’ai une erreur étrange lors d’un POST.
Le code fonctionne en dehors de Simplicité.
Le même code retour une erreur ClosedChannelException dans Simplicité.
Est ce que vous auriez une explication ?

private static String sendPost(String url, String body) throws Exception {

        HttpClient httpClient = HttpClient.newBuilder().version(HttpClient.Version.HTTP_1_1).build();
        HttpRequest request = HttpRequest.newBuilder()
                .POST(HttpRequest.BodyPublishers.ofString(body)).uri(URI.create(url))
                .headers("Content-Type", "application/x-www-form-urlencoded")
                .build();

        HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());


        if (response.statusCode() != HttpStatus.SC_OK) {
            throw new Exception("Erreur sur la réponse reçue de " + url + " attendu :" + HttpStatus.SC_CREATED + " code http response:" + response.statusCode());
        }
        return response.body();
    }

J’ai également essayé avec Tool.readUrl(urlIn,“”,“”,“POST”,body,headers,“UTF-8”); mais sans succès.

[Platform]
Status=OK
Version=5.1.45
BuiltOn=2022-05-25 15:32
Git=5.1/b45d2193517bde941ae8980c8569f61af39ea412
Encoding=UTF-8
EndpointIP=172.21.0.7
EndpointURL=http://baefad8b2cdc:8080
TimeZone=UTC
SystemDate=2022-08-25 16:17:16

Ce problème ne semble pas être lié à Simplicité qui n’est qu’une webapp et votre code n’utilise aucune API Simplicité. Le service que vous appelez via call HTTP n’est pas ouvert au POST ou ce service n’est pas fiable, ou il est sécurisé…

Comparez la requête complète qui est émise dans le cas qui fonctionne et le cas qui ne fonctionne pas (header, token, body…).

(IOException (Java Platform SE 7 ))

ClosedChannelException

Checked exception thrown when an attempt is made to invoke or complete an I/O operation upon channel that is closed, or at least closed to that operation. That this exception is thrown does not necessarily imply that the channel is completely closed. A socket channel whose write half has been shut down, for example, may still be open for reading.

Bonjour François,

je ne vois pas non plus le lien avec Simplicité en dehors du fait que le même code ne produit pas le même résultat lorsqu’il est lancé depuis Simplicité.
Il s’agit d’un post d’appel à keycloak pour récupérer un token, rien de bien compliqué.
J’ai comparé les header et body et ils semblent identiques. C’est vraiment mystérieux. Je vais continué à creuser.
Merci

Je dirai plutôt lancé via Java/Tomcat depuis un certain serveur.

Si les 2 flux HTTP sont bien strictement identiques, c’est un problème de tuyauterie. Votre IP n’a pas le droit d’appeler un POST sur Keycloak (dont la gestion de droits d’accès aux API est complexe et ne relève pas de notre support).

  • Déployez une simple servlet dans tomcat (en dehors de la webapp Simplicité)
  • Lancez un simple main java / POJO depuis ce serveur (en dehors de tomcat)
  • contactez le support Keycloak

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.