static void rb_curl_multi_read_info(VALUE self, CURLM *multi_handle) { int msgs_left, result; CURLMsg *msg; CURLcode ecode; CURL *easy_handle; ruby_curl_easy *rbce = NULL; // VALUE finished = rb_ary_new(); /* check for finished easy handles and remove from the multi handle */ while ((msg = curl_multi_info_read(multi_handle, &msgs_left))) { if (msg->msg != CURLMSG_DONE) { continue; } easy_handle = msg->easy_handle; result = msg->data.result; if (easy_handle) { ecode = curl_easy_getinfo(easy_handle, CURLINFO_PRIVATE, (char**)&rbce); if (ecode != 0) { raise_curl_easy_error_exception(ecode); } //printf( "finished: 0x%X\n", (long)rbce->self ); //rb_ary_push(finished, rbce->self); ruby_curl_multi_remove( self, rbce->self ); if (rbce->complete_proc != Qnil) { rb_funcall( rbce->complete_proc, idCall, 1, self ); } long response_code = -1; curl_easy_getinfo(rbce->curl, CURLINFO_RESPONSE_CODE, &response_code); if (result != 0) { if (rbce->failure_proc != Qnil) { rb_funcall( rbce->failure_proc, idCall, 1, rbce->self ); } } else if (rbce->success_proc != Qnil && ((response_code >= 200 && response_code < 300) || response_code == 0)) { /* NOTE: we allow response_code == 0, in the case the file is being read from disk */ rb_funcall( rbce->success_proc, idCall, 1, rbce->self ); } else if (rbce->failure_proc != Qnil && (response_code >= 300 && response_code < 600)) { rb_funcall( rbce->failure_proc, idCall, 1, rbce->self ); } } else { //printf( "missing easy handle\n" ); } } /* while (RARRAY(finished)->len > 0) { //printf( "finished handle\n" ); ruby_curl_multi_remove( self, rb_ary_pop(finished) ); } */ }
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; CURLcode ecode = curl_easy_getinfo(easy_handle, CURLINFO_PRIVATE, (char**)&easy); Data_Get_Struct(easy, ruby_curl_easy, rbce); if (ecode != 0) { raise_curl_easy_error_exception(ecode); } rbce->last_result = result; /* save the last easy result code */ ruby_curl_multi_remove( self, easy ); if (rbce->complete_proc != Qnil) { rb_funcall( rbce->complete_proc, idCall, 1, easy ); } curl_easy_getinfo(rbce->curl, CURLINFO_RESPONSE_CODE, &response_code); if (result != 0) { if (rbce->failure_proc != Qnil) { rb_funcall( rbce->failure_proc, idCall, 2, easy, rb_curl_easy_error(result) ); } } else if (rbce->success_proc != Qnil && ((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( rbce->success_proc, idCall, 1, easy ); } else if (rbce->failure_proc != Qnil && (response_code >= 300 && response_code <= 999)) { rb_funcall( rbce->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"); } }