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; }
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; }