int request_worker(worker_t *worker, GError **error) { request_t *request = NULL; EXTRA_ASSERT(worker != NULL); EXTRA_ASSERT(worker->data.session != NULL); request = g_malloc0(sizeof(request_t)); if (!read_request_from_message((message_t*)worker->data.session, request, error)) { GSETERROR(error, "Failed to parse message to build request"); request_clean(request); return 0; } /* Free the message and put the request in session */ message_cleanup(worker); worker->data.session = request; worker->clean = request_cleanup; worker->func = g_hash_table_lookup(requests, request->cmd); if (!worker->func) { GSETERROR(error, "No handler found for request [%s]", request->cmd); return 0; } if (!change_fd_events_in_io_scheduler(worker, EPOLLOUT, error)) { GSETERROR(error, "Failed to change polling event on fd %d", worker->data.fd); return 0; } return 1; }
void read_handler(aeEventLoop *el, int fd, void *privdata, int mask) { int err; int nread; (void) mask; char buf[BUF_SIZE]={0}; struct request *req = (struct request*)privdata; nread = read(fd, buf, BUF_SIZE); if (nread < 1) { request_free(req); aeDeleteFileEvent(el, fd, AE_WRITABLE); aeDeleteFileEvent(el, fd, AE_READABLE); close(fd); _clicount--; return; } else { request_append(req, buf, nread); err = request_parse(req); if (err == -1) { request_free(req); aeDeleteFileEvent(el, fd, AE_WRITABLE); aeDeleteFileEvent(el, fd, AE_READABLE); close(fd); _clicount--; return; } if (err == 1) { _process_cmd(fd, req); request_clean(req); } } }