X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Ftransport%2Fplugin_transport_http_client.c;h=ceed94af8b2d700e7ddd7bdcde231364bd593e57;hb=abdec5e11ff11bb10d32c013e11344a54786f80f;hp=ad669d20e95430e8f4a4371a7c10da66b4dc0f73;hpb=511156f37bbd1f0a8ae9deb98d2b3eea7586dfa1;p=oweals%2Fgnunet.git diff --git a/src/transport/plugin_transport_http_client.c b/src/transport/plugin_transport_http_client.c index ad669d20e..ceed94af8 100644 --- a/src/transport/plugin_transport_http_client.c +++ b/src/transport/plugin_transport_http_client.c @@ -1,6 +1,6 @@ /* This file is part of GNUnet - Copyright (C) 2002-2014 Christian Grothoff (and other contributing authors) + Copyright (C) 2002-2014 GNUnet e.V. GNUnet is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published @@ -14,8 +14,8 @@ You should have received a copy of the GNU General Public License along with GNUnet; see the file COPYING. If not, write to the - Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ /** @@ -152,7 +152,7 @@ struct HTTP_Message /** * Session handle for HTTP(S) connections. */ -struct Session; +struct GNUNET_ATS_Session; /** @@ -174,14 +174,14 @@ struct RequestHandle /** * The related session */ - struct Session *s; + struct GNUNET_ATS_Session *s; }; /** * Session handle for connections. */ -struct Session +struct GNUNET_ATS_Session { /** * The URL to connect to @@ -226,17 +226,17 @@ struct Session /** * Session timeout task */ - struct GNUNET_SCHEDULER_Task * put_disconnect_task; + struct GNUNET_SCHEDULER_Task *put_disconnect_task; /** * Session timeout task */ - struct GNUNET_SCHEDULER_Task * timeout_task; + struct GNUNET_SCHEDULER_Task *timeout_task; /** * Task to wake up client receive handle when receiving is allowed again */ - struct GNUNET_SCHEDULER_Task * recv_wakeup_task; + struct GNUNET_SCHEDULER_Task *recv_wakeup_task; /** * Absolute time when to receive data again. @@ -397,7 +397,7 @@ struct HTTP_Client_Plugin * @return #GNUNET_OK on success, #GNUNET_SYSERR on error */ static int -http_client_plugin_session_disconnect (void *cls, struct Session *s); +http_client_plugin_session_disconnect (void *cls, struct GNUNET_ATS_Session *s); /** @@ -410,7 +410,7 @@ http_client_plugin_session_disconnect (void *cls, struct Session *s); */ static void notify_session_monitor (struct HTTP_Client_Plugin *plugin, - struct Session *session, + struct GNUNET_ATS_Session *session, enum GNUNET_TRANSPORT_SessionState state) { struct GNUNET_TRANSPORT_SessionInfo info; @@ -437,7 +437,7 @@ notify_session_monitor (struct HTTP_Client_Plugin *plugin, * @param s the session to delete */ static void -client_delete_session (struct Session *s) +client_delete_session (struct GNUNET_ATS_Session *s) { struct HTTP_Client_Plugin *plugin = s->plugin; struct HTTP_Message *pos; @@ -543,7 +543,7 @@ client_delete_session (struct Session *s) * @param s the session */ static void -client_reschedule_session_timeout (struct Session *s) +client_reschedule_session_timeout (struct GNUNET_ATS_Session *s) { GNUNET_assert (NULL != s->timeout_task); s->timeout = GNUNET_TIME_relative_to_absolute (GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT); @@ -557,8 +557,7 @@ client_reschedule_session_timeout (struct Session *s) * @param tc gnunet scheduler task context */ static void -client_run (void *cls, - const struct GNUNET_SCHEDULER_TaskContext *tc); +client_run (void *cls); /** @@ -682,7 +681,7 @@ client_log (CURL *curl, ttype = "UNSPECIFIED"; break; } - memcpy (text, data, size); + GNUNET_memcpy (text, data, size); if (text[size - 1] == '\n') { text[size] = '\0'; @@ -708,7 +707,7 @@ client_log (CURL *curl, * @return #GNUNET_OK on success, #GNUNET_SYSERR otherwise */ static int -client_connect_get (struct Session *s); +client_connect_get (struct GNUNET_ATS_Session *s); /** @@ -718,7 +717,7 @@ client_connect_get (struct Session *s); * @return #GNUNET_SYSERR for hard failure, #GNUNET_OK for success */ static int -client_connect_put (struct Session *s); +client_connect_put (struct GNUNET_ATS_Session *s); /** @@ -750,7 +749,7 @@ client_connect_put (struct Session *s); */ static ssize_t http_client_plugin_send (void *cls, - struct Session *s, + struct GNUNET_ATS_Session *s, const char *msgbuf, size_t msgbuf_size, unsigned int priority, @@ -775,7 +774,7 @@ http_client_plugin_send (void *cls, msg->buf = (char *) &msg[1]; msg->transmit_cont = cont; msg->transmit_cont_cls = cont_cls; - memcpy (msg->buf, + GNUNET_memcpy (msg->buf, msgbuf, msgbuf_size); GNUNET_CONTAINER_DLL_insert_tail (s->msg_head, @@ -842,7 +841,7 @@ http_client_plugin_send (void *cls, */ static int http_client_plugin_session_disconnect (void *cls, - struct Session *s) + struct GNUNET_ATS_Session *s) { struct HTTP_Client_Plugin *plugin = cls; @@ -886,7 +885,7 @@ http_client_query_keepalive_factor (void *cls) * * @param cls the `struct HTTP_Client_Plugin *` * @param peer identity of the peer - * @param value the `struct Session *` + * @param value the `struct GNUNET_ATS_Session *` * @return #GNUNET_OK (continue iterating) */ static int @@ -895,7 +894,7 @@ destroy_session_cb (void *cls, void *value) { struct HTTP_Client_Plugin *plugin = cls; - struct Session *session = value; + struct GNUNET_ATS_Session *session = value; http_client_plugin_session_disconnect (plugin, session); return GNUNET_OK; @@ -929,7 +928,7 @@ http_client_plugin_peer_disconnect (void *cls, /** * Closure for #session_lookup_client_by_address(). */ -struct SessionClientCtx +struct GNUNET_ATS_SessionClientCtx { /** * Address we are looking for. @@ -939,16 +938,16 @@ struct SessionClientCtx /** * Session that was found. */ - struct Session *ret; + struct GNUNET_ATS_Session *ret; }; /** * Locate the seession object for a given address. * - * @param cls the `struct SessionClientCtx *` + * @param cls the `struct GNUNET_ATS_SessionClientCtx *` * @param key peer identity - * @param value the `struct Session` to check + * @param value the `struct GNUNET_ATS_Session` to check * @return #GNUNET_NO if found, #GNUNET_OK if not */ static int @@ -956,8 +955,8 @@ session_lookup_client_by_address (void *cls, const struct GNUNET_PeerIdentity *key, void *value) { - struct SessionClientCtx *sc_ctx = cls; - struct Session *s = value; + struct GNUNET_ATS_SessionClientCtx *sc_ctx = cls; + struct GNUNET_ATS_Session *s = value; if (0 == GNUNET_HELLO_address_cmp (sc_ctx->address, s->address)) @@ -976,11 +975,11 @@ session_lookup_client_by_address (void *cls, * @param address the address * @return the session or NULL */ -static struct Session * +static struct GNUNET_ATS_Session * client_lookup_session (struct HTTP_Client_Plugin *plugin, const struct GNUNET_HELLO_Address *address) { - struct SessionClientCtx sc_ctx; + struct GNUNET_ATS_SessionClientCtx sc_ctx; sc_ctx.address = address; sc_ctx.ret = NULL; @@ -996,14 +995,12 @@ client_lookup_session (struct HTTP_Client_Plugin *plugin, * after a while (so that gnurl stops asking). This task * is the delayed task that actually disconnects the PUT. * - * @param cls the `struct Session *` with the put - * @param tc scheduler context + * @param cls the `struct GNUNET_ATS_Session *` with the put */ static void -client_put_disconnect (void *cls, - const struct GNUNET_SCHEDULER_TaskContext *tc) +client_put_disconnect (void *cls) { - struct Session *s = cls; + struct GNUNET_ATS_Session *s = cls; s->put_disconnect_task = NULL; LOG (GNUNET_ERROR_TYPE_DEBUG, @@ -1024,7 +1021,7 @@ client_put_disconnect (void *cls, * @param stream pointer where to write data * @param size size of an individual element * @param nmemb count of elements that can be written to the buffer - * @param cls our `struct Session` + * @param cls our `struct GNUNET_ATS_Session` * @return bytes written to stream, returning 0 will terminate request! */ static size_t @@ -1033,7 +1030,7 @@ client_send_cb (void *stream, size_t nmemb, void *cls) { - struct Session *s = cls; + struct GNUNET_ATS_Session *s = cls; struct HTTP_Client_Plugin *plugin = s->plugin; struct HTTP_Message *msg = s->msg_head; size_t len; @@ -1064,8 +1061,10 @@ client_send_cb (void *stream, "Session %p/request %p: nothing to send, suspending\n", s, s->put.easyhandle); - s->put_disconnect_task = GNUNET_SCHEDULER_add_delayed (PUT_DISCONNECT_TIMEOUT, - &client_put_disconnect, s); + s->put_disconnect_task + = GNUNET_SCHEDULER_add_delayed (PUT_DISCONNECT_TIMEOUT, + &client_put_disconnect, + s); s->put.state = H_PAUSED; return CURL_READFUNC_PAUSE; } @@ -1074,7 +1073,9 @@ client_send_cb (void *stream, /* calculate how much fits in buffer */ len = GNUNET_MIN (msg->size - msg->pos, size * nmemb); - memcpy (stream, &msg->buf[msg->pos], len); + GNUNET_memcpy (stream, + &msg->buf[msg->pos], + len); msg->pos += len; if (msg->pos == msg->size) { @@ -1128,17 +1129,13 @@ client_send_cb (void *stream, * Wake up a curl handle which was suspended * * @param cls the session - * @param tc task context */ static void -client_wake_up (void *cls, - const struct GNUNET_SCHEDULER_TaskContext *tc) +client_wake_up (void *cls) { - struct Session *s = cls; + struct GNUNET_ATS_Session *s = cls; s->recv_wakeup_task = NULL; - if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN)) - return; LOG (GNUNET_ERROR_TYPE_DEBUG, "Session %p/request %p: Waking up GET handle\n", s, s->get.easyhandle); @@ -1170,7 +1167,7 @@ client_receive_mst_cb (void *cls, void *client, const struct GNUNET_MessageHeader *message) { - struct Session *s = cls; + struct GNUNET_ATS_Session *s = cls; struct HTTP_Client_Plugin *plugin; struct GNUNET_TIME_Relative delay; char *stat_txt; @@ -1242,7 +1239,7 @@ client_receive (void *stream, size_t nmemb, void *cls) { - struct Session *s = cls; + struct GNUNET_ATS_Session *s = cls; struct GNUNET_TIME_Absolute now; size_t len = size * nmemb; @@ -1293,11 +1290,9 @@ client_receive (void *stream, * Task performing curl operations * * @param cls plugin as closure - * @param tc scheduler task context */ static void -client_run (void *cls, - const struct GNUNET_SCHEDULER_TaskContext *tc) +client_run (void *cls) { struct HTTP_Client_Plugin *plugin = cls; int running; @@ -1308,9 +1303,6 @@ client_run (void *cls, int msgs_left; plugin->client_perform_task = NULL; - if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN)) - return; - /* While data are available or timeouts occured */ do { @@ -1322,14 +1314,14 @@ client_run (void *cls, while (NULL != (msg = curl_multi_info_read (plugin->curl_multi_handle, &msgs_left))) { CURL *easy_h = msg->easy_handle; - struct Session *s = NULL; + struct GNUNET_ATS_Session *s = NULL; char *d = NULL; /* curl requires 'd' to be a 'char *' */ GNUNET_assert (NULL != easy_h); /* Obtain session from easy handle */ GNUNET_assert (CURLE_OK == curl_easy_getinfo (easy_h, CURLINFO_PRIVATE, &d)); - s = (struct Session *) d; + s = (struct GNUNET_ATS_Session *) d; GNUNET_assert (NULL != s); if (msg->msg != CURLMSG_DONE) @@ -1450,7 +1442,7 @@ client_run (void *cls, /** * Open TCP socket with TCP STEALTH enabled. * - * @param clientp our `struct Session *` + * @param clientp our `struct GNUNET_ATS_Session *` * @param purpose why does curl want to open a socket * @param address what kind of socket does curl want to have opened? * @return opened socket @@ -1460,7 +1452,7 @@ open_tcp_stealth_socket_cb (void *clientp, curlsocktype purpose, struct curl_sockaddr *address) { - struct Session *s = clientp; + struct GNUNET_ATS_Session *s = clientp; int ret; switch (purpose) @@ -1509,7 +1501,7 @@ open_tcp_stealth_socket_cb (void *clientp, * @return #GNUNET_OK on success, #GNUNET_SYSERR otherwise */ static int -client_connect_get (struct Session *s) +client_connect_get (struct GNUNET_ATS_Session *s) { CURLMcode mret; struct HttpAddress *ha; @@ -1689,7 +1681,7 @@ client_connect_get (struct Session *s) * @return #GNUNET_SYSERR for hard failure, #GNUNET_OK for ok */ static int -client_connect_put (struct Session *s) +client_connect_put (struct GNUNET_ATS_Session *s) { CURLMcode mret; struct HttpAddress *ha; @@ -1861,7 +1853,7 @@ client_connect_put (struct Session *s) * @return #GNUNET_OK on success, #GNUNET_SYSERR otherwise */ static int -client_connect (struct Session *s) +client_connect (struct GNUNET_ATS_Session *s) { struct HTTP_Client_Plugin *plugin = s->plugin; int res = GNUNET_OK; @@ -1935,23 +1927,39 @@ client_connect (struct Session *s) */ static enum GNUNET_ATS_Network_Type http_client_plugin_get_network (void *cls, - struct Session *session) + struct GNUNET_ATS_Session *session) { return session->scope; } +/** + * Function obtain the network type for an address. + * + * @param cls closure (`struct Plugin *`) + * @param address the address + * @return the network type + */ +static enum GNUNET_ATS_Network_Type +http_client_plugin_get_network_for_address (void *cls, + const struct GNUNET_HELLO_Address *address) +{ + struct HTTP_Client_Plugin *plugin = cls; + + return http_common_get_network_for_address (plugin->env, + address); +} + + /** * Session was idle, so disconnect it * - * @param cls the `struct Session` of the idle session - * @param tc scheduler context + * @param cls the `struct GNUNET_ATS_Session` of the idle session */ static void -client_session_timeout (void *cls, - const struct GNUNET_SCHEDULER_TaskContext *tc) +client_session_timeout (void *cls) { - struct Session *s = cls; + struct GNUNET_ATS_Session *s = cls; struct GNUNET_TIME_Relative left; s->timeout_task = NULL; @@ -1987,12 +1995,12 @@ client_session_timeout (void *cls, * @param address the address * @return the session or NULL of max connections exceeded */ -static struct Session * +static struct GNUNET_ATS_Session * http_client_plugin_get_session (void *cls, const struct GNUNET_HELLO_Address *address) { struct HTTP_Client_Plugin *plugin = cls; - struct Session *s; + struct GNUNET_ATS_Session *s; struct sockaddr *sa; enum GNUNET_ATS_Network_Type net_type; size_t salen = 0; @@ -2048,7 +2056,7 @@ http_client_plugin_get_session (void *cls, return NULL; } - s = GNUNET_new (struct Session); + s = GNUNET_new (struct GNUNET_ATS_Session); s->plugin = plugin; s->address = GNUNET_HELLO_address_copy (address); s->scope = net_type; @@ -2336,7 +2344,7 @@ http_client_plugin_address_to_string (void *cls, static void http_client_plugin_update_session_timeout (void *cls, const struct GNUNET_PeerIdentity *peer, - struct Session *session) + struct GNUNET_ATS_Session *session) { client_reschedule_session_timeout (session); } @@ -2355,7 +2363,7 @@ http_client_plugin_update_session_timeout (void *cls, static void http_client_plugin_update_inbound_delay (void *cls, const struct GNUNET_PeerIdentity *peer, - struct Session *s, + struct GNUNET_ATS_Session *s, struct GNUNET_TIME_Relative delay) { s->next_receive = GNUNET_TIME_relative_to_absolute (delay); @@ -2366,8 +2374,10 @@ http_client_plugin_update_inbound_delay (void *cls, if (s->recv_wakeup_task != NULL) { GNUNET_SCHEDULER_cancel (s->recv_wakeup_task); - s->recv_wakeup_task = GNUNET_SCHEDULER_add_delayed (delay, - &client_wake_up, s); + s->recv_wakeup_task + = GNUNET_SCHEDULER_add_delayed (delay, + &client_wake_up, + s); } } @@ -2378,7 +2388,7 @@ http_client_plugin_update_inbound_delay (void *cls, * * @param cls the `struct Plugin` with the monitor callback (`sic`) * @param peer peer we send information about - * @param value our `struct Session` to send information about + * @param value our `struct GNUNET_ATS_Session` to send information about * @return #GNUNET_OK (continue to iterate) */ static int @@ -2387,7 +2397,7 @@ send_session_info_iter (void *cls, void *value) { struct HTTP_Client_Plugin *plugin = cls; - struct Session *session = value; + struct GNUNET_ATS_Session *session = value; notify_session_monitor (plugin, session, @@ -2469,6 +2479,7 @@ LIBGNUNET_PLUGIN_TRANSPORT_INIT (void *cls) api->string_to_address = &http_common_plugin_string_to_address; api->address_pretty_printer = &http_common_plugin_address_pretty_printer; api->get_network = &http_client_plugin_get_network; + api->get_network_for_address = &http_client_plugin_get_network_for_address; api->update_session_timeout = &http_client_plugin_update_session_timeout; api->update_inbound_delay = &http_client_plugin_update_inbound_delay; api->setup_monitor = &http_client_plugin_setup_monitor;