remove dead assignments
[oweals/gnunet.git] / src / transport / plugin_transport_http_server.c
index a332804ef1c43fbae4825e7860b34c758f67afe8..abf3fdacdfc69d2751a37e725faa4b169b3177e6 100644 (file)
@@ -1,6 +1,6 @@
 /*
      This file is part of GNUnet
-     (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Christian Grothoff (and other contributing authors)
+     (C) 2002-2013 Christian Grothoff (and other contributing authors)
 
      GNUnet is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published
 #include "plugin_transport_http_common.h"
 #include <microhttpd.h>
 
+
+
 #if BUILD_HTTPS
+#define PLUGIN_NAME "https_server"
 #define LIBGNUNET_PLUGIN_TRANSPORT_INIT libgnunet_plugin_transport_https_server_init
 #define LIBGNUNET_PLUGIN_TRANSPORT_DONE libgnunet_plugin_transport_https_server_done
 #else
+#define PLUGIN_NAME "http_server"
 #define LIBGNUNET_PLUGIN_TRANSPORT_INIT libgnunet_plugin_transport_http_server_init
 #define LIBGNUNET_PLUGIN_TRANSPORT_DONE libgnunet_plugin_transport_http_server_done
 #endif
@@ -650,17 +654,23 @@ static int
 http_server_plugin_address_suggested (void *cls, const void *addr,
                size_t addrlen)
 {
-  struct HTTP_Server_Plugin *plugin = cls;
   struct HttpAddressWrapper *next;
   struct HttpAddressWrapper *pos;
+       struct HttpAddress *h_addr;
+       h_addr = (struct HttpAddress *) addr;
 
-
-  if ((NULL != plugin->ext_addr) &&
+  if ((NULL != p->ext_addr) &&
           GNUNET_YES == (http_common_cmp_addresses (addr, addrlen,
-                                          plugin->ext_addr, plugin->ext_addr_len)))
-    return GNUNET_OK;
+                                          p->ext_addr, p->ext_addr_len)))
+  {
+       /* Checking HTTP_OPTIONS_VERIFY_CERTIFICATE option for external hostname */
+       if ((ntohl(h_addr->options) & HTTP_OPTIONS_VERIFY_CERTIFICATE) !=
+                       (p->options & HTTP_OPTIONS_VERIFY_CERTIFICATE))
+                       return GNUNET_NO; /* VERIFY option not set as required! */
+       return GNUNET_OK;
+  }
 
-  next  = plugin->addr_head;
+  next  = p->addr_head;
   while (NULL != (pos = next))
   {
     next = pos->next;
@@ -866,29 +876,42 @@ server_disconnect (struct Session *s)
   return GNUNET_OK;
 }
 
+
+
+/**
+ * Tell MHD that the connection should timeout after @a to seconds.
+ *
+ * @param plugin our plugin
+ * @param s session for which the timeout changes
+ * @param to timeout in seconds
+ */
 static void
-server_mhd_connection_timeout (struct HTTP_Server_Plugin *plugin, struct Session *s, int to)
+server_mhd_connection_timeout (struct HTTP_Server_Plugin *plugin, 
+                              struct Session *s,
+                              unsigned int to)
 {
 #if MHD_VERSION >= 0x00090E00
     /* Setting timeouts for other connections */
-    if (s->server_recv != NULL)
-    {
-      GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name,
-                       "Setting timeout for %p to %u sec.\n", s->server_recv, to);
-      MHD_set_connection_option (s->server_recv->mhd_conn,
-                                 MHD_CONNECTION_OPTION_TIMEOUT,
-                                 to);
-      server_reschedule (plugin, s->server_recv->mhd_daemon, GNUNET_NO);
-    }
-    if (s->server_send != NULL)
-    {
-      GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name,
-                       "Setting timeout for %p to %u sec.\n", s->server_send, to);
-      MHD_set_connection_option (s->server_send->mhd_conn,
-                                 MHD_CONNECTION_OPTION_TIMEOUT,
-                                 to);
-      server_reschedule (plugin, s->server_send->mhd_daemon, GNUNET_NO);
-    }
+  if (NULL != s->server_recv)
+  {
+    GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name,
+                    "Setting timeout for %p to %u sec.\n",
+                    s->server_recv, to);
+    MHD_set_connection_option (s->server_recv->mhd_conn,
+                              MHD_CONNECTION_OPTION_TIMEOUT,
+                              to);
+    server_reschedule (plugin, s->server_recv->mhd_daemon, GNUNET_NO);
+  }
+  if (NULL != s->server_send)
+  {
+    GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name,
+                    "Setting timeout for %p to %u sec.\n",
+                    s->server_send, to);
+    MHD_set_connection_option (s->server_send->mhd_conn,
+                              MHD_CONNECTION_OPTION_TIMEOUT,
+                              to);
+    server_reschedule (plugin, s->server_send->mhd_daemon, GNUNET_NO);
+  }
 #endif
 }
 
@@ -1024,14 +1047,12 @@ server_lookup_connection (struct HTTP_Server_Plugin *plugin,
   struct ServerConnection *sc = NULL;
   const union MHD_ConnectionInfo *conn_info;
   struct GNUNET_ATS_Information ats;
-
   struct HttpAddress *addr;
   size_t addr_len;
-
   struct GNUNET_PeerIdentity target;
   uint32_t tag = 0;
   int direction = GNUNET_SYSERR;
-  int to;
+  unsigned int to;
 
   conn_info = MHD_get_connection_info (mhd_connection,
                                        MHD_CONNECTION_INFO_CLIENT_ADDRESS);
@@ -1109,13 +1130,11 @@ server_lookup_connection (struct HTTP_Server_Plugin *plugin,
       ats = plugin->env->get_address_type (plugin->env->cls, conn_info->client_addr, sizeof (struct sockaddr_in6));
       break;
     default:
-      GNUNET_break (0);
+       /* external host name */
+      ats.type = htonl (GNUNET_ATS_NETWORK_TYPE);
+      ats.type = htonl (GNUNET_ATS_NET_WAN);
       return NULL;
     }
-    GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name,
-                     "Creating new session for peer `%s' connecting from `%s'\n",
-                     GNUNET_i2s (&target),
-                     http_common_plugin_address_to_string (NULL,  p->protocol, addr, addr_len));
 
     s = GNUNET_malloc (sizeof (struct Session));
     memcpy (&s->target, &target, sizeof (struct GNUNET_PeerIdentity));
@@ -1132,6 +1151,11 @@ server_lookup_connection (struct HTTP_Server_Plugin *plugin,
     s->connect_in_progress = GNUNET_YES;
     server_start_session_timeout(s);
     GNUNET_CONTAINER_DLL_insert (plugin->head, plugin->tail, s);
+
+    GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name,
+                     "Creating new session %p for peer `%s' connecting from `%s'\n",
+                     s, GNUNET_i2s (&target),
+                     http_common_plugin_address_to_string (NULL, p->protocol, addr, addr_len));
   }
   sc = GNUNET_malloc (sizeof (struct ServerConnection));
   if (conn_info->client_addr->sa_family == AF_INET)
@@ -1148,13 +1172,17 @@ server_lookup_connection (struct HTTP_Server_Plugin *plugin,
     s->server_recv = sc;
 
   if ((NULL != s->server_send) && (NULL != s->server_recv))
+  {
     s->connect_in_progress = GNUNET_NO; /* PUT and GET are connected */
+    plugin->env->session_start (NULL, &s->target, PLUGIN_NAME, NULL, 0 ,s, NULL, 0);
+  }
 
 #if MHD_VERSION >= 0x00090E00
   if ((NULL == s->server_recv) || (NULL == s->server_send))
   {
-    to = (HTTP_SERVER_NOT_VALIDATED_TIMEOUT.rel_value / 1000);
-    MHD_set_connection_option (mhd_connection, MHD_CONNECTION_OPTION_TIMEOUT, to);
+    to = (HTTP_SERVER_NOT_VALIDATED_TIMEOUT.rel_value_us / 1000LL / 1000LL);
+    MHD_set_connection_option (mhd_connection, 
+                              MHD_CONNECTION_OPTION_TIMEOUT, to);
     server_reschedule (plugin, sc->mhd_daemon, GNUNET_NO);
   }
   else
@@ -1162,7 +1190,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 = (SERVER_SESSION_TIMEOUT.rel_value / 1000);
+    to = (SERVER_SESSION_TIMEOUT.rel_value_us / 1000LL / 1000LL);
     server_mhd_connection_timeout (plugin, s, to);
   }
 
@@ -1296,14 +1324,11 @@ server_receive_mst_cb (void *cls, void *client,
   delay = plugin->env->receive (plugin->env->cls,
                                 &s->target,
                                 message,
-                                s, s->addr, s->addrlen);
+                                s, NULL, 0);
 
   plugin->env->update_address_metrics (plugin->env->cls,
                                       &s->target,
-                                      s->addr,
-                                      s->addrlen,
-                                      s,
-                                      &atsi, 1);
+                                      NULL, 0, s, &atsi, 1);
 
   GNUNET_asprintf (&stat_txt, "# bytes received via %s_server", plugin->protocol);
   GNUNET_STATISTICS_update (plugin->env->stats,
@@ -1312,13 +1337,14 @@ server_receive_mst_cb (void *cls, void *client,
 
   s->session_passed = GNUNET_YES;
   s->next_receive = GNUNET_TIME_absolute_add (GNUNET_TIME_absolute_get (), delay);
-  if (delay.rel_value > 0)
+  if (delay.rel_value_us > 0)
   {
     GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name,
-                     "Peer `%s' address `%s' next read delayed for %llu ms\n",
+                     "Peer `%s' address `%s' next read delayed for %s\n",
                      GNUNET_i2s (&s->target),
                      http_common_plugin_address_to_string (NULL,  p->protocol, s->addr, s->addrlen),
-                     delay);
+                     GNUNET_STRINGS_relative_time_to_string (delay,
+                                                            GNUNET_YES));
   }
   server_reschedule_session_timeout (s);
   return GNUNET_OK;
@@ -1398,7 +1424,7 @@ server_access_cb (void *cls, struct MHD_Connection *mhd_connection,
     response = MHD_create_response_from_data (strlen ("Thank you!"),
                                        "Thank you!",
                                        MHD_NO, MHD_NO);
-    res = MHD_queue_response (mhd_connection, MHD_HTTP_OK, response);
+    MHD_queue_response (mhd_connection, MHD_HTTP_OK, response);
     MHD_destroy_response (response);
     return MHD_YES;
   }
@@ -1446,7 +1472,7 @@ server_access_cb (void *cls, struct MHD_Connection *mhd_connection,
       response = MHD_create_response_from_data (strlen ("Thank you!"),
                                          "Thank you!",
                                          MHD_NO, MHD_NO);
-      res = MHD_queue_response (mhd_connection, MHD_HTTP_OK, response);
+      MHD_queue_response (mhd_connection, MHD_HTTP_OK, response);
       MHD_destroy_response (response);
       return MHD_YES;
     }
@@ -1464,7 +1490,7 @@ server_access_cb (void *cls, struct MHD_Connection *mhd_connection,
                        *upload_data_size);
       struct GNUNET_TIME_Absolute now = GNUNET_TIME_absolute_get ();
 
-      if ((s->next_receive.abs_value <= now.abs_value))
+      if ((s->next_receive.abs_value_us <= now.abs_value_us))
       {
         GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name,
                          "PUT with %u bytes forwarded to MST\n",
@@ -1475,16 +1501,17 @@ server_access_cb (void *cls, struct MHD_Connection *mhd_connection,
         }
             GNUNET_SERVER_mst_receive (s->msg_tk, s, upload_data,
                                        *upload_data_size, GNUNET_NO, GNUNET_NO);
-#if MHD_VERSION >= 0x00090E00
-        server_mhd_connection_timeout (plugin, s, GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT.rel_value / 1000);
-#endif
+        server_mhd_connection_timeout (plugin, s,
+                                      GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT.rel_value_us / 1000LL / 1000LL);
         (*upload_data_size) = 0;
       }
       else
       {
         GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                    "Session %p / Connection %p: no inbound bandwidth available! Next read was delayed by %llu ms\n",
-                    s, sc, now.abs_value - s->next_receive.abs_value);
+                    "Session %p / Connection %p: no inbound bandwidth available! Next read was delayed by %s\n",
+                    s, sc,
+                   GNUNET_STRINGS_relative_time_to_string (GNUNET_TIME_absolute_get_duration (s->next_receive),
+                                                           GNUNET_YES));
       }
       return MHD_YES;
     }
@@ -1740,12 +1767,12 @@ server_schedule (struct HTTP_Server_Plugin *plugin,
     {
 
       GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name,
-                       "SELECT Timeout changed from %llu to %llu\n",
+                       "SELECT Timeout changed from %llu to %llu (ms)\n",
                        last_timeout, timeout);
       last_timeout = timeout;
     }
-    if (timeout <= GNUNET_TIME_UNIT_SECONDS.rel_value)
-      tv.rel_value = (uint64_t) timeout;
+    if (timeout <= GNUNET_TIME_UNIT_SECONDS.rel_value_us / 1000LL)
+      tv.rel_value_us = (uint64_t) timeout * 1000LL;
     else
       tv = GNUNET_TIME_UNIT_SECONDS;
   }
@@ -1994,12 +2021,12 @@ server_start (struct HTTP_Server_Plugin *plugin)
 
 
 #if MHD_VERSION >= 0x00090E00
-  timeout = HTTP_SERVER_NOT_VALIDATED_TIMEOUT.rel_value / 1000;
+  timeout = HTTP_SERVER_NOT_VALIDATED_TIMEOUT.rel_value_us / 1000LL / 1000LL;
   GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name,
                    "MHD can set timeout per connection! Default time out %u sec.\n",
                    timeout);
 #else
-  timeout = SERVER_SESSION_TIMEOUT.rel_value / 1000;
+  timeout = SERVER_SESSION_TIMEOUT.rel_value_us / 1000LL / 1000LL;
   GNUNET_log_from (GNUNET_ERROR_TYPE_WARNING, plugin->name,
                    "MHD cannot set timeout per connection! Default time out %u sec.\n",
                    timeout);
@@ -2793,10 +2820,10 @@ server_configure_plugin (struct HTTP_Server_Plugin *plugin)
         {
                pos_url = pos + 1;
                pos[0] = '\0';
-               GNUNET_asprintf (&plugin->external_hostname, "%s:%u/%s", tmp, port, pos_url);
+               GNUNET_asprintf (&plugin->external_hostname, "%s:%u/%s", tmp, (uint16_t) port, (NULL == pos_url) ? "" : pos_url);
         }
         else
-               GNUNET_asprintf (&plugin->external_hostname, "%s:%u", tmp, port);
+               GNUNET_asprintf (&plugin->external_hostname, "%s:%u", tmp, (uint16_t) port);
       }
       else
        plugin->external_hostname = GNUNET_strdup (tmp);
@@ -2857,8 +2884,10 @@ 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) SERVER_SESSION_TIMEOUT.rel_value);
+              "Session %p was idle for %s, disconnecting\n",
+              s, 
+             GNUNET_STRINGS_relative_time_to_string (SERVER_SESSION_TIMEOUT,
+                                                     GNUNET_YES));
 
   /* call session destroy function */
  GNUNET_assert (GNUNET_OK == server_disconnect (s));
@@ -2879,8 +2908,10 @@ server_start_session_timeout (struct Session *s)
                                                   &server_session_timeout,
                                                   s);
  GNUNET_log (TIMEOUT_LOG,
-             "Timeout for session %p set to %llu ms\n",
-             s,  (unsigned long long) SERVER_SESSION_TIMEOUT.rel_value);
+             "Timeout for session %p set to %s\n",
+             s,
+            GNUNET_STRINGS_relative_time_to_string (SERVER_SESSION_TIMEOUT,
+                                                    GNUNET_YES));
 }
 
 
@@ -2900,8 +2931,10 @@ server_reschedule_session_timeout (struct Session *s)
                                                   &server_session_timeout,
                                                   s);
  GNUNET_log (TIMEOUT_LOG,
-             "Timeout rescheduled for session %p set to %llu ms\n",
-             s, (unsigned long long) SERVER_SESSION_TIMEOUT.rel_value);
+             "Timeout rescheduled for session %p set to %s\n",
+             s,
+            GNUNET_STRINGS_relative_time_to_string (SERVER_SESSION_TIMEOUT,
+                                                    GNUNET_YES));
 }
 
 
@@ -2999,7 +3032,28 @@ const char *http_plugin_address_to_string (void *cls,
                                            const void *addr,
                                            size_t addrlen)
 {
-       return http_common_plugin_address_to_string (cls, p->protocol, addr, addrlen);
+#if BUILD_HTTPS
+       return http_common_plugin_address_to_string (cls, PLUGIN_NAME, addr, addrlen);
+#else
+       return http_common_plugin_address_to_string (cls, PLUGIN_NAME, addr, addrlen);
+#endif
+
+}
+
+
+/**
+ * Function obtain the network type for a session
+ *
+ * @param cls closure ('struct Plugin*')
+ * @param session the session
+ * @return the network type in HBO or GNUNET_SYSERR
+ */
+static enum GNUNET_ATS_Network_Type
+http_server_get_network (void *cls,
+                        struct Session *session)
+{
+  GNUNET_assert (NULL != session);
+  return ntohl (session->ats_address_network_type);
 }
 
 
@@ -3042,6 +3096,7 @@ LIBGNUNET_PLUGIN_TRANSPORT_INIT (void *cls)
   api->address_to_string = &http_plugin_address_to_string;
   api->string_to_address = &http_common_plugin_string_to_address;
   api->address_pretty_printer = &http_common_plugin_address_pretty_printer;
+  api->get_network = &http_server_get_network;
 
 #if BUILD_HTTPS
   plugin->name = "transport-https_server";