Problème boucle while

Bonjour j'utilise un shield ethernet et je souhaite faire un grand nombre de page internet.
La partie faire la page et faire une redirection simple.
Maintenant je souhaite faire une redirection plus compressé qui récupère la requête "Get" et cherche le fichier sur la carte SD. Malheureusement pour une raison inconnue ma boucle while, qui sert a trouver la position de l'espace entre le nom du fichier et "HTTP/1.1" . Le problème de la boucle while et que je ne parviens pas en m'en sortir.
Pouvez-vous m'aider ?
Voici le code :

void gestionClient()
{
  EthernetClient client = serveur.available();  //on ecoute le port
  if (client)   //si le client existe
  {
    reception = "";
    if (client.connected())
    {
      Serial.println(F("Client connecte"));
      if (client.available()) carLu = client.read();
      while (client.available() && carLu != 10) //Tant qu'il reste au moins 1 octet à lire sur la première ligne
      {
        reception = reception + carLu;
        carLu = client.read();
      }
      Serial.print(F("\n'reception' = "));
      Serial.println(reception);
      if (reception.startsWith("GET")) {                       //Si la chaine reçue contient une requète
        if (reception.startsWith("GET / HTTP/1.1")) {         //Requête sans paramètre => affichage de la page
          accueil(client);
        } else if (reception.startsWith("GET /page")) {
          page();
        } else if (reception.startsWith("GET /?0 ")) {        //Requête sans paramètre => affichage de la page
          int led = int(0);
          Serial.println(led);
          page();
        } else if (reception.startsWith("GET /?1 ")) {        //Requête sans paramètre => affichage de la page
          int led = int(1);
          Serial.println(led);
          page();
        } else if (reception.startsWith("GET /?2 ")) {        //Requête sans paramètre => affichage de la page
          int led = int(2);
          Serial.println(led);
          page();
        } else if (reception.startsWith("GET /?3 ")) {        //Requête sans paramètre => affichage de la page
          int led = int(3);
          Serial.println(led);
          page();
        } else if (reception.startsWith("GET /?4 ")) {        //Requête sans paramètre => affichage de la page
          int led = int(4);
          Serial.println(led);
          page();
        } else if (reception.startsWith("GET /disonect ")) {
          disconect(client);
        } else if (reception.indexOf("test.txt") != -1)      //Si demande d'envoi du fichier 'style.css'
        { //(balise <link> dans le fichier html)
          if (d >= 1) {
            Serial.print("Client autorisé : ");
            Serial.println(d);
            if (SD.exists("test.txt"))                        //Si le fichier "style.css" existe on l'ouvre en
            { //lecture, puis on lit son contenu caractère par
              d--;
              client.println("HTTP/1.1 200 OK");  //type de HTML
              client.println("Content-Type: text/txt; charset=ascii");  //type de fichier et encodage de caracteres
              client.println("Connection: close");    //fermeture de la connexion quand toute la reponse a ete envoyee
              client.println();
              File fichier = SD.open("test.txt", FILE_READ);  //caractère que l'on envoie en même temps vers
              while (fichier.available())                      //le client pour affichage.
              {
                char carTemp = fichier.read();
                Serial.write(carTemp);
                client.write(carTemp);
              }
              fichier.close();
            } else {
              Serial.println(F("Fichier 'test.txt' absent"));
              return;
            }
          }
          else {
            Serial.print("Client interdit : ");
            Serial.println(d);
          }
        }else{
          String reception2 = reception.substring(5);
          byte x = 0;
          byte e = " ";
          reception.substring(4) = reception2;
          Serial.print("reception2 = ");
          Serial.println(reception2);

          ////////////////////////////Boucle While non foctionnel.////////////////////////////
          while(reception2.charAt(x) != e){
            Serial.println(x);
            Serial.println(reception2.charAt(x));
            delay(100);
            x++;
          }
          Serial.println(x);
          Serial.println(reception2.charAt(x));
          String reception3 = reception2.substring(0,x);
          Serial.print("reception3 = ");
          Serial.println(reception3);          
          //if (SD.exists(reception)) {
        }
      }
      else Serial.println(F("Requete non conforme"));
      delay(1);                                               //La transmission est rapide mais pas instantanée
      client.stop();
    }
  }
}

Merci.

à quoi doit ressembler la requête à analyser ?

Il suffit d'examiner l'exemple WebServer de la librairie.
Voir en particulier l'utilisation de la variable currentLineIsBlank.

reception est probablement une variable String. J'espère que cette variable est pré-allouée avec une taille fixe : String::reserve, sinon gare à la fragmentation mémoire.

Get /le_nom_du_fichier HTTP/1.1
En le_nom_du_fichier.
J'ai déjà réussi a le transformer en : le_nom_du_fichier HTTP/1.1.

vous pouvez essayer cela si vous tenez à conserver les Strings

void setup() {
  Serial.begin(115200);
  String reception = "GET /le_nom_du_fichier HTTP/1.1";
  String nomDeFichier;
  if (reception.startsWith("GET /")) {
    nomDeFichier = reception.substring(5); // 5 pour aller juste après le 'GET /'
    int index =  nomDeFichier.indexOf(' '); // on pourrait tester l'index car si c'est -1 ce n'est pas bon
    nomDeFichier.remove(index);
    Serial.print("J'ai trouvé : [");
    Serial.print(nomDeFichier);
    Serial.println(']');
  } else {
    Serial.println("Erreur: pas une requête GET /");
  }
}

void loop() {}

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