Skip to content

Instantly share code, notes, and snippets.

@roxlu
Created January 6, 2014 11:11
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save roxlu/8281292 to your computer and use it in GitHub Desktop.
Save roxlu/8281292 to your computer and use it in GitHub Desktop.
CURL retrieve HTML into string
size_t weather_write_data(void* ptr, size_t size, size_t nmemb, void* str) {
std::string* s = static_cast<std::string*>(str);
std::copy((char*)ptr, (char*)ptr + (size + nmemb), std::back_inserter(*s));
return size * nmemb;
}
std::string weather_download_yahoo_rss() {
std::string result;
std::string url = "http://weather.yahooapis.com/forecastrss?w=10242&u=c"; // w=10242 is Aberaron
CURL* curl = NULL;
CURLcode res;
curl = curl_easy_init();
if(!curl) {
printf("Error: cannot initialize CURL.\n");
return result;
}
res = curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
if(res != CURLE_OK) {
printf("Cannot set curl url.\n");
goto curl_error;
}
res = curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
if(res != CURLE_OK) {
printf("Cannot set curl follow location flag.\n");
goto curl_error;
}
res = curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, weather_write_data);
if(res != CURLE_OK) {
printf("Cannot set the weather write function.\n");
goto curl_error;
}
res = curl_easy_setopt(curl, CURLOPT_WRITEDATA, &result);
if(res != CURLE_OK) {
printf("Cannot set the curl write data.\n");
goto curl_error;
}
res = curl_easy_perform(curl);
if(res != CURLE_OK) {
printf("Cannot perform curl.\n");
goto curl_error;
}
printf("Got: %s\n", result.c_str());
printf("performed!\n");
return result;
curl_error:
curl_easy_cleanup(curl);
curl = NULL;
return result;
}
void weather_thread(void* user) {
Weather* w = static_cast<Weather*>(user);
std::vector<WeatherTask*> work;
bool must_stop = false;
printf("weather thread.\n");
while(true) {
uv_mutex_lock(&w->task_mutex);
while(w->tasks.size() == 0) {
uv_cond_wait(&w->task_cv, &w->task_mutex);
}
std::copy(w->tasks.begin(), w->tasks.end(), std::back_inserter(work));
w->tasks.clear();
uv_mutex_unlock(&w->task_mutex);
for(std::vector<WeatherTask*>::iterator it = work.begin(); it != work.end(); ++it) {
WeatherTask* task = *it;
if(task->type == WEATHER_TASK_FETCH_RSS) {
weather_download_yahoo_rss();
delete task;
task = NULL;
}
else if(task->type == WEATHER_TASK_STOP) {
must_stop = true;
delete task;
task = NULL;
break;
}
}
work.clear();
if(must_stop) {
break;
}
}
printf("Weather thread stopped.\n");
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment