From 3e9940cb3859618e37cc35cb45ef6d62ff92677c Mon Sep 17 00:00:00 2001 From: Matthias Wachs Date: Mon, 27 Aug 2012 15:02:56 +0000 Subject: [PATCH] changes --- src/transport/plugin_transport_http_client.c | 77 +++++++++++++++----- src/transport/plugin_transport_http_common.h | 23 ++++-- src/transport/plugin_transport_http_server.c | 27 ++++--- 3 files changed, 94 insertions(+), 33 deletions(-) diff --git a/src/transport/plugin_transport_http_client.c b/src/transport/plugin_transport_http_client.c index fc954498c..3e4de2cf7 100644 --- a/src/transport/plugin_transport_http_client.c +++ b/src/transport/plugin_transport_http_client.c @@ -33,7 +33,7 @@ #endif -#define HTTP_NOT_VALIDATED_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 15) +#define VERBOSE_CURL GNUNET_YES #include "platform.h" #include "gnunet_protocols.h" @@ -309,6 +309,43 @@ client_exist_session (struct HTTP_Client_Plugin *plugin, struct Session *s) return GNUNET_NO; } +#if VERBOSE_CURL +/** + * Function to log curl debug messages with GNUNET_log + * @param curl handle + * @param type curl_infotype + * @param data data + * @param size size + * @param cls closure + * @return 0 + */ +static int +client_log (CURL * curl, curl_infotype type, char *data, size_t size, void *cls) +{ + if (type == CURLINFO_TEXT) + { + char text[size + 2]; + + memcpy (text, data, size); + if (text[size - 1] == '\n') + text[size] = '\0'; + else + { + text[size] = '\n'; + text[size + 1] = '\0'; + } +#if BUILD_HTTPS + GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "transport-https_client", + "Connection: %p - %s", cls, text); +#else + GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "transport-http_client", + "Connection %p: - %s", cls, text); +#endif + } + return 0; +} +#endif + /** * Function that can be used by the transport service to transmit * a message using the plugin. Note that in the case of a @@ -435,7 +472,7 @@ client_disconnect (struct Session *s) int res = GNUNET_OK; CURLMcode mret; - if (GNUNET_YES != client_exist_session(plugin, s)) + if (GNUNET_YES != client_exist_session (plugin, s)) { GNUNET_break (0); return GNUNET_SYSERR; @@ -699,8 +736,6 @@ client_receive_mst_cb (void *cls, void *client, static size_t client_receive (void *stream, size_t size, size_t nmemb, void *cls) { - return 0; - struct Session *s = cls; struct GNUNET_TIME_Absolute now; size_t len = size * nmemb; @@ -932,10 +967,10 @@ client_connect (struct Session *s) curl_easy_setopt (s->client_get, CURLOPT_WRITEFUNCTION, client_receive); curl_easy_setopt (s->client_get, CURLOPT_WRITEDATA, s); curl_easy_setopt (s->client_get, CURLOPT_TIMEOUT_MS, - (long) GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT.rel_value); + (long) CLIENT_SESSION_TIMEOUT.rel_value); curl_easy_setopt (s->client_get, CURLOPT_PRIVATE, s); curl_easy_setopt (s->client_get, CURLOPT_CONNECTTIMEOUT_MS, - (long) HTTP_NOT_VALIDATED_TIMEOUT.rel_value); + (long) HTTP_CLIENT_NOT_VALIDATED_TIMEOUT.rel_value); curl_easy_setopt (s->client_get, CURLOPT_BUFFERSIZE, 2 * GNUNET_SERVER_MAX_MESSAGE_SIZE); #if CURL_TCP_NODELAY @@ -963,10 +998,10 @@ client_connect (struct Session *s) curl_easy_setopt (s->client_put, CURLOPT_WRITEFUNCTION, client_receive); curl_easy_setopt (s->client_put, CURLOPT_WRITEDATA, s); curl_easy_setopt (s->client_put, CURLOPT_TIMEOUT_MS, - (long) GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT.rel_value); + (long) CLIENT_SESSION_TIMEOUT.rel_value); curl_easy_setopt (s->client_put, CURLOPT_PRIVATE, s); curl_easy_setopt (s->client_put, CURLOPT_CONNECTTIMEOUT_MS, - (long) HTTP_NOT_VALIDATED_TIMEOUT.rel_value); + (long) HTTP_CLIENT_NOT_VALIDATED_TIMEOUT.rel_value); curl_easy_setopt (s->client_put, CURLOPT_BUFFERSIZE, 2 * GNUNET_SERVER_MAX_MESSAGE_SIZE); #if CURL_TCP_NODELAY @@ -1104,7 +1139,7 @@ client_session_timeout (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc s->timeout_task = GNUNET_SCHEDULER_NO_TASK; GNUNET_log (TIMEOUT_LOG, "Session %p was idle for %llu ms, disconnecting\n", - s, (unsigned long long) TIMEOUT.rel_value); + s, (unsigned long long) CLIENT_SESSION_TIMEOUT.rel_value); /* call session destroy function */ GNUNET_assert (GNUNET_OK == client_disconnect (s)); @@ -1119,12 +1154,12 @@ client_start_session_timeout (struct Session *s) GNUNET_assert (NULL != s); GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == s->timeout_task); - s->timeout_task = GNUNET_SCHEDULER_add_delayed (TIMEOUT, + s->timeout_task = GNUNET_SCHEDULER_add_delayed (CLIENT_SESSION_TIMEOUT, &client_session_timeout, s); GNUNET_log (TIMEOUT_LOG, "Timeout for session %p set to %llu ms\n", - s, (unsigned long long) TIMEOUT.rel_value); + s, (unsigned long long) CLIENT_SESSION_TIMEOUT.rel_value); } /** @@ -1138,12 +1173,12 @@ client_reschedule_session_timeout (struct Session *s) GNUNET_assert (GNUNET_SCHEDULER_NO_TASK != s->timeout_task); GNUNET_SCHEDULER_cancel (s->timeout_task); - s->timeout_task = GNUNET_SCHEDULER_add_delayed (TIMEOUT, + s->timeout_task = GNUNET_SCHEDULER_add_delayed (CLIENT_SESSION_TIMEOUT, &client_session_timeout, s); GNUNET_log (TIMEOUT_LOG, "Timeout rescheduled for session %p set to %llu ms\n", - s, (unsigned long long) TIMEOUT.rel_value); + s, (unsigned long long) CLIENT_SESSION_TIMEOUT.rel_value); } /** @@ -1199,20 +1234,26 @@ LIBGNUNET_PLUGIN_TRANSPORT_DONE (void *cls) _("Shutting down plugin `%s'\n"), plugin->name); + if (NULL == api->cls) + { + /* Stub shutdown */ + GNUNET_free (api); + return NULL; + } + next = plugin->head; while (NULL != (pos = next)) { next = pos->next; - GNUNET_CONTAINER_DLL_remove( plugin->head, plugin->tail, pos); client_disconnect (pos); } - - if (NULL == api->cls) + if (GNUNET_SCHEDULER_NO_TASK != plugin->client_perform_task) { - GNUNET_free (api); - return NULL; + GNUNET_SCHEDULER_cancel (plugin->client_perform_task); + plugin->client_perform_task = GNUNET_SCHEDULER_NO_TASK; } + if (NULL != plugin->curl_multi_handle) { curl_multi_cleanup (plugin->curl_multi_handle); diff --git a/src/transport/plugin_transport_http_common.h b/src/transport/plugin_transport_http_common.h index 0f83da6b3..edb99c5f2 100644 --- a/src/transport/plugin_transport_http_common.h +++ b/src/transport/plugin_transport_http_common.h @@ -27,16 +27,27 @@ #include "platform.h" #include "gnunet_common.h" -#define TESTING GNUNET_NO +/** + * Timeout values for testing + */ +#define TESTING GNUNET_YES #if TESTING -#define TIMEOUT_LOG GNUNET_ERROR_TYPE_ERROR -#define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 15) -#define HTTP_NOT_VALIDATED_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 5) + +#define HTTP_SERVER_NOT_VALIDATED_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 3) +#define HTTP_CLIENT_NOT_VALIDATED_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 3) +#define CLIENT_SESSION_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 7) +#define SERVER_SESSION_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 7) +#define TIMEOUT_LOG GNUNET_ERROR_TYPE_DEBUG + #else -#define HTTP_NOT_VALIDATED_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 15) + +#define HTTP_SERVER_NOT_VALIDATED_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 15) +#define HTTP_CLIENT_NOT_VALIDATED_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 15) +#define CLIENT_SESSION_TIMEOUT GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT +#define SERVER_SESSION_TIMEOUT GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT #define TIMEOUT_LOG GNUNET_ERROR_TYPE_DEBUG -#define TIMEOUT GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT + #endif /** diff --git a/src/transport/plugin_transport_http_server.c b/src/transport/plugin_transport_http_server.c index d2c5e9c9b..2ce844307 100644 --- a/src/transport/plugin_transport_http_server.c +++ b/src/transport/plugin_transport_http_server.c @@ -990,7 +990,7 @@ server_lookup_connection (struct HTTP_Server_Plugin *plugin, #if MHD_VERSION >= 0x00090E00 if ((NULL == s->server_recv) || (NULL == s->server_send)) { - to = (HTTP_NOT_VALIDATED_TIMEOUT.rel_value / 1000); + to = (HTTP_SERVER_NOT_VALIDATED_TIMEOUT.rel_value / 1000); MHD_set_connection_option (mhd_connection, MHD_CONNECTION_OPTION_TIMEOUT, to); server_reschedule (plugin, sc->mhd_daemon, GNUNET_NO); } @@ -999,7 +999,7 @@ server_lookup_connection (struct HTTP_Server_Plugin *plugin, GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name, "Session %p for peer `%s' fully connected\n", s, GNUNET_i2s (&target)); - to = (TIMEOUT.rel_value / 1000); + to = (SERVER_SESSION_TIMEOUT.rel_value / 1000); server_mhd_connection_timeout (plugin, s, to); } @@ -1689,12 +1689,12 @@ server_start (struct HTTP_Server_Plugin *plugin) #if MHD_VERSION >= 0x00090E00 - timeout = HTTP_NOT_VALIDATED_TIMEOUT.rel_value / 1000; + timeout = HTTP_SERVER_NOT_VALIDATED_TIMEOUT.rel_value / 1000; GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name, "MHD can set timeout per connection! Default time out %u sec.\n", timeout); #else - timeout = GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT.rel_value / 1000; + timeout = SERVER_SESSION_TIMEOUT.rel_value / 1000; GNUNET_log_from (GNUNET_ERROR_TYPE_WARNING, plugin->name, "MHD cannot set timeout per connection! Default time out %u sec.\n", timeout); @@ -2418,7 +2418,7 @@ server_session_timeout (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc s->timeout_task = GNUNET_SCHEDULER_NO_TASK; GNUNET_log (TIMEOUT_LOG, "Session %p was idle for %llu ms, disconnecting\n", - s, (unsigned long long) TIMEOUT.rel_value); + s, (unsigned long long) SERVER_SESSION_TIMEOUT.rel_value); /* call session destroy function */ GNUNET_assert (GNUNET_OK == server_disconnect (s)); @@ -2432,12 +2432,12 @@ server_start_session_timeout (struct Session *s) { GNUNET_assert (NULL != s); GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == s->timeout_task); - s->timeout_task = GNUNET_SCHEDULER_add_delayed (TIMEOUT, + s->timeout_task = GNUNET_SCHEDULER_add_delayed (SERVER_SESSION_TIMEOUT, &server_session_timeout, s); GNUNET_log (TIMEOUT_LOG, "Timeout for session %p set to %llu ms\n", - s, (unsigned long long) TIMEOUT.rel_value); + s, (unsigned long long) SERVER_SESSION_TIMEOUT.rel_value); } @@ -2451,12 +2451,12 @@ server_reschedule_session_timeout (struct Session *s) GNUNET_assert (GNUNET_SCHEDULER_NO_TASK != s->timeout_task); GNUNET_SCHEDULER_cancel (s->timeout_task); - s->timeout_task = GNUNET_SCHEDULER_add_delayed (TIMEOUT, + s->timeout_task = GNUNET_SCHEDULER_add_delayed (SERVER_SESSION_TIMEOUT, &server_session_timeout, s); GNUNET_log (TIMEOUT_LOG, "Timeout rescheduled for session %p set to %llu ms\n", - s, (unsigned long long) TIMEOUT.rel_value); + s, (unsigned long long) SERVER_SESSION_TIMEOUT.rel_value); } /** @@ -2472,10 +2472,15 @@ LIBGNUNET_PLUGIN_TRANSPORT_DONE (void *cls) if (NULL == api->cls) { + /* Free for stub mode */ GNUNET_free (api); return NULL; } + GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name, + _("Shutting down plugin `%s'\n"), + plugin->name); + if (GNUNET_SCHEDULER_NO_TASK != plugin->notify_ext_task) { GNUNET_SCHEDULER_cancel (plugin->notify_ext_task); @@ -2515,6 +2520,10 @@ LIBGNUNET_PLUGIN_TRANSPORT_DONE (void *cls) GNUNET_free_non_null (plugin->server_addr_v4); GNUNET_free_non_null (plugin->server_addr_v6); + GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name, + _("Shutdown for plugin `%s' complete\n"), + plugin->name); + GNUNET_free (plugin); GNUNET_free (api); return NULL; -- 2.25.1