error msg
[oweals/gnunet.git] / src / transport / plugin_transport_http_server.c
index 7e585ba04c2d271facc95a28ab686845cf40146c..97a28b694faf9fc49b73f4c52a953d7d93f4ce83 100644 (file)
 #define _RECEIVE 0
 #define _SEND 1
 
+
+/* Enable output for debbuging URL's of incoming requests */
+#define DEBUG_URL_PARSE GNUNET_NO
+
+
 /**
  * Encapsulation of all of the state of the plugin.
  */
@@ -132,6 +137,11 @@ struct Session
    */
   int session_ended;
 
+  /**
+   * Are incoming connection established at the moment
+   */
+  int connect_in_progress;
+
   /**
    * Absolute time when to receive data again
    * Used for receive throttling
@@ -527,18 +537,23 @@ http_server_plugin_send (void *cls,
   }
   if (NULL == session->server_send)
   {
+     if (GNUNET_NO == session->connect_in_progress)
+     {
       GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, session->plugin->name,
                        "Session %p/connection %p: Sending message with %u bytes to peer `%s' with FAILED\n",
                        session, session->server_send,
                        msgbuf_size, GNUNET_i2s (&session->target));
       GNUNET_break (0);
       return GNUNET_SYSERR;
+     }
+  }
+  else
+  {
+      if (GNUNET_YES == session->server_send->disconnect)
+        return GNUNET_SYSERR;
   }
 
 
-  if (GNUNET_YES == session->server_send->disconnect)
-    return GNUNET_SYSERR;
-
   GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, session->plugin->name,
                    "Session %p/connection %p: Sending message with %u to peer `%s' with \n",
                    session, session->server_send,
@@ -562,10 +577,13 @@ http_server_plugin_send (void *cls,
                             stat_txt, msgbuf_size, GNUNET_NO);
   GNUNET_free (stat_txt);
 
-  server_reschedule (session->plugin, session->server_send->mhd_daemon, GNUNET_YES);
-  server_reschedule_session_timeout (session);
-
-  /*  struct Plugin *plugin = cls; */
+  if (NULL != session->server_send)
+  {
+      server_reschedule (session->plugin,
+                         session->server_send->mhd_daemon,
+                         GNUNET_YES);
+      server_reschedule_session_timeout (session);
+  }
   return bytes_sent;
 }
 
@@ -878,8 +896,6 @@ server_mhd_connection_timeout (struct HTTP_Server_Plugin *plugin, struct Session
 static int
 server_parse_url (struct HTTP_Server_Plugin *plugin, const char * url, struct GNUNET_PeerIdentity * target, uint32_t *tag)
 {
-  int debug = GNUNET_YES;
-
   char * tag_start = NULL;
   char * tag_end = NULL;
   char * target_start = NULL;
@@ -903,7 +919,7 @@ server_parse_url (struct HTTP_Server_Plugin *plugin, const char * url, struct GN
 
   if (NULL == separator)
   {
-      if (debug) GNUNET_break (0);
+      if (DEBUG_URL_PARSE) GNUNET_break (0);
       return GNUNET_SYSERR;
   }
   tag_start = separator + 1;
@@ -911,42 +927,42 @@ server_parse_url (struct HTTP_Server_Plugin *plugin, const char * url, struct GN
   if (strlen (tag_start) == 0)
   {
     /* No tag after separator */
-    if (debug) GNUNET_break (0);
+    if (DEBUG_URL_PARSE) GNUNET_break (0);
     return GNUNET_SYSERR;
   }
   ctag = strtoul (tag_start, &tag_end, 10);
   if (ctag == 0)
   {
     /* tag == 0 , invalid */
-    if (debug) GNUNET_break (0);
+    if (DEBUG_URL_PARSE) GNUNET_break (0);
     return GNUNET_SYSERR;
   }
   if ((ctag == ULONG_MAX) && (ERANGE == errno))
   {
     /* out of range: > ULONG_MAX */
-    if (debug) GNUNET_break (0);
+    if (DEBUG_URL_PARSE) GNUNET_break (0);
     return GNUNET_SYSERR;
   }
   if (ctag > UINT32_MAX)
   {
     /* out of range: > UINT32_MAX */
-    if (debug) GNUNET_break (0);
+    if (DEBUG_URL_PARSE) GNUNET_break (0);
     return GNUNET_SYSERR;
   }
   (*tag) = (uint32_t) ctag;
   if (NULL == tag_end)
   {
       /* no char after tag */
-      if (debug) GNUNET_break (0);
+      if (DEBUG_URL_PARSE) GNUNET_break (0);
       return GNUNET_SYSERR;
   }
   if (url[strlen(url)] != tag_end[0])
   {
       /* there are more not converted chars after tag */
-      if (debug) GNUNET_break (0);
+      if (DEBUG_URL_PARSE) GNUNET_break (0);
       return GNUNET_SYSERR;
   }
-  if (debug)
+  if (DEBUG_URL_PARSE)
     GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name,
        "Found tag `%u' in url\n", (*tag));
 
@@ -962,7 +978,7 @@ server_parse_url (struct HTTP_Server_Plugin *plugin, const char * url, struct GN
   if (hash_length != plugin->peer_id_length)
   {
       /* no char after tag */
-      if (debug) GNUNET_break (0);
+      if (DEBUG_URL_PARSE) GNUNET_break (0);
       return GNUNET_SYSERR;
   }
   memcpy (hash, target_start, hash_length);
@@ -971,7 +987,7 @@ server_parse_url (struct HTTP_Server_Plugin *plugin, const char * url, struct GN
   if (GNUNET_OK != GNUNET_CRYPTO_hash_from_string ((const char *) hash, &(target->hashPubKey)))
   {
       /* hash conversion failed */
-      if (debug) GNUNET_break (0);
+      if (DEBUG_URL_PARSE) GNUNET_break (0);
       return GNUNET_SYSERR;
   }
 
@@ -1104,6 +1120,7 @@ server_lookup_connection (struct HTTP_Server_Plugin *plugin,
     s->server_send = NULL;
     s->session_passed = GNUNET_NO;
     s->session_ended = GNUNET_NO;
+    s->connect_in_progress = GNUNET_YES;
     server_start_session_timeout(s);
     GNUNET_CONTAINER_DLL_insert (plugin->head, plugin->tail, s);
   }
@@ -1120,6 +1137,10 @@ server_lookup_connection (struct HTTP_Server_Plugin *plugin,
     s->server_send = sc;
   if (direction == _RECEIVE)
     s->server_recv = sc;
+
+  if ((NULL != s->server_send) && (NULL != s->server_recv))
+    s->connect_in_progress = GNUNET_NO; /* PUT and GET are connected */
+
 #if MHD_VERSION >= 0x00090E00
   if ((NULL == s->server_recv) || (NULL == s->server_send))
   {
@@ -1335,6 +1356,9 @@ server_access_cb (void *cls, struct MHD_Connection *mhd_connection,
     else
     {
       response = MHD_create_response_from_data (strlen (HTTP_ERROR_RESPONSE), HTTP_ERROR_RESPONSE, MHD_NO, MHD_NO);
+      MHD_add_response_header (response,
+                              MHD_HTTP_HEADER_CONTENT_TYPE,
+                              "text/html");
       res = MHD_queue_response (mhd_connection, MHD_HTTP_NOT_FOUND, response);
       MHD_destroy_response (response);
       return res;