PRIVATE uint16_t processFeed(auto_handle *session, rss_feed* feed, uint8_t firstrun) { HTTPResponse *response = NULL; CURL *curl_session = NULL; uint32_t item_count = 0; response = getRSSFeed(feed, &curl_session); dbg_printf(P_INFO2, "[processFeed] curl_session=%p", (void*)curl_session); if(!curl_session && response != NULL) { dbg_printf(P_ERROR, "curl_session == NULL but response != NULL"); abort(); } if (response) { if(response->responseCode == 200 && response->data) { simple_list items = parse_xmldata(response->data, response->size, &item_count, &feed->ttl); if(firstrun) { session->max_bucket_items += item_count; dbg_printf(P_INFO2, "History bucket size changed: %d", session->max_bucket_items); } processRSSList(session, items, feed->id); freeList(&items, freeFeedItem); } HTTPResponse_free(response); closeCURLSession(curl_session); } return item_count; }
int16_t verifyProwlAPIKey(const char* apikey) { int16_t result = -1; char url[128]; HTTPResponse *response = NULL; CURL *curl_session = NULL; if(apikey) { snprintf(url, 128, "%s%s?apikey=%s", PROWL_URL, PROWL_VERIFY, apikey); response = getHTTPData(url, NULL, &curl_session); if(response) { if(response->responseCode == 200) { dbg_printf(P_INFO, "Prowl API key '%s' is valid", apikey); result = 1; } else { dbg_printf(P_ERROR, "Error: Prowl API key '%s' is invalid (%d)!", apikey, response->responseCode); result = -response->responseCode; } HTTPResponse_free(response); } closeCURLSession(curl_session); } return result; }
/** \brief Upload data to a specified URL. * * \param url Path to where data shall be uploaded * \param auth (Optional) authentication information in the form of "user:password" * \param data Data that shall be uploaded * \param data_size size of the data * \return Web server response */ PUBLIC HTTPResponse* sendHTTPData(const char *url, const char* auth, const void *data, uint32_t data_size) { CURL *curl_handle = NULL; CURLcode res; long rc, tries = 2, len; WebData* response_data = NULL; HTTPResponse* resp = NULL; char sessionKey[MAXLEN]; struct curl_slist * headers = NULL; if( !url || !data ) { return NULL; } response_data = WebData_new(url); do { --tries; WebData_clear(response_data); if( curl_handle == NULL) { if(gbGlobalInitDone == FALSE) { curl_global_init(CURL_GLOBAL_ALL); gbGlobalInitDone = TRUE; } if( ( curl_handle = am_curl_init(auth, TRUE) ) ) { curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, response_data); curl_easy_setopt(curl_handle, CURLOPT_WRITEHEADER, response_data); //Transmission-specific options for HTTP POST if(strstr(response_data->url, "transmission") != NULL) { curl_easy_setopt(curl_handle, CURLOPT_HEADERFUNCTION, parse_Transmission_response ); headers = curl_slist_append(headers, "Content-Type: application/json"); if( gSessionID ) { if((len = snprintf(sessionKey, MAXLEN, "X-Transmission-Session-Id: %s", gSessionID)) > 0) { sessionKey[len] = '\0'; } headers = curl_slist_append(headers, sessionKey); } curl_easy_setopt( curl_handle, CURLOPT_HTTPHEADER, headers ); } curl_easy_setopt(curl_handle, CURLOPT_URL, response_data->url); } else { dbg_printf(P_ERROR, "am_curl_init() failed"); break; } } curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDS, data); curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDSIZE, data_size); if( ( res = curl_easy_perform(curl_handle) ) ) { dbg_printf(P_ERROR, "Upload to '%s' failed: %s", url, curl_easy_strerror(res)); break; } else { curl_easy_getinfo(curl_handle, CURLINFO_RESPONSE_CODE, &rc); dbg_printf(P_INFO2, "response code: %ld", rc); if(rc == 409) { if(gSessionID) { dbg_printf(P_DBG, "Error code 409, session ID: %s", gSessionID); } else { dbg_printf(P_ERROR, "Error code 409, no session ID"); } closeCURLSession( curl_handle ); curl_slist_free_all( headers ); headers = NULL; curl_handle = NULL; } else { resp = HTTPResponse_new(); curl_easy_getinfo(curl_handle, CURLINFO_RESPONSE_CODE, &resp->responseCode); //copy data if present if(response_data->response->data) { resp->size = response_data->response->buffer_pos; resp->data = am_strndup(response_data->response->data, resp->size); } //copy filename if present if(response_data->content_filename) { resp->content_filename = am_strdup(response_data->content_filename); } break; } } } while(tries > 0); /* cleanup */ closeCURLSession(curl_handle); if(headers) { curl_slist_free_all(headers); } WebData_free(response_data); return resp; }