Premier essai – Mongoose

Ce soir j’ai testé Mongoose, un petit framework ultra léger en C.
Voilà ce que j’ai apprécié dans ce projet :
– exclusivement en C, c’est bien pour faire de l’embarqué,
– très léger, deux fichiers,
– serveur de fichiers,
– SSL, protection par mot de passe,
– marche sous Linux, Mac OS X, Windows, …

Mon premier test a consisté à faire une petite interface en Google Web Toolkit qui enverra une requête au serveur. Le serveur sera chargé de répondre un petit texte qui sera affiché. Le serveur est aussi chargé de fournir les fichiers.

Bref, un exemple tout bête mais qui m’a permis de prendre en main les deux outils. Le résultat est plutôt concluant, Mongoose semble vraiment une très bonne solution pour développer des services REST en C. Le code source est très court, la preuve plus bas.

C’est pas super intéressant, mais si quelqu’un les veut je lui fait péter les sources.

#include ... standard headers ...
#include "mongoose.h"

static const char *ajax_reply_start =
 "HTTP/1.1 200 OKrn"
 "Cache: no-cachern"
 "Content-Type: text/htmlrn"
 "rn";

// A handler for the /ajax/send_message endpoint.
static void myCallback(struct mg_connection *conn,
                             const struct mg_request_info *request_info) {
 const char *text = mg_get_header(conn, "text");
 mg_printf(conn, "%s", ajax_reply_start);
 mg_printf(conn, "Mongoose says %s", text == NULL ? "send me some text" : text);

}

static void *event_handler(enum mg_event event,
                          struct mg_connection *conn,
                          const struct mg_request_info *request_info) {
 void *processed = "yes";

 if (event == MG_NEW_REQUEST) {
   if (strcmp(request_info->uri, "/myCallback") == 0) {
     myCallback(conn, request_info);
   } else {
     // No suitable handler found, mark as not processed. Mongoose will
     // try to serve the request.
     processed = NULL;
   }
 } else {
   processed = NULL;
 }

 return processed;
}

static const char *options[] = {
 "document_root", "war",
 "listening_ports", "8080",
 NULL
};

int main(void) {
 struct mg_context *ctx;

 // Setup and start Mongoose
 ctx = mg_start(&event_handler, options);
 assert(ctx != NULL);

 // Wait until enter is pressed, then exit
 printf("Simple app started on ports %s, press enter to quit.n",
        mg_get_option(ctx, "listening_ports"));
 getchar();
 mg_stop(ctx);

 return EXIT_SUCCESS;
}