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; }
int write_request(worker_t *worker, GError **error) { ssize_t wl; worker_data_t *data = NULL; http_session_t *http_session; char request[HTTP_REQ_MAX_SIZE]; TRACE("Executing write_request worker"); data = &(worker->data); http_session = (http_session_t*)data->session; memset(request, '\0', HTTP_REQ_MAX_SIZE); if (data->buffer == NULL) { switch (http_session->method) { case E_GET : snprintf(request, HTTP_REQ_MAX_SIZE, "GET %s HTTP/1.0%s%s", http_session->url, EOL, EOL); break; case E_POST : break; default : break; } DEBUG("Sending HTTP request [%s]", request); data->buffer_size = strlen(request); data->buffer = g_try_malloc0(data->buffer_size); if (data->buffer == NULL) { GSETERROR(error, "Memory allocation failure"); goto error_alloc_buffer; } memcpy(data->buffer, request, data->buffer_size); } wl = write(data->fd, data->buffer + data->done, data->buffer_size - data->done); if (wl < 0) { GSETERROR(error, "Write on socket failed with error : %s", strerror(errno)); goto error_write; } data->done += wl; if (data->done >= data->buffer_size) { g_free(data->buffer); data->buffer = NULL; data->buffer_size = 0; data->done = 0; /* Schedule next worker */ worker->func = read_http_status; if (!change_fd_events_in_io_scheduler(worker, EPOLLIN, error)) { GSETERROR(error, "Failed to change polling event on fd %d", data->fd); goto error_sched; } } return(1); error_sched: error_write: g_free(data->buffer); error_alloc_buffer: return(http_session->error_handler(worker, error)); }