Comment lire evbuffer et le mettre dans une chaîne (char *) dans libevent

J’utilise libevent et son API http pour écrire un simple serveur HTTP capable d’écrire des servlets C. Ce servlet fonctionne correctement avec GET mais maintenant j’envoie des données avec POST et je voudrais lire le tampon d’événement entrant evb. Je voudrais imprimer / inspecter les données présentes dans evb mais je ne peux pas. Savez-vous comment je peux mettre les données dans evb (evbuffer) dans la variable char *? Je n’ai vu que des méthodes pour manipuler les tampons mais ne pas le lire. J’ai essayé:

evb->

Ceci est le code:

#include  #include "servlet.h" void servlet(struct evhttp_request *req, struct evbuffer *evb) { time_t now; time(&now); evbuffer_add_printf(evb, "\n \n" " %s\n" " \n" " \n" " 

%s

\n" "

Current time is: %s

", "C servlet engine", "C servlet", ctime(&now)); evhttp_add_header(evhttp_request_get_output_headers(req), "Content-Type", "text/html"); evhttp_send_reply(req, 200, "OK", evb); } I am trying this void servlet(struct evhttp_request *req, struct evbuffer *evb) { size_t len = evbuffer_get_length(evhttp_request_get_input_buffer(req)); struct evbuffer *in_evb = evhttp_request_get_input_buffer(req); char *data; evbuffer_copyout(in_evb, data, len);

mais je reçois une erreur de bus: 10 (je suis sur un mac)

Sonne comme vous voulez utiliser

 ev_ssize_t evbuffer_copyout(struct evbuffer *buf, void *data, size_t datalen) 

Il copie le contenu du tampon (au maximum octets de datalen ) dans les data zone de mémoire. C’est documenté dans le livre libevent

voici une méthode qui fonctionne:

 static void echo_read_cb(struct bufferevent *bev, void *ctx) { /* This callback is invoked when there is data to read on bev. */ struct evbuffer *input = bufferevent_get_input(bev); struct evbuffer *output = bufferevent_get_output(bev); size_t len = evbuffer_get_length(input); char *data; data = malloc(len); evbuffer_copyout(input, data, len); printf("we got some data: %s\n", data); /* Copy all the data from the input buffer to the output buffer. */ evbuffer_add_buffer(output, input); free(data); } 

Selon le code source dans buffer.h de libevent, nous devrions utiliser

 int evbuffer_remove(struct evbuffer *buf, void *data, size_t datlen); 

au lieu de

 ev_ssize_t evbuffer_copyout(struct evbuffer *buf, void *data_out, size_t datlen); 

Voici le code emprunté à buffer.h

 /** Read data from an evbuffer and drain the bytes read. If more bytes are requested than are available in the evbuffer, we only extract as many bytes as were available. @param buf the evbuffer to be read from @param data the destination buffer to store the result @param datlen the maximum size of the destination buffer @return the number of bytes read, or -1 if we can't drain the buffer. */ int evbuffer_remove(struct evbuffer *buf, void *data, size_t datlen); /** Read data from an evbuffer, and leave the buffer unchanged. If more bytes are requested than are available in the evbuffer, we only extract as many bytes as were available. @param buf the evbuffer to be read from @param data_out the destination buffer to store the result @param datlen the maximum size of the destination buffer @return the number of bytes read, or -1 if we can't drain the buffer. */ ev_ssize_t evbuffer_copyout(struct evbuffer *buf, void *data_out, size_t datlen);