/** * The GSource dispatch() method implementation. The callback isn't * used, because we're handling all events directly. */ static gboolean curl_source_dispatch(G_GNUC_UNUSED GSource *source, G_GNUC_UNUSED GSourceFunc callback, G_GNUC_UNUSED gpointer user_data) { if (http_multi_perform()) http_multi_info_read(); return true; }
void http_client_request(const char *url, const char *post_data, const struct http_client_handler *handler, void *ctx) { struct http_request *request = g_new(struct http_request, 1); CURLcode code; CURLMcode mcode; bool success; request->handler = handler; request->handler_ctx = ctx; /* create a CURL request */ request->curl = curl_easy_init(); if (request->curl == NULL) { g_free(request); GError *error = g_error_new_literal(curl_quark(), 0, "curl_easy_init() failed"); handler->error(error, ctx); return; } mcode = curl_multi_add_handle(http_client.multi, request->curl); if (mcode != CURLM_OK) { curl_easy_cleanup(request->curl); g_free(request); GError *error = g_error_new_literal(curl_quark(), 0, "curl_multi_add_handle() failed"); handler->error(error, ctx); return; } /* .. and set it up */ curl_easy_setopt(request->curl, CURLOPT_USERAGENT, "mpdscribble/" VERSION); curl_easy_setopt(request->curl, CURLOPT_WRITEFUNCTION, http_request_writefunction); curl_easy_setopt(request->curl, CURLOPT_WRITEDATA, request); curl_easy_setopt(request->curl, CURLOPT_FAILONERROR, true); curl_easy_setopt(request->curl, CURLOPT_ERRORBUFFER, request->error); curl_easy_setopt(request->curl, CURLOPT_BUFFERSIZE, 2048); if (file_config.proxy != NULL) curl_easy_setopt(request->curl, CURLOPT_PROXY, file_config.proxy); request->post_data = g_strdup(post_data); if (request->post_data != NULL) { curl_easy_setopt(request->curl, CURLOPT_POST, true); curl_easy_setopt(request->curl, CURLOPT_POSTFIELDS, request->post_data); } code = curl_easy_setopt(request->curl, CURLOPT_URL, url); if (code != CURLE_OK) { curl_multi_remove_handle(http_client.multi, request->curl); curl_easy_cleanup(request->curl); g_free(request); GError *error = g_error_new_literal(curl_quark(), code, "curl_easy_setopt() failed"); handler->error(error, ctx); return; } request->body = g_string_sized_new(256); http_client.requests = g_slist_prepend(http_client.requests, request); /* initiate the transfer */ success = http_multi_perform(); if (!success) { http_client.requests = g_slist_remove(http_client.requests, request); http_request_free(request); GError *error = g_error_new_literal(curl_quark(), code, "http_multi_perform() failed"); handler->error(error, ctx); return; } if (!http_client.locked) http_multi_info_read(); }
void http_client_request(const char *url, const char *post_data, http_client_callback_t *callback, void *data) { struct http_request *request = g_new(struct http_request, 1); CURLcode code; CURLMcode mcode; bool success; request->callback = callback; request->callback_data = data; /* create a CURL request */ request->curl = curl_easy_init(); if (request->curl == NULL) { g_free(request); callback(0, NULL, data); return; } mcode = curl_multi_add_handle(http_client.multi, request->curl); if (mcode != CURLM_OK) { curl_easy_cleanup(request->curl); g_free(request); callback(0, NULL, data); return; } /* .. and set it up */ curl_easy_setopt(request->curl, CURLOPT_USERAGENT, "mpdcron/" VERSION); curl_easy_setopt(request->curl, CURLOPT_WRITEFUNCTION, http_request_writefunction); curl_easy_setopt(request->curl, CURLOPT_WRITEDATA, request); curl_easy_setopt(request->curl, CURLOPT_FAILONERROR, true); curl_easy_setopt(request->curl, CURLOPT_ERRORBUFFER, request->error); curl_easy_setopt(request->curl, CURLOPT_BUFFERSIZE, 2048); if (file_config.proxy != NULL) curl_easy_setopt(request->curl, CURLOPT_PROXY, file_config.proxy); request->post_data = g_strdup(post_data); if (request->post_data != NULL) { curl_easy_setopt(request->curl, CURLOPT_POST, true); curl_easy_setopt(request->curl, CURLOPT_POSTFIELDS, request->post_data); } code = curl_easy_setopt(request->curl, CURLOPT_URL, url); if (code != CURLE_OK) { curl_multi_remove_handle(http_client.multi, request->curl); curl_easy_cleanup(request->curl); g_free(request); callback(0, NULL, data); return; } request->body = g_string_sized_new(256); http_client.requests = g_slist_prepend(http_client.requests, request); /* initiate the transfer */ success = http_multi_perform(); if (!success) { http_client.requests = g_slist_remove(http_client.requests, request); http_request_free(request); callback(0, NULL, data); return; } http_multi_info_read(); }