X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Ftransport%2Fplugin_transport_http_client.c;h=62be281abb93710a5d427d52ee4f2dbbcbda8064;hb=83b19539f4d322b43683f5838b72e9ec2c8e6073;hp=5c4726fcbc990437218ce09db8ecd3287e06cc8b;hpb=feb23c882f551a652d6c9ac8cca92811e3681f35;p=oweals%2Fgnunet.git diff --git a/src/transport/plugin_transport_http_client.c b/src/transport/plugin_transport_http_client.c index 5c4726fcb..62be281ab 100644 --- a/src/transport/plugin_transport_http_client.c +++ b/src/transport/plugin_transport_http_client.c @@ -52,9 +52,11 @@ client_log (CURL * curl, curl_infotype type, char *data, size_t size, void *cls) text[size + 1] = '\0'; } #if BUILD_HTTPS - GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "transport-https", "Client: %X - %s", cls, text); + GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "transport-https", + "Client: %X - %s", cls, text); #else - GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "transport-http", "Client: %X - %s", cls, text); + GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "transport-http", + "Client: %X - %s", cls, text); #endif } return 0; @@ -76,7 +78,7 @@ client_run (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc); * @return GNUNET_SYSERR for hard failure, GNUNET_OK for ok */ static int -client_schedule (struct Plugin *plugin) +client_schedule (struct Plugin *plugin, int now) { fd_set rs; fd_set ws; @@ -89,7 +91,7 @@ client_schedule (struct Plugin *plugin) struct GNUNET_TIME_Relative timeout; /* Cancel previous scheduled task */ - if (plugin->client_perform_task!= GNUNET_SCHEDULER_NO_TASK) + if (plugin->client_perform_task != GNUNET_SCHEDULER_NO_TASK) { GNUNET_SCHEDULER_cancel (plugin->client_perform_task); plugin->client_perform_task = GNUNET_SCHEDULER_NO_TASK; @@ -109,9 +111,12 @@ client_schedule (struct Plugin *plugin) } mret = curl_multi_timeout (plugin->client_mh, &to); if (to == -1) - timeout = GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 5); + timeout = GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 1); else timeout = GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MILLISECONDS, to); + if (now == GNUNET_YES) + timeout = GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MILLISECONDS, 1); + if (mret != CURLM_OK) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, _("%s failed at %s:%d: `%s'\n"), @@ -127,12 +132,8 @@ client_schedule (struct Plugin *plugin) plugin->client_perform_task = GNUNET_SCHEDULER_add_select (GNUNET_SCHEDULER_PRIORITY_DEFAULT, - GNUNET_SCHEDULER_NO_TASK, - timeout, - grs, - gws, - &client_run, - plugin); + GNUNET_SCHEDULER_NO_TASK, timeout, grs, gws, + &client_run, plugin); GNUNET_NETWORK_fdset_destroy (gws); GNUNET_NETWORK_fdset_destroy (grs); return GNUNET_OK; @@ -147,13 +148,14 @@ client_send (struct Session *s, struct HTTP_Message *msg) if ((s != NULL) && (s->client_put_paused == GNUNET_YES)) { #if VERBOSE_CLIENT - GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, s->plugin->name, "Client: %X was suspended, unpausing\n", s->client_put); + GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, s->plugin->name, + "Client: %X was suspended, unpausing\n", s->client_put); #endif s->client_put_paused = GNUNET_NO; - curl_easy_pause(s->client_put, CURLPAUSE_CONT); + curl_easy_pause (s->client_put, CURLPAUSE_CONT); } - client_schedule (s->plugin); + client_schedule (s->plugin, GNUNET_YES); return GNUNET_OK; } @@ -169,7 +171,6 @@ static void client_run (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) { struct Plugin *plugin = cls; - static unsigned int handles_last_run; int running; CURLMcode mret; @@ -184,35 +185,49 @@ client_run (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) running = 0; mret = curl_multi_perform (plugin->client_mh, &running); - CURLMsg * msg; + CURLMsg *msg; int msgs_left; - while ((msg = curl_multi_info_read(plugin->client_mh, &msgs_left))) - { - CURL *easy_h = msg->easy_handle; - struct Session *s = NULL; - char * d = (char *) s; - GNUNET_assert (easy_h != NULL); - - GNUNET_assert (CURLE_OK == curl_easy_getinfo(easy_h, CURLINFO_PRIVATE, &d)); - s = (struct Session *) d; - GNUNET_assert (s != NULL); - if (msg->msg == CURLMSG_DONE) - { -#if DEBUG_HTTP - GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name, - "Client: %X connection to '%s' %s ended\n", msg->easy_handle, GNUNET_i2s(&s->target), GNUNET_a2s (s->addr, s->addrlen)); -#endif - client_disconnect(s); - //GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name,"Notifying about ended session to peer `%s' `%s'\n", GNUNET_i2s (&s->target), http_plugin_address_to_string (plugin, s->addr, s->addrlen)); - notify_session_end (plugin, &s->target, s); - } + while ((msg = curl_multi_info_read (plugin->client_mh, &msgs_left))) + { + CURL *easy_h = msg->easy_handle; + struct Session *s = NULL; + char *d = (char *) s; + + + //GNUNET_assert (easy_h != NULL); + if (easy_h == NULL) + { + GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name, + "Client: connection to ended with reason %i: `%s', %i handles running\n", + msg->data.result, + curl_easy_strerror (msg->data.result), running); + continue; + } + + GNUNET_assert (CURLE_OK == + curl_easy_getinfo (easy_h, CURLINFO_PRIVATE, &d)); + s = (struct Session *) d; + GNUNET_assert (s != NULL); + + if (msg->msg == CURLMSG_DONE) + { + GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name, + "Client: %X connection to '%s' %s ended with reason %i: `%s'\n", + msg->easy_handle, GNUNET_i2s (&s->target), + http_plugin_address_to_string (NULL, s->addr, + s->addrlen), + msg->data.result, + curl_easy_strerror (msg->data.result)); + + client_disconnect (s); + //GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name,"Notifying about ended session to peer `%s' `%s'\n", GNUNET_i2s (&s->target), http_plugin_address_to_string (plugin, s->addr, s->addrlen)); + notify_session_end (plugin, &s->target, s); + } } - - handles_last_run = running; } while (mret == CURLM_CALL_MULTI_PERFORM); - client_schedule (plugin); + client_schedule (plugin, GNUNET_NO); } int @@ -221,18 +236,17 @@ client_disconnect (struct Session *s) int res = GNUNET_OK; CURLMcode mret; struct Plugin *plugin = s->plugin; - struct HTTP_Message * msg; - struct HTTP_Message * t; + struct HTTP_Message *msg; + struct HTTP_Message *t; if (s->client_put != NULL) { #if DEBUG_HTTP - GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name, - "Client: %X Deleting outbound PUT session to peer `%s'\n", - s->client_put, - GNUNET_i2s (&s->target)); + GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name, + "Client: %X Deleting outbound PUT session to peer `%s'\n", + s->client_put, GNUNET_i2s (&s->target)); #endif mret = curl_multi_remove_handle (plugin->client_mh, s->client_put); @@ -249,17 +263,16 @@ client_disconnect (struct Session *s) if (s->recv_wakeup_task != GNUNET_SCHEDULER_NO_TASK) { - GNUNET_SCHEDULER_cancel (s->recv_wakeup_task); - s->recv_wakeup_task = GNUNET_SCHEDULER_NO_TASK; + GNUNET_SCHEDULER_cancel (s->recv_wakeup_task); + s->recv_wakeup_task = GNUNET_SCHEDULER_NO_TASK; } if (s->client_get != NULL) { #if DEBUG_HTTP - GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name, - "Client: %X Deleting outbound GET session to peer `%s'\n", - s->client_get, - GNUNET_i2s (&s->target)); + GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name, + "Client: %X Deleting outbound GET session to peer `%s'\n", + s->client_get, GNUNET_i2s (&s->target)); #endif mret = curl_multi_remove_handle (plugin->client_mh, s->client_get); @@ -279,7 +292,7 @@ client_disconnect (struct Session *s) t = msg->next; if (NULL != msg->transmit_cont) msg->transmit_cont (msg->transmit_cont_cls, &s->target, GNUNET_SYSERR); - GNUNET_CONTAINER_DLL_remove(s->msg_head, s->msg_tail, msg); + GNUNET_CONTAINER_DLL_remove (s->msg_head, s->msg_tail, msg); GNUNET_free (msg); msg = t; } @@ -292,34 +305,35 @@ client_disconnect (struct Session *s) plugin->client_perform_task = GNUNET_SCHEDULER_NO_TASK; } - plugin->client_perform_task = GNUNET_SCHEDULER_add_now(client_run, plugin); + client_schedule (plugin, GNUNET_YES); return res; } static void client_receive_mst_cb (void *cls, void *client, - const struct GNUNET_MessageHeader *message) + const struct GNUNET_MessageHeader *message) { struct Session *s = cls; - struct Plugin *plugin = s->plugin; struct GNUNET_TIME_Relative delay; delay = http_plugin_receive (s, &s->target, message, s, s->addr, s->addrlen); - GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name, "CLIENT: CLIENT DELAY %llu ms\n", - delay.rel_value); - - - s->next_receive = GNUNET_TIME_absolute_add(GNUNET_TIME_absolute_get(), delay); + s->next_receive = + GNUNET_TIME_absolute_add (GNUNET_TIME_absolute_get (), delay); - if (GNUNET_TIME_absolute_get().abs_value < s->next_receive.abs_value) + if (GNUNET_TIME_absolute_get ().abs_value < s->next_receive.abs_value) { #if VERBOSE_CLIENT - GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name, "Client: peer `%s' address `%s' next read delayed for %llu ms\n", - GNUNET_i2s (&s->target), GNUNET_a2s (s->addr, s->addrlen), delay); + struct Plugin *plugin = s->plugin; + + GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name, + "Client: peer `%s' address `%s' next read delayed for %llu ms\n", + GNUNET_i2s (&s->target), GNUNET_a2s (s->addr, s->addrlen), + delay); #endif } } + static void client_wake_up (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) { @@ -331,11 +345,10 @@ client_wake_up (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) return; GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, s->plugin->name, - "Client: %X Waking up receive handle\n", - s->client_get); + "Client: %X Waking up receive handle\n", s->client_get); if (s->client_get != NULL) - curl_easy_pause(s->client_get, CURLPAUSE_CONT); + curl_easy_pause (s->client_get, CURLPAUSE_CONT); } @@ -358,39 +371,40 @@ client_receive (void *stream, size_t size, size_t nmemb, void *cls) #if VERBOSE_CLIENT struct Plugin *plugin = s->plugin; - GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name, "Client: Received %Zu bytes from peer `%s'\n", - len, + + GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name, + "Client: Received %Zu bytes from peer `%s'\n", len, GNUNET_i2s (&s->target)); #endif - now = GNUNET_TIME_absolute_get(); + now = GNUNET_TIME_absolute_get (); if (now.abs_value < s->next_receive.abs_value) { - struct GNUNET_TIME_Absolute now = GNUNET_TIME_absolute_get(); - struct GNUNET_TIME_Relative delta = GNUNET_TIME_absolute_get_difference(now, s->next_receive); + struct GNUNET_TIME_Absolute now = GNUNET_TIME_absolute_get (); + struct GNUNET_TIME_Relative delta = + GNUNET_TIME_absolute_get_difference (now, s->next_receive); #if DEBUG_CLIENT GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name, - "Client: %X No inbound bandwidth available! Next read was delayed for %llu ms\n", - s->client_get, delta.rel_value); + "Client: %X No inbound bandwidth available! Next read was delayed for %llu ms\n", + s->client_get, delta.rel_value); #endif if (s->recv_wakeup_task != GNUNET_SCHEDULER_NO_TASK) { GNUNET_SCHEDULER_cancel (s->recv_wakeup_task); s->recv_wakeup_task = GNUNET_SCHEDULER_NO_TASK; } - s->recv_wakeup_task = GNUNET_SCHEDULER_add_delayed (delta, &client_wake_up, s); + s->recv_wakeup_task = + GNUNET_SCHEDULER_add_delayed (delta, &client_wake_up, s); return CURLPAUSE_ALL; } if (s->msg_tk == NULL) - s->msg_tk = GNUNET_SERVER_mst_create (&client_receive_mst_cb, s); + s->msg_tk = GNUNET_SERVER_mst_create (&client_receive_mst_cb, s); - GNUNET_SERVER_mst_receive (s->msg_tk, s, stream, len, GNUNET_NO, - GNUNET_NO); + GNUNET_SERVER_mst_receive (s->msg_tk, s, stream, len, GNUNET_NO, GNUNET_NO); return len; - client_wake_up(NULL,NULL); } /** @@ -406,6 +420,7 @@ static size_t client_send_cb (void *stream, size_t size, size_t nmemb, void *cls) { struct Session *s = cls; + #if VERBOSE_CLIENT struct Plugin *plugin = s->plugin; #endif @@ -417,7 +432,9 @@ client_send_cb (void *stream, size_t size, size_t nmemb, void *cls) if (msg == NULL) { #if VERBOSE_CLIENT - GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name, "Client: %X Nothing to send! Suspending PUT handle!\n", s->client_put); + GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name, + "Client: %X Nothing to send! Suspending PUT handle!\n", + s->client_put); #endif s->client_put_paused = GNUNET_YES; return CURL_READFUNC_PAUSE; @@ -454,13 +471,13 @@ client_send_cb (void *stream, size_t size, size_t nmemb, void *cls) { #if VERBOSE_CLIENT GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name, - "Client: %X Message with %u bytes sent, removing message from queue\n", - s->client_put, msg->size, msg->pos); + "Client: %X Message with %u bytes sent, removing message from queue\n", + s->client_put, msg->size, msg->pos); #endif /* Calling transmit continuation */ if (NULL != msg->transmit_cont) msg->transmit_cont (msg->transmit_cont_cls, &s->target, GNUNET_OK); - GNUNET_CONTAINER_DLL_remove(s->msg_head, s->msg_tail, msg); + GNUNET_CONTAINER_DLL_remove (s->msg_head, s->msg_tail, msg); GNUNET_free (msg); } return bytes_sent; @@ -484,11 +501,12 @@ client_connect (struct Session *s) plugin->last_tag++; /* create url */ - GNUNET_asprintf (&url, "%s%s;%u", http_plugin_address_to_string (plugin, s->addr, s->addrlen), GNUNET_h2s_full (&plugin->env->my_identity->hashPubKey),plugin->last_tag); + GNUNET_asprintf (&url, "%s%s;%u", + http_plugin_address_to_string (plugin, s->addr, s->addrlen), + GNUNET_h2s_full (&plugin->env->my_identity->hashPubKey), + plugin->last_tag); #if 0 - GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name, - "URL `%s'\n", - url); + GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name, "URL `%s'\n", url); #endif /* create get connection */ s->client_get = curl_easy_init (); @@ -575,7 +593,7 @@ client_connect (struct Session *s) plugin->cur_connections += 2; /* Re-schedule since handles have changed */ - if (plugin->client_perform_task!= GNUNET_SCHEDULER_NO_TASK) + if (plugin->client_perform_task != GNUNET_SCHEDULER_NO_TASK) { GNUNET_SCHEDULER_cancel (plugin->client_perform_task); plugin->client_perform_task = GNUNET_SCHEDULER_NO_TASK;