IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Parser une requ�te HTTP/GET en c ! regex ?


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    25
    D�tails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2005
    Messages : 25
    Par d�faut Parser une requ�te HTTP/GET en c ! regex ?
    Bonjour,

    J'ai dans une cha�ne de caract�re ceci:

    Et je souhaite obtenir un r�sultat sous forme de tableau:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
     
    res[0][0] = "foo"
    res[0][1] = "bar"
    res[1][0] = "bar"
    res[1][1] = "foo"
    Intuitivement il faudrait utiliser les regex non ?

    genre
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    "[a-z]*\?([a-z]*)=([a-z]*)?(&([a-z]*)=([a-z]*))*"
    mais � l'�vidence cela ne fonctionne pas puique je n'arrive pas � avoir de parenth�ses capturantes r�p�tivives avec les regex.

    Avez-vous une id�e � me proposer ?

  2. #2
    Expert �minent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retrait�
    Inscrit en
    D�cembre 2003
    Messages
    14 512
    D�tails du profil
    Informations personnelles :
    �ge : 68
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : Retrait�

    Informations forums :
    Inscription : D�cembre 2003
    Messages : 14 512
    Par d�faut Re: Parser une requ�te HTTP/GET en c ! regex ?
    Citation Envoy� par canard75
    Intuitivement il faudrait utiliser les regex non ?
    Bof, Je commencerais par un truc simple et standard genre strtok()
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    #include <stdio.h>
    #include <string.h>
     
    #define N(a) (sizeof(a)/sizeof*(a))
     
    int main (void)
    {
        char s[] = "request?foo=bar&bar=foo";
        char *pp[6] =
            {
                0
            };
        size_t i = 0;
        size_t const n = N(pp) - 1;
        char *p = s;
     
        printf ("n = %u\n", (unsigned) n);
     
        while ((pp[i] = strtok(p, "?=&")) != NULL
                && i < n)
        {
            printf ("i = %u\n", (unsigned) i);
            if (i == 0)
            {
                p = NULL;
            }
            i++;
        }
        pp[i] = NULL;
     
        {
            size_t i = 0;
            while (pp[i] != NULL)
            {
                printf ("pp[%u] = %s\n", (unsigned) i, pp[i]);
                i++;
            }
        }
        return 0;
    }

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    25
    D�tails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2005
    Messages : 25
    Par d�faut
    Huhu !

    Bon ca fonctionne parfaitement mais il va me falloir un moment pour comprendre tout ca

  4. #4
    Expert �minent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retrait�
    Inscrit en
    D�cembre 2003
    Messages
    14 512
    D�tails du profil
    Informations personnelles :
    �ge : 68
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : Retrait�

    Informations forums :
    Inscription : D�cembre 2003
    Messages : 14 512
    Par d�faut
    Citation Envoy� par canard75
    Bon ca fonctionne parfaitement mais il va me falloir un moment pour comprendre tout ca
    Ben oui. Ca fait partie du m�tier... Commence par lire la doc de strok(). Ensuite, pose des questions pr�cises si tu ne comprends pas.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    25
    D�tails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2005
    Messages : 25
    Par d�faut
    ce qu'il y a d'interessant c'est que ca compile avec

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    test2.c: In function `main':
    test2.c:14: warning: implicit declaration of function `strtok'
    test2.c:14: warning: assignment makes pointer from integer without a cast
    et ca fonctionne quand m�me...

  6. #6
    Expert �minent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retrait�
    Inscrit en
    D�cembre 2003
    Messages
    14 512
    D�tails du profil
    Informations personnelles :
    �ge : 68
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : Retrait�

    Informations forums :
    Inscription : D�cembre 2003
    Messages : 14 512
    Par d�faut
    Citation Envoy� par canard75
    ce qu'il y a d'interessant c'est que ca compile avec

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    test2.c: In function `main':
    test2.c:14: warning: implicit declaration of function `strtok'
    test2.c:14: warning: assignment makes pointer from integer without a cast
    et ca fonctionne quand m�me...
    Par hasard, uniquement !

    Petit oubli de ma part :
    Corrig�.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    25
    D�tails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2005
    Messages : 25
    Par d�faut
    Merci pour le code. J'ai eu un peu de peine � suivre votre logique et j'en ai retir� ce qui suit.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    #include <stdio.h>
    #include <string.h> 
     
    #define N(a) (sizeof(a)/sizeof*(a))
    #define NB_PARAM 100 
    #define STRING "request?vara=resa&varb=resb&varc=resc"
    int main() {
    	char s[] = STRING;
    	char *pp[NB_PARAM];
    	size_t i = 1;
     
    	// Analyse
    	if((pp[0] = strtok(s, "?=&")))
    		for(i=1; (pp[i] = strtok(NULL, "?=&")) != NULL && i < (NB_PARAM); i++)
    		  printf("i = %d\n",i);	 
    	pp[i] = NULL;   
     
    	// Resultats
    	i = 0;
    	for(i=0; pp[i] != NULL; i++)
    		printf("pp[%d] = %s\n",i,pp[i]);
       return 0;
    }
    Pourquoi utilisez-vous %u et non %d et pourquoi passez-vous par un pointeur char *n ?

    Dans tous les cas je ne connaissais pas strtok, c'est excellent, merci

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    25
    D�tails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2005
    Messages : 25
    Par d�faut
    Apr�s une seconde optimisation:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #include <stdio.h>
    #include <string.h> 
     
    int ParseQuestion(char* question, char **pp) {
       int i = 1;	                                                 
    	if((pp[0] = strtok(question, "?=&"))) 
    		for(i=1; (pp[i] = strtok(NULL, "?=&")) != NULL; i++);
    	pp[i] = NULL;   
    	if(i==1) return -1; 
    	return 0; 
    }
     
    int main() {
    	int i=0;
    	char lala[] = "request?vara=resa&varb=resb&varc=resc";
    	char *res[100]; 
    	if(ParseQuestion(lala, res)) perror("Erreur"); 
    	for(i=0; res[i] != NULL; i++)
    		printf("res[%d] = %s\n",i,res[i]);   
       return 0;
    }

  9. #9
    R�dacteur/Mod�rateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par d�faut
    Simple remarque, car Emmanuel n'a �videmment pas fait l'erreur :
    il faut effectivement d�clarer
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    char s[] = "request?foo=bar&bar=foo";
    et non pas
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    char *s = "request?foo=bar&bar=foo";
    car dans le second cas s pointe vers une adresse m�moire non modifiable et le strtok plante, alors que s[] d�clare un tableau tab, dans une zone m�moire modifiable initialis�e avec la cha�ne "request?foo=bar&bar=foo" et la le strtok peut travailler sans probl�me
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas �tre meilleur que les autres, il faut �tre meilleur que soi." Albert Jacquard
    "Ceux qui savent o� ils ont pos� leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, �a vous changera les id�es !
    Ma page Prolog
    Mes codes sources comment�s

    Mon avatar : La Madeleine � la veilleuse de Georges de La Tour

  10. #10
    Expert �minent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retrait�
    Inscrit en
    D�cembre 2003
    Messages
    14 512
    D�tails du profil
    Informations personnelles :
    �ge : 68
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : Retrait�

    Informations forums :
    Inscription : D�cembre 2003
    Messages : 14 512
    Par d�faut
    Citation Envoy� par canard75
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    #include <stdio.h>
    #include <string.h> 
     
    #define N(a) (sizeof(a)/sizeof*(a))
    #define NB_PARAM 100 
    #define STRING "request?vara=resa&varb=resb&varc=resc"
    int main() {
    	char s[] = STRING;
    	char *pp[NB_PARAM];
    	size_t i = 1;
     
    	// Analyse
    	if((pp[0] = strtok(s, "?=&")))
    		for(i=1; (pp[i] = strtok(NULL, "?=&")) != NULL && i < (NB_PARAM); i++)
    		  printf("i = %d\n",i);	 
    	pp[i] = NULL;   
     
    	// Resultats
    	i = 0;
    	for(i=0; pp[i] != NULL; i++)
    		printf("pp[%d] = %s\n",i,pp[i]);
       return 0;
    }
    Pourquoi utilisez-vous %u et non %d et pourquoi passez-vous par un pointeur char *n ?
    J'utilise "%u" pour afficher i qui est de type size_t, c'est � dire entier non sign�. J'avais ajout� le cast (unsigned) pour assurer la coh�rence entre la variable et son formatteur. Il ne faut la le retirer comme �a...

    Quand � 'char *n' ? Je ne vois pas de quoi tu parles...
    Dans tous les cas je ne connaissais pas strtok, c'est excellent, i
    Pour une maquette, �a va, mais dans l'industrie, on utilise la fonction POSIX strtok_r() pour des questions de r�entranc et d'appels imbriqu�s...

    Les fonctions POSIX, bien que non standards, sont tr�s portables.

    J'utilise aussi ceci :

    http://emmanuel-delahaye.developpez.com/clib.htm
    Module TOK

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    25
    D�tails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2005
    Messages : 25
    Par d�faut
    Dans mon cas cela compile et s'execute normalement, Il y a quand m�me une erreur ?

  12. #12
    Expert �minent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retrait�
    Inscrit en
    D�cembre 2003
    Messages
    14 512
    D�tails du profil
    Informations personnelles :
    �ge : 68
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : Retrait�

    Informations forums :
    Inscription : D�cembre 2003
    Messages : 14 512
    Par d�faut
    Citation Envoy� par canard75
    Dans mon cas cela compile et s'execute normalement, Il y a quand m�me une erreur ?
    Oui. Pour qu'un programme soit correct :
    • Il ne doit pas y avoir de comportement ind�fini. Or cet erreur de cast en est un. Le probl�me d'un comportement ind�fini est que son effet n'est pas forc�ment visible, ce qui le rend extr�ment dangereux (en g�n�ral il se manifeste le jour de la d�mo devant le client ou le grand patron... Loi de Murphy...)
    • Ensuite, il ne doit pas y avoir d'erreur de compilation ni de warnings (non expliqu�s).
    • Enfin, le comportement doit �tre conforme aux attentes.

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    25
    D�tails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2005
    Messages : 25
    Par d�faut
    Ok compris

  14. #14
    Expert confirm�

    Avatar de fearyourself
    Homme Profil pro
    Ing�nieur Informaticien Senior
    Inscrit en
    D�cembre 2005
    Messages
    5 121
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activit� : Ing�nieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : D�cembre 2005
    Messages : 5 121
    Par d�faut
    J'attire votre attention sur les pages man de strtok:

    Never use these functions. If you do, note that:

    These functions modify their first argument.

    These functions cannot be used on constant strings.

    The identity of the delimiting character is lost.

    The strtok() function uses a static buffer while parsing, so it's not thread safe. Use
    strtok_r() if this matters to you.
    Jc

    PS: d�sol� je les ai en anglais seulement...

  15. #15
    R�dacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de donn�es
    Inscrit en
    Juin 2004
    Messages
    5 840
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    �ge : 42
    Localisation : France

    Informations professionnelles :
    Activit� : Administrateur de base de donn�es

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par d�faut
    Citation Envoy� par fearyourself
    PS: d�sol� je les ai en anglais seulement...
    �vitez au maximum d'utiliser cette fonction. Sinon, prenez note des informations suivantes :

    Cette fonction modifie son premier argument.

    Les caract�res de s�paration sont surcharg�s, leur identit� est donc perdue.

    Cette fonction ne doit pas �tre invoqu�e sur une cha�ne constante.

    La fonction strtok() utilise un buffer statique et n'est donc pas s�re dans un contexte multithread. Dans ce cas il vaut mieux utiliser strtok_r().
    Du momment que t'es au courant �a ne g�ne pas.

Discussions similaires

  1. [PHP 5.3] R�cup�rer des donn�es issues d'une requ�te http GET
    Par Pierrea4564 dans le forum Langage
    R�ponses: 2
    Dernier message: 24/09/2013, 08h15
  2. [LINUX] Simuler une requ�te HTTP POST ou GET
    Par Anified dans le forum Linux
    R�ponses: 1
    Dernier message: 05/02/2007, 16h11
  3. [Tableaux] Passer un tableau dans une requ�te HTTP ??
    Par haffouff dans le forum Langage
    R�ponses: 2
    Dernier message: 09/05/2006, 17h17
  4. R�ponses: 1
    Dernier message: 21/03/2006, 14h29
  5. [HTTP]Cr�er une requ�te http multipart/related
    Par jothi35 dans le forum Servlets/JSP
    R�ponses: 2
    Dernier message: 05/04/2005, 15h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo