Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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));
}