new operation queue for limiting overlay connects
[oweals/gnunet.git] / src / transport / plugin_transport_http_server.c
index ea8ef428f932d0b39774679b53a2f1d5b96e2ea1..a8731907eafe7f3892a6b6ead986bcdde748e2f2 100644 (file)
@@ -397,6 +397,11 @@ struct HTTP_Message
    */
   size_t size;
 
+  /**
+   * HTTP/S specific overhead
+   */
+  size_t overhead;
+
   /**
    * Continuation function to call once the transmission buffer
    * has again space available.  NULL if there is no
@@ -680,7 +685,8 @@ server_delete_session (struct Session *s)
     GNUNET_CONTAINER_DLL_remove (s->msg_head, s->msg_tail, msg);
     if (msg->transmit_cont != NULL)
     {
-      msg->transmit_cont (msg->transmit_cont_cls, &s->target, GNUNET_SYSERR);
+      msg->transmit_cont (msg->transmit_cont_cls, &s->target, GNUNET_SYSERR,
+                          msg->size, msg->pos + msg->overhead);
     }
     GNUNET_free (msg);
     msg = tmp;
@@ -876,6 +882,7 @@ server_parse_url (struct HTTP_Server_Plugin *plugin, const char * url, struct GN
   char * separator = NULL;
   char hash[plugin->peer_id_length+1];
   int hash_length;
+  unsigned long int ctag;
 
   /* URL parsing
    * URL is valid if it is in the form [prefix with (multiple) '/'][peerid[103];tag]*/
@@ -903,19 +910,26 @@ server_parse_url (struct HTTP_Server_Plugin *plugin, const char * url, struct GN
     if (debug) GNUNET_break (0);
     return GNUNET_SYSERR;
   }
-  (*tag) = strtoul (tag_start, &tag_end, 10);
-  if ((*tag) == 0)
+  ctag = strtoul (tag_start, &tag_end, 10);
+  if (ctag == 0)
   {
     /* tag == 0 , invalid */
     if (debug) GNUNET_break (0);
     return GNUNET_SYSERR;
   }
-  if (((*tag) == ULONG_MAX) && (ERANGE == errno))
+  if ((ctag == ULONG_MAX) && (ERANGE == errno))
   {
     /* out of range: > ULONG_MAX */
     if (debug) GNUNET_break (0);
     return GNUNET_SYSERR;
   }
+  if (ctag > UINT32_MAX)
+  {
+    /* out of range: > UINT32_MAX */
+    if (debug) GNUNET_break (0);
+    return GNUNET_SYSERR;
+  }
+  (*tag) = (uint32_t) ctag;
   if (NULL == tag_end)
   {
       /* no char after tag */
@@ -1195,7 +1209,8 @@ server_send_callback (void *cls, uint64_t pos, char *buf, size_t max)
     {
       GNUNET_CONTAINER_DLL_remove (s->msg_head, s->msg_tail, msg);
       if (NULL != msg->transmit_cont)
-        msg->transmit_cont (msg->transmit_cont_cls, &s->target, GNUNET_OK);
+        msg->transmit_cont (msg->transmit_cont_cls, &s->target, GNUNET_OK,
+                            msg->size, msg->size + msg->overhead);
       GNUNET_free (msg);
     }
   }
@@ -1633,6 +1648,8 @@ server_v6_run (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 }
 
 
+#define UNSIGNED_MHD_LONG_LONG unsigned MHD_LONG_LONG
+
 /**
  * Function that queries MHD's select sets and
  * starts the task waiting for them.
@@ -1654,7 +1671,7 @@ server_schedule (struct HTTP_Server_Plugin *plugin,
   struct GNUNET_NETWORK_FDSet *wws;
   struct GNUNET_NETWORK_FDSet *wes;
   int max;
-  unsigned MHD_LONG_LONG timeout;
+  UNSIGNED_MHD_LONG_LONG timeout;
   static unsigned long long last_timeout = 0;
   int haveto;