plugin->client_perform_task = GNUNET_SCHEDULER_NO_TASK;
if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN))
return;
+
do
{
running = 0;
mret = curl_multi_perform (plugin->client_mh, &running);
- if ((running < handles_last_run) && (running > 0))
- {
- }
- //curl_handle_finished (plugin);
+ 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;
+ GNUNET_assert (easy_h != NULL);
+
+ GNUNET_assert (CURLE_OK == curl_easy_getinfo(easy_h, CURLINFO_PRIVATE, &s));
+ GNUNET_assert (s != NULL);
+
+ if (msg->msg == CURLMSG_DONE)
+ {
+#if DEBUG_HTTP
+ GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name,
+ "Connection to '%s' %s ended\n", GNUNET_i2s(&s->target), http_plugin_address_to_string(s->plugin, s->addr, s->addrlen));
+#endif
+ client_disconnect(s);
+ notify_session_end (s->plugin, &s->target, s);
+ }
+ }
+
handles_last_run = running;
}
while (mret == CURLM_CALL_MULTI_PERFORM);
struct Plugin *plugin = s->plugin;
#if DEBUG_HTTP
- GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, plugin->name,
- "Deleting outbound session peer `%s'\n",
+ GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name,
+ "Deleting outbound PUT session to peer `%s'\n",
GNUNET_i2s (&s->target));
#endif
}
curl_easy_cleanup (s->client_put);
+#if DEBUG_HTTP
+ GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name,
+ "Deleting outbound GET session to peer `%s'\n",
+ GNUNET_i2s (&s->target));
+#endif
+
mret = curl_multi_remove_handle (plugin->client_mh, s->client_get);
if (mret != CURLM_OK)
{
CURLMcode mret;
#if DEBUG_HTTP
- GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, s->plugin->name,
+ GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, s->plugin->name,
"Initiating outbound session peer `%s'\n",
GNUNET_i2s (&s->target));
#endif
s->inbound = GNUNET_NO;
/* create url */
- GNUNET_asprintf (&url, "%s://%s/", s->plugin->protocol,
- http_plugin_address_to_string (NULL, s->addr, s->addrlen));
-
-#if DEBUG_HTTP
- GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, s->plugin->name, "URL `%s'\n", url);
-#endif
+ GNUNET_asprintf (&url, "%s", http_plugin_address_to_string (s->plugin, s->addr, s->addrlen));
/* create get connection */
s->client_get = curl_easy_init ();
//curl_easy_setopt (s->client_get, CURLOPT_WRITEDATA, ps);
curl_easy_setopt (s->client_get, CURLOPT_TIMEOUT_MS,
(long) GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT.rel_value);
- //curl_easy_setopt (s->client_get, CURLOPT_PRIVATE, ps);
+ 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);
curl_easy_setopt (s->client_get, CURLOPT_BUFFERSIZE,
//curl_easy_setopt (s->client_put, CURLOPT_WRITEDATA, ps);
curl_easy_setopt (s->client_put, CURLOPT_TIMEOUT_MS,
(long) GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT.rel_value);
- //curl_easy_setopt (s->client_put, CURLOPT_PRIVATE, ps);
+ 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);
curl_easy_setopt (s->client_put, CURLOPT_BUFFERSIZE,
const char *
http_plugin_address_to_string (void *cls, const void *addr, size_t addrlen)
{
+ struct Plugin *plugin = cls;
+
const struct IPv4HttpAddress *t4;
const struct IPv6HttpAddress *t6;
struct sockaddr_in a4;
uint16_t port;
int res;
+ GNUNET_assert (plugin != NULL);
+
if (addrlen == sizeof (struct IPv6HttpAddress))
{
address = GNUNET_malloc (INET6_ADDRSTRLEN);
}
GNUNET_assert (strlen (address) + 7 < (INET6_ADDRSTRLEN + 13));
-
- res = GNUNET_snprintf (rbuf, sizeof (rbuf), "%s:%u", address, port);
+ if (addrlen == sizeof (struct IPv6HttpAddress))
+ res = GNUNET_snprintf (rbuf, sizeof (rbuf), "%s://[%s]:%u/", plugin->protocol, address, port);
+ else if (addrlen == sizeof (struct IPv4HttpAddress))
+ res = GNUNET_snprintf (rbuf, sizeof (rbuf), "%s://%s:%u/", plugin->protocol, address, port);
GNUNET_free (address);
GNUNET_assert (res != 0);