static void rb_curl_mutli_handle_complete(VALUE self, CURL *easy_handle, int result) { long response_code = -1; VALUE easy; ruby_curl_easy *rbce = NULL; CURLcode ecode = curl_easy_getinfo(easy_handle, CURLINFO_PRIVATE, (char**)&easy); Data_Get_Struct(easy, ruby_curl_easy, rbce); rbce->last_result = result; /* save the last easy result code */ ruby_curl_multi_remove( self, easy ); /* after running a request cleanup the headers, these are set before each request */ if (rbce->curl_headers) { curl_slist_free_all(rbce->curl_headers); rbce->curl_headers = NULL; } if (ecode != 0) { raise_curl_easy_error_exception(ecode); } if (!rb_easy_nil("complete_proc")) { rb_funcall( rb_easy_get("complete_proc"), idCall, 1, easy ); } curl_easy_getinfo(rbce->curl, CURLINFO_RESPONSE_CODE, &response_code); if (result != 0) { if (!rb_easy_nil("failure_proc")) { rb_funcall( rb_easy_get("failure_proc"), idCall, 2, easy, rb_curl_easy_error(result) ); } } else if (!rb_easy_nil("success_proc") && ((response_code >= 200 && response_code < 300) || response_code == 0)) { /* NOTE: we allow response_code == 0, in the case of non http requests e.g. reading from disk */ rb_funcall( rb_easy_get("success_proc"), idCall, 1, easy ); } else if (!rb_easy_nil("failure_proc") && (response_code >= 300 && response_code <= 999)) { rb_funcall( rb_easy_get("failure_proc"), idCall, 2, easy, rb_curl_easy_error(result) ); } }
static void rb_curl_mutli_handle_complete(VALUE self, CURL *easy_handle, int result) { long response_code = -1; VALUE easy; ruby_curl_easy *rbce = NULL; VALUE callargs, val = Qtrue; CURLcode ecode = curl_easy_getinfo(easy_handle, CURLINFO_PRIVATE, (char**)&easy); Data_Get_Struct(easy, ruby_curl_easy, rbce); rbce->last_result = result; /* save the last easy result code */ ruby_curl_multi_remove( self, easy ); /* after running a request cleanup the headers, these are set before each request */ if (rbce->curl_headers) { curl_slist_free_all(rbce->curl_headers); rbce->curl_headers = NULL; } if (ecode != 0) { raise_curl_easy_error_exception(ecode); } if (!rb_easy_nil("complete_proc")) { callargs = rb_ary_new3(2, rb_easy_get("complete_proc"), easy); rbce->callback_active = 1; val = rb_rescue(call_status_handler1, callargs, callback_exception, Qnil); rbce->callback_active = 0; //rb_funcall( rb_easy_get("complete_proc"), idCall, 1, easy ); } curl_easy_getinfo(rbce->curl, CURLINFO_RESPONSE_CODE, &response_code); if (result != 0) { if (!rb_easy_nil("failure_proc")) { callargs = rb_ary_new3(3, rb_easy_get("failure_proc"), easy, rb_curl_easy_error(result)); rbce->callback_active = 1; val = rb_rescue(call_status_handler2, callargs, callback_exception, Qnil); rbce->callback_active = 0; //rb_funcall( rb_easy_get("failure_proc"), idCall, 2, easy, rb_curl_easy_error(result) ); } } else if (!rb_easy_nil("success_proc") && ((response_code >= 200 && response_code < 300) || response_code == 0)) { /* NOTE: we allow response_code == 0, in the case of non http requests e.g. reading from disk */ callargs = rb_ary_new3(2, rb_easy_get("success_proc"), easy); rbce->callback_active = 1; val = rb_rescue(call_status_handler1, callargs, callback_exception, Qnil); rbce->callback_active = 0; //rb_funcall( rb_easy_get("success_proc"), idCall, 1, easy ); } else if (!rb_easy_nil("redirect_proc") && (response_code >= 300 && response_code < 400)) { rbce->callback_active = 1; callargs = rb_ary_new3(3, rb_easy_get("redirect_proc"), easy, rb_curl_easy_error(result)); rbce->callback_active = 0; val = rb_rescue(call_status_handler2, callargs, callback_exception, Qnil); } else if (!rb_easy_nil("missing_proc") && (response_code >= 400 && response_code < 500)) { rbce->callback_active = 1; callargs = rb_ary_new3(3, rb_easy_get("missing_proc"), easy, rb_curl_easy_error(result)); rbce->callback_active = 0; val = rb_rescue(call_status_handler2, callargs, callback_exception, Qnil); } else if (!rb_easy_nil("failure_proc") && (response_code >= 500 && response_code <= 999)) { callargs = rb_ary_new3(3, rb_easy_get("failure_proc"), easy, rb_curl_easy_error(result)); rbce->callback_active = 1; val = rb_rescue(call_status_handler2, callargs, callback_exception, Qnil); rbce->callback_active = 0; //rb_funcall( rb_easy_get("failure_proc"), idCall, 2, easy, rb_curl_easy_error(result) ); } if (val == Qfalse) { rb_warn("uncaught exception from callback"); // exception was raised? //fprintf(stderr, "exception raised from callback\n"); } }