示例#1
0
void * conn_handler(void * arr)
{
    int client_fd = *((int*)arr);
    int keep_alive = 1;
    while (keep_alive)
    {


	http_t req;
	if (http_read(&req,client_fd) == -1)
	{
	    http_free(&req);
	    break;
	}
	const char * rh = http_get_status(&req);
	char * uri = process_http_header_request(rh);
	const char * conn_type = http_get_header(&req, "Connection");
	if (conn_type)
	{
	    if (strcasecmp("keep-alive",conn_type))
		keep_alive = 0;
	    //free(conn_type);
	}
	else
	{
	    keep_alive = 0;
	}
	char * output = NULL;
	if (uri)
	{
	    size_t size;
	    const char * body = http_get_body(&req,&size);
            jsonreq_t request;
            request.key = NULL;
            request.value = NULL;
            parsereq(body,&request);

            jsonres_t response = process_request(uri,request);

	    
            generateres(&output,&response,uri);
            if (request.key) free(request.key);
            if (request.value) free(request.value);
            //if (request) free(request);
	    free(uri);
	}
	char * ret_str = "";
        asprintf(&ret_str,"HTTP/1.1 200 OK\r\nContent-Type: application/json\r\nContent-Length: %zu\r\n\r\n",strlen(output));
	send(client_fd,ret_str,strlen(ret_str),0);
	send(client_fd,output,strlen(output),0);
	if (output) free(output);
        if (ret_str) free(ret_str);
	http_free(&req);
    }
    free(arr);
    close(client_fd);
    return NULL;
}
示例#2
0
int http_controller_request(void *cls, struct MHD_Connection *connection,
        const char *url,
        const char *method, const char *version,
        const char *upload_data,
        size_t *upload_data_size, void **con_cls)
{

    char *page = NULL;

    if(!strcmp(method, "GET"))
    {
        if(!strcmp(url, "/"))
            page = http_get_index();
	else if (!strcmp(url, "/playlist"))
	    page = http_get_playlist();
	else if (!strcmp(url, "/status"))
	    page = http_get_status();
	else if (!strcmp(url, "/current"))
	    page = http_get_current();
	else if (!strncmp(url, "/playlist/", 10))
	{
	    char *request = strdup(url);
	    page = http_get_playlist_item(request);
	    free(request);
	}

    } else if(!strcmp(method, "POST"))
    {
        //Calculate content_length
        int content_length = 0;
        MHD_get_connection_values(connection, MHD_HEADER_KIND, http_controller_headers, &content_length);
        
        //We need more post data
        if(content_length > *upload_data_size)
            return MHD_YES;
	
	//Create string from upload_data
	char *strdata = malloc(content_length + 1);
	strncpy(strdata, upload_data, content_length);
	strdata[content_length] = 0;

        //Parse JSON
        json_value *data = json_parse(strdata);
	free(strdata);
	strdata = NULL;

	//Ignore malformed JSON
	if(data)
	{
            //Execute commands
            if(!strcmp(url, "/status"))
                page = http_post_status(data);
	    else if(!strcmp(url, "/current"))
		page = http_post_current(data);
	    else if(!strcmp(url, "/playlist"))
		page = http_post_playlist(data);
	    else if (!strncmp(url, "/playlist/", 10))
	    {
	        char *request = strdup(url);
	        page = http_post_playlist_item(request, data);
	        free(request);
	    }

            json_value_free(data);
            gui_update_playlist();
	}
    } else if(!strcmp(method, "DELETE"))
    {
	if(!strcmp(url, "/playlist"))
	    http_delete_playlist();
	else if(!strncmp(url, "/playlist/", 10))
	{
	    char *request = strdup(url);
	    page = http_delete_playlist_item(request);
	    free(request);
	}
        gui_update_playlist();
    }

    if(page == NULL)
            page = strdup("404 Not Found!");

    struct MHD_Response *response;
    response = MHD_create_response_from_data (strlen (page),
        (void*) page, true, false);

    int ret = MHD_queue_response (connection, MHD_HTTP_OK, response);
    MHD_destroy_response (response);

    return ret;
}