13 votes

Comment accéder à un corps de requête POST en utilisant une application fastcgi C/C++

Je suis en train d'utiliser une bibliothèque de http://fastcgi.com/ dans une application C++ en tant que backend et le serveur web nginx en tant que frontend.

J'arrive à poster des fichiers à partir d'un formulaire HTML avec succès et je peux voir les fichiers temporaires du côté du serveur nginx. Mais je n'arrive pas à comprendre comment accéder au corps de la requête POST multipart en utilisant fastcgi_stdio. Voici mon formulaire HTML.

        Serveur de Test

Mon fichier de configuration nginx :

location /upload {

# Transférer le corps de la requête modifié vers cet emplacement
upload_pass @test;

# Stocker les fichiers dans ce répertoire
# Le répertoire est hashé, les sous-répertoires 0 1 2 3 4 5 6 7 8 9 doivent exister
upload_store /www/test;

# Autoriser les fichiers téléchargés à être lus uniquement par l'utilisateur
upload_store_access user:rw group:r all:r;

# Définir les champs spécifiés dans le corps de la requête
upload_set_form_field $upload_field_name.name $upload_file_name;
upload_set_form_field $upload_field_name.content_type "$upload_content_type";
upload_set_form_field $upload_field_name.path "$upload_tmp_path";

# Informer le backend du hash et de la taille d'un fichier
upload_aggregate_form_field "$upload_field_name.md5" "$upload_file_md5";
upload_aggregate_form_field "$upload_field_name.size" "$upload_file_size";

upload_pass_form_field "^submit$|^description$";
upload_cleanup 400 404 499 500-505;
}

include fastcgi.conf;

# Transférer le corps de la requête modifié vers un backend
location @test {
        fastcgi_pass  localhost:8080
}

Maintenant, comment puis-je gérer/récupérer le corps de la requête POST dans mon application C++ fastcgi et comment l'écrire correctement du côté de l'application fastcgi ?

Y a-t-il un meilleur module fastcgi pour y parvenir ?

Merci.

12voto

MvG Points 22342

Vous pouvez accéder au corps de la requête POST via le flux FCGI_stdin. Par exemple, vous pouvez lire un octet à la fois en utilisant FCGI_getchar, qui est une forme abrégée de FCGI_fgetc(FCGI_stdin). Vous pouvez également lire de plus gros morceaux de données en une seule fois en utilisant FCGI_fread. J'ai trouvé tout cela en regardant la source. Ces sources font souvent référence à quelque chose appelé ”H&S”—ceci signifie "Harbison and Steele", les auteurs du livre C: A Reference Manual, les numéros font référence aux chapitres et sections de ce livre.

Et au fait, cela s'appelle ”stdio” pour “STanDard Input/Output”. Pas “studio”. Les fonctions devraient se comporter principalement comme leurs homologues sans le préfixe FCGI_. Pour plus de détails, consultez les pages de manuel de getchar, fread et ainsi de suite.

Une fois que vous avez les octets dans votre application, vous pouvez les écrire dans un fichier, soit en utilisant les opérations stdio normales, soit en utilisant des fichiers ouverts via FCGI_fopen. Cependant, notez que le flux d'entrée ne correspondra pas directement au contenu d'un fichier téléversé. A la place, un encodage MIME est utilisé pour transférer toutes les données de formulaire, y compris les fichiers. Vous devrez analyser ce flux si vous voulez accéder aux données du fichier.

4voto

nightcoder Points 269

Utilisez ceci :

char * method = getenv("REQUEST_METHOD");
if (!strcmp(method, "POST")) {
    int ilen = atoi(getenv("CONTENT_LENGTH"));
    char *bufp = malloc(ilen);
    fread(bufp, ilen, 1, stdin);
    printf("Les données POST sont

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X