*/
struct Session;
+/**
+ * A connection handle
+ *
+ */
struct ConnectionHandle
{
+ /**
+ * The curl easy handle
+ */
CURL *easyhandle;
+
+ /**
+ * The related session
+ */
struct Session *s;
};
client_schedule (struct HTTP_Client_Plugin *plugin, int now);
+/**
+ * Connect a HTTP put connection
+ *
+ * @param s the session to connect
+ * @return GNUNET_SYSERR for hard failure, GNUNET_OK for success
+ */
static int
client_connect_put (struct Session *s);
break;
}
-#if VERBOSE_CURL
memcpy (text, data, size);
if (text[size - 1] == '\n')
text[size] = '\0';
"Connection %p %s: %s", ch->easyhandle, ttype, text);
#endif
}
-#endif
return 0;
}
}
-
+/**
+ * Check if a sessions exists for an specific address
+ *
+ * @param plugin the plugin
+ * @param address the address
+ * @return the session or NULL
+ */
static struct Session *
client_lookup_session (struct HTTP_Client_Plugin *plugin,
const struct GNUNET_HELLO_Address *address)
/**
* Function setting up file descriptors and scheduling task to run
*
- * @param plugin plugin as closure
+ * @param plugin the plugin as closure
* @param now schedule task in 1ms, regardless of what curl may say
* @return GNUNET_SYSERR for hard failure, GNUNET_OK for ok
*/
if (GNUNET_YES == s->put_reconnect_required)
{
s->put_reconnect_required = GNUNET_NO;
- client_connect_put(s);
+ if (GNUNET_SYSERR == client_connect_put(s))
+ {
+ GNUNET_break (s->client_put == NULL);
+ GNUNET_break (s->put_tmp_disconnected == GNUNET_NO);
+ }
}
}
if (easy_h == s->client_get)
client_schedule (plugin, GNUNET_NO);
}
+
+/**
+ * Connect GET connection for a session
+ *
+ * @param s the session to connect
+ * @return GNUNET_OK on success, GNUNET_SYSERR otherwise
+ */
static int
client_connect_get (struct Session *s)
{
curl_easy_setopt (s->client_get, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1);
curl_easy_setopt (s->client_get, CURLOPT_SSL_VERIFYPEER, 0);
curl_easy_setopt (s->client_get, CURLOPT_SSL_VERIFYHOST, 0);
+ curl_easy_setopt (s->client_get, CURLOPT_PROTOCOLS, CURLPROTO_HTTPS);
+ curl_easy_setopt (s->client_get, CURLOPT_REDIR_PROTOCOLS, CURLPROTO_HTTPS);
+#else
+ curl_easy_setopt (s->client_get, CURLOPT_PROTOCOLS, CURLPROTO_HTTP);
+ curl_easy_setopt (s->client_get, CURLOPT_REDIR_PROTOCOLS, CURLPROTO_HTTP);
#endif
+
+ curl_easy_setopt (s->client_get, CURLOPT_URL, s->url);
+ curl_easy_setopt (s->client_get, CURLOPT_URL, s->url);
curl_easy_setopt (s->client_get, CURLOPT_URL, s->url);
//curl_easy_setopt (s->client_get, CURLOPT_HEADERFUNCTION, &curl_get_header_cb);
//curl_easy_setopt (s->client_get, CURLOPT_WRITEHEADER, ps);
#if CURL_TCP_NODELAY
curl_easy_setopt (ps->recv_endpoint, CURLOPT_TCP_NODELAY, 1);
#endif
+ curl_easy_setopt (s->client_get, CURLOPT_FOLLOWLOCATION, 0);
+
mret = curl_multi_add_handle (s->plugin->curl_multi_handle, s->client_get);
if (mret != CURLM_OK)
{
return GNUNET_OK;
}
+/**
+ * Connect a HTTP put connection
+ *
+ * @param s the session to connect
+ * @return GNUNET_SYSERR for hard failure, GNUNET_OK for ok
+ */
static int
client_connect_put (struct Session *s)
{
curl_easy_setopt (s->client_put, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1);
curl_easy_setopt (s->client_put, CURLOPT_SSL_VERIFYPEER, 0);
curl_easy_setopt (s->client_put, CURLOPT_SSL_VERIFYHOST, 0);
+ curl_easy_setopt (s->client_get, CURLOPT_PROTOCOLS, CURLPROTO_HTTPS);
+ curl_easy_setopt (s->client_get, CURLOPT_REDIR_PROTOCOLS, CURLPROTO_HTTPS);
+#else
+ curl_easy_setopt (s->client_get, CURLOPT_PROTOCOLS, CURLPROTO_HTTP);
+ curl_easy_setopt (s->client_get, CURLOPT_REDIR_PROTOCOLS, CURLPROTO_HTTP);
#endif
curl_easy_setopt (s->client_put, CURLOPT_URL, s->url);
curl_easy_setopt (s->client_put, CURLOPT_UPLOAD, 1L);
s->client_put = NULL;
s->put.easyhandle = NULL;
s->put.s = NULL;
+ s->put_tmp_disconnected = GNUNET_YES;
return GNUNET_SYSERR;
}
+ s->put_tmp_disconnected = GNUNET_NO;
return GNUNET_OK;
}
+
+/**
+ * Connect both PUT and GET connection for a session
+ *
+ * @param s the session to connect
+ * @return GNUNET_OK on success, GNUNET_SYSERR otherwise
+ */
static int
client_connect (struct Session *s)
{
{
salen = sizeof (struct sockaddr_in);
}
- else if (AF_INET == sa->sa_family)
+ else if (AF_INET6 == sa->sa_family)
{
salen = sizeof (struct sockaddr_in6);
}
ats = plugin->env->get_address_type (plugin->env->cls, sa, salen);
+ //fprintf (stderr, "Address %s is in %s\n", GNUNET_a2s (sa,salen), GNUNET_ATS_print_network_type(ntohl(ats.value)));
GNUNET_free (sa);
}
else if (GNUNET_NO == res)