Je suis en train de faire une réponse chunked (de gros fichiers) en libevent cette façon ::réponses Chunked à libevent2
evhttp_send_reply_start(request, HTTP_OK, "OK");
int fd = open("filename", O_RDONLY);
size_t fileSize = <get_file_size>;
struct evbuffer *databuff = NULL;
for (off_t offset = 0;offset < fileSize;)
{
databuff = evbuffer_new();
size_t bytesLeft = fileSize - offset;
size_t bytesToRead = bytesLeft > MAX_READ_SIZE ? MAX_READ_SIZE : bytesLeft;
evbuffer_add_file(databuff, fd, offset, bytesToRead);
offset += bytesToRead;
evhttp_send_reply_chunk(request, databuff); // send it
evbuffer_free(databuff); // destroy it
}
evhttp_send_reply_end(request);
fclose(fptr);
problème est ce que j'ai le sentiment que la add_file est asynchrone de sorte que le 3ème ou si evhttp_send_reply_chunk
me donne une erreur (ou quelque chose de similaire):
[warn] evhttp_send_chain fermé (45): descripteur de fichier incorrect
J'ai défini MAX_READ_SIZE
comme étant 8
pour tester réellement le codage de transfert par morceaux. J'ai remarqué qu'il y avait une méthode evhttp_request_set_chunked_cb (struct evhttp_request *, void(*cb)(struct evhttp_request *, void *))
que je pouvais utiliser, mais je n'ai trouvé aucun exemple sur la façon d'utiliser.
Par exemple, comment pourrais-je passer un argument au rappel? L'argument semble être le même que celui qui a été passé au gestionnaire de requêtes, ce qui n'est pas ce que je veux, parce que je veux créer un objet qui contient le descripteur de fichier et le décalage de fichier que j'envoie.
Appréciez toute l'aide.
Merci à l'avance Sri
Sri, s'il vous plaît mettez à jour votre question avec cette note et acceptez une réponse (ou ajoutez des commentaires à une question), essayez de ne pas ajouter de clarification dans d'autres réponses – Jehiah