gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r12038 - gnunet/src/transport


From: gnunet
Subject: [GNUnet-SVN] r12038 - gnunet/src/transport
Date: Mon, 28 Jun 2010 15:22:04 +0200

Author: wachs
Date: 2010-06-28 15:22:04 +0200 (Mon, 28 Jun 2010)
New Revision: 12038

Modified:
   gnunet/src/transport/plugin_transport_http.c
Log:


Modified: gnunet/src/transport/plugin_transport_http.c
===================================================================
--- gnunet/src/transport/plugin_transport_http.c        2010-06-28 13:05:31 UTC 
(rev 12037)
+++ gnunet/src/transport/plugin_transport_http.c        2010-06-28 13:22:04 UTC 
(rev 12038)
@@ -104,13 +104,6 @@
 
 };
 
-struct HTTP_inbound_transmission
-{
-  /**
-   * bytes received
-   */
-  size_t bytes_recv;
-};
 
 /**
  *  Message to send using http
@@ -156,11 +149,11 @@
 };
 
 
-struct HTTP_Connection
+struct HTTP_Connection_out
 {
-  struct HTTP_Connection * next;
+  struct HTTP_Connection_out * next;
 
-  struct HTTP_Connection * prev;
+  struct HTTP_Connection_out * prev;
 
   void * addr;
   size_t addrlen;
@@ -179,6 +172,34 @@
   struct Session * session;
 };
 
+struct HTTP_Connection_in
+{
+  struct HTTP_Connection_in * next;
+
+  struct HTTP_Connection_in * prev;
+
+  void * addr;
+  size_t addrlen;
+
+  unsigned int connected;
+  unsigned int send_paused;
+
+  struct GNUNET_SERVER_MessageStreamTokenizer * msgtok;
+
+  struct Session * session;
+
+  /**
+   * Is there a HTTP/PUT in progress?
+   */
+  int is_put_in_progress;
+
+  /**
+   * Is the http request invalid?
+   */
+  int is_bad_request;
+};
+
+
 /**
  * Session handle for connections.
  */
@@ -240,26 +261,11 @@
   uint32_t quota;
 
   /**
-   * Is there a HTTP/PUT in progress?
-   */
-  int is_put_in_progress;
-
-  /**
-   * Is the http request invalid?
-   */
-  int is_bad_request;
-
-  /**
    * Encoded hash
    */
   struct GNUNET_CRYPTO_HashAsciiEncoded hash;
 
   /**
-   * Incoming message
-   */
-  struct HTTP_inbound_transmission pending_inbound_msg;
-
-  /**
    * curl handle for outbound transmissions
    */
   CURL *curl_handle;
@@ -267,10 +273,13 @@
   /**
    * Message tokenizer for incoming data
    */
-  struct GNUNET_SERVER_MessageStreamTokenizer * msgtok;
+  //struct GNUNET_SERVER_MessageStreamTokenizer * msgtok;
 
-  struct HTTP_Connection *outbound_connections_head;
-  struct HTTP_Connection *outbound_connections_tail;
+  struct HTTP_Connection_out *outbound_connections_head;
+  struct HTTP_Connection_out *outbound_connections_tail;
+
+  struct HTTP_Connection_in *inbound_connections_head;
+  struct HTTP_Connection_in *inbound_connections_tail;
 };
 
 /**
@@ -364,8 +373,6 @@
   cs->plugin = plugin;
   memcpy(&cs->identity, peer, sizeof (struct GNUNET_PeerIdentity));
   GNUNET_CRYPTO_hash_to_enc(&cs->identity.hashPubKey,&(cs->hash));
-  cs->pending_inbound_msg.bytes_recv = 0;
-  cs->msgtok = NULL;
   cs->outbound_connections_head = NULL;
   cs->outbound_connections_tail = NULL;
   return cs;
@@ -403,21 +410,141 @@
   return cs;
 }
 
+static char * create_url(void * cls, const void * addr, size_t addrlen)
+{
+  struct Plugin *plugin = cls;
+  char *address;
+  char *url = NULL;
 
+  GNUNET_assert ((addr!=NULL) && (addrlen != 0));
+  if (addrlen == (sizeof (struct IPv4HttpAddress)))
+  {
+    address = GNUNET_malloc(INET_ADDRSTRLEN + 1);
+    inet_ntop(AF_INET, &((struct IPv4HttpAddress *) 
addr)->ipv4_addr,address,INET_ADDRSTRLEN);
+    GNUNET_asprintf (&url,
+                     "http://%s:%u/%s";,
+                     address,
+                     ntohs(((struct IPv4HttpAddress *) addr)->u_port),
+                     (char *) (&plugin->my_ascii_hash_ident));
+    GNUNET_free(address);
+  }
+  else if (addrlen == (sizeof (struct IPv6HttpAddress)))
+  {
+    address = GNUNET_malloc(INET6_ADDRSTRLEN + 1);
+    inet_ntop(AF_INET6, &((struct IPv6HttpAddress *) 
addr)->ipv6_addr,address,INET6_ADDRSTRLEN);
+    GNUNET_asprintf(&url,
+                    "http://%s:%u/%s";,
+                    address,
+                    ntohs(((struct IPv6HttpAddress *) addr)->u6_port),
+                    (char *) (&plugin->my_ascii_hash_ident));
+    GNUNET_free(address);
+  }
+  return url;
+}
+
 /**
+ * Check if session already knows this address for a outbound connection to 
this peer
+ * If address not in session, add it to the session
+ * @param cls the plugin used
+ * @param p the session
+ * @param addr address
+ * @param addr_len address length
+ * @return the found or created address
+ */
+static struct HTTP_Connection_out * session_check_outbound_address (void * 
cls, struct Session *cs, const void * addr, size_t addr_len)
+{
+  struct Plugin *plugin = cls;
+  struct HTTP_Connection_out * cc = cs->outbound_connections_head;
+  struct HTTP_Connection_out * con = NULL;
+
+  GNUNET_assert((addr_len == sizeof (struct IPv4HttpAddress)) || (addr_len == 
sizeof (struct IPv6HttpAddress)));
+
+  while (cc!=NULL)
+  {
+    if (addr_len == cc->addrlen)
+    {
+      if (0 == memcmp(cc->addr, addr, addr_len))
+      {
+        con = cc;
+        break;
+      }
+    }
+    cc=cc->next;
+  }
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,"No connection info for this address was 
found\n",GNUNET_i2s(&cs->identity));
+  if (con==NULL)
+  {
+    con = GNUNET_malloc(sizeof(struct HTTP_Connection_out) + addr_len);
+    con->addrlen = addr_len;
+    con->addr=&con[1];
+    con->url=create_url(plugin, addr, addr_len);
+    con->connected = GNUNET_NO;
+    con->session = cs;
+    memcpy(con->addr, addr, addr_len);
+    
GNUNET_CONTAINER_DLL_insert(cs->outbound_connections_head,cs->outbound_connections_tail,con);
+  }
+  return con;
+}
+
+
+/**
+ * Check if session already knows this address for a inbound connection to 
this peer
+ * If address not in session, add it to the session
+ * @param cls the plugin used
+ * @param p the session
+ * @param addr address
+ * @param addr_len address length
+ * @return the found or created address
+ */
+static struct HTTP_Connection_in * session_check_inbound_address (void * cls, 
struct Session *cs, const void * addr, size_t addr_len)
+{
+  //struct Plugin *plugin = cls;
+  struct HTTP_Connection_in * cc = cs->inbound_connections_head;
+  struct HTTP_Connection_in * con = NULL;
+
+  GNUNET_assert((addr_len == sizeof (struct IPv4HttpAddress)) || (addr_len == 
sizeof (struct IPv6HttpAddress)));
+
+  while (cc!=NULL)
+  {
+    if (addr_len == cc->addrlen)
+    {
+      if (0 == memcmp(cc->addr, addr, addr_len))
+      {
+        con = cc;
+        break;
+      }
+    }
+    cc=cc->next;
+  }
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,"No connection info for this address was 
found\n",GNUNET_i2s(&cs->identity));
+  if (con==NULL)
+  {
+    con = GNUNET_malloc(sizeof(struct HTTP_Connection_in) + addr_len);
+    con->addrlen = addr_len;
+    con->addr=&con[1];
+    con->connected = GNUNET_NO;
+    con->session = cs;
+    memcpy(con->addr, addr, addr_len);
+    
GNUNET_CONTAINER_DLL_insert(cs->inbound_connections_head,cs->inbound_connections_tail,con);
+  }
+  return con;
+}
+
+
+/**
  * Callback called by MHD when a connection is terminated
  */
 static void requestCompletedCallback (void *cls, struct MHD_Connection * 
connection, void **httpSessionCache)
 {
-  struct Session * cs;
+  struct HTTP_Connection_in * con;
 
-  cs = *httpSessionCache;
-  if (cs == NULL)
+  con = *httpSessionCache;
+  if (con == NULL)
     return;
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,"Connection from peer `%s' was 
terminated\n",GNUNET_i2s(&cs->identity));
-    /* session set to inactive */
-    cs->is_put_in_progress = GNUNET_NO;
-    cs->is_bad_request = GNUNET_NO;
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,"Connection from peer `%s' was 
terminated\n",GNUNET_i2s(&con->session->identity));
+  /* session set to inactive */
+  con->is_put_in_progress = GNUNET_NO;
+  con->is_bad_request = GNUNET_NO;
 }
 
 
@@ -425,19 +552,19 @@
                                       void *client,
                                       const struct GNUNET_MessageHeader 
*message)
 {
-  struct Session * cs = cls;
-  GNUNET_assert(cs != NULL);
+  struct HTTP_Connection_in * con = cls;
+  GNUNET_assert(con != NULL);
 
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
              "Received message with type %u and size %u from `%s'\n",
              ntohs(message->type),
               ntohs(message->size),
-             GNUNET_i2s(&(cs->identity)));
-  cs->plugin->env->receive (cs->plugin->env->cls,
-                           &cs->identity,
-                           message, 1, cs,
-                           cs->addr_out,
-                           cs->addr_out_len);
+             GNUNET_i2s(&(con->session->identity)));
+  con->session->plugin->env->receive (con->session->plugin->env->cls,
+                           &con->session->identity,
+                           message, 1, con->session,
+                           NULL,
+                           0);
 }
 
 /**
@@ -463,7 +590,7 @@
  */
 static int
 accessHandlerCallback (void *cls,
-                       struct MHD_Connection *session,
+                       struct MHD_Connection *mhd_connection,
                        const char *url,
                        const char *method,
                        const char *version,
@@ -473,6 +600,7 @@
   struct Plugin *plugin = cls;
   struct MHD_Response *response;
   struct Session * cs;
+  struct HTTP_Connection_in * con;
   const union MHD_ConnectionInfo * conn_info;
   struct sockaddr_in  *addrin;
   struct sockaddr_in6 *addrin6;
@@ -485,7 +613,7 @@
 
   GNUNET_assert(cls !=NULL);
   send_error_to_client = GNUNET_NO;
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,"accessHandlerCallback, 
upload_data_size: %u\n", *upload_data_size);
+
   if ( NULL == *httpSessionCache)
   {
     /* check url for peer identity , if invalid send HTTP 404*/
@@ -493,7 +621,7 @@
     if ( GNUNET_SYSERR == res )
     {
       response = MHD_create_response_from_data (strlen 
(HTTP_ERROR_RESPONSE),HTTP_ERROR_RESPONSE, MHD_NO, MHD_NO);
-      res = MHD_queue_response (session, MHD_HTTP_NOT_FOUND, response);
+      res = MHD_queue_response (mhd_connection, MHD_HTTP_NOT_FOUND, response);
       MHD_destroy_response (response);
       if (res == MHD_YES)
         GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,"Peer has no valid ident, sent 
HTTP 1.1/404\n");
@@ -502,7 +630,10 @@
       return res;
     }
 
-    conn_info = MHD_get_connection_info(session, 
MHD_CONNECTION_INFO_CLIENT_ADDRESS );
+    /* get session for peer identity */
+    cs = session_get (plugin ,&pi_in);
+
+    conn_info = MHD_get_connection_info(mhd_connection, 
MHD_CONNECTION_INFO_CLIENT_ADDRESS );
     /* Incoming IPv4 connection */
     if ( AF_INET == conn_info->client_addr->sin_family)
     {
@@ -510,6 +641,7 @@
       inet_ntop(addrin->sin_family, 
&(addrin->sin_addr),address,INET_ADDRSTRLEN);
       memcpy(&ipv4addr.ipv4_addr,&(addrin->sin_addr),sizeof(struct in_addr));
       ipv4addr.u_port = addrin->sin_port;
+      con = session_check_inbound_address (plugin, cs, (const void *) 
&ipv4addr, sizeof (struct IPv4HttpAddress));
     }
     /* Incoming IPv6 connection */
     if ( AF_INET6 == conn_info->client_addr->sin_family)
@@ -518,147 +650,62 @@
       inet_ntop(addrin6->sin6_family, 
&(addrin6->sin6_addr),address,INET6_ADDRSTRLEN);
       memcpy(&ipv6addr.ipv6_addr,&(addrin6->sin6_addr),sizeof(struct in_addr));
       ipv6addr.u6_port = addrin6->sin6_port;
+      con = session_check_inbound_address (plugin, cs, &ipv6addr, sizeof 
(struct IPv6HttpAddress));
     }
-    /* get session for peer identity */
-    cs = session_get (plugin ,&pi_in);
-
-
-
-    /* no existing session, create a new one*/
-    if (cs == NULL )
-    {
-      /* create new session object */
-      if ( AF_INET6 == conn_info->client_addr->sin_family)
-        cs = create_session(plugin, (char *) &ipv6addr, sizeof(struct 
IPv6HttpAddress),NULL, 0, &pi_in);
-      if ( AF_INET == conn_info->client_addr->sin_family)
-        cs = create_session(plugin, (char *) &ipv4addr, sizeof(struct 
IPv4HttpAddress),NULL, 0, &pi_in);
-
-      /* Insert session into hashmap */
-      GNUNET_CONTAINER_multihashmap_put ( plugin->sessions,
-                                          &cs->identity.hashPubKey,
-                                          cs,
-                                          
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY);
-
-      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,"New Session for peer `%s' 
inserted\n", GNUNET_i2s(&cs->identity));
-    }
-
     /* Set closure and update current session*/
-    if (*httpSessionCache == NULL)
-    {
-      *httpSessionCache = cs;
-      /* Updating session */
-      /*
-      memcpy(cs->addr_inbound,conn_info->client_addr, sizeof(struct 
sockaddr_in));
-      if ( AF_INET == cs->addr_inbound->sin_family)
-      {
-        
GNUNET_asprintf(&cs->addr_inbound_str,"%s:%u",address,ntohs(cs->addr_inbound->sin_port));
-      }
 
-      if ( AF_INET6 == cs->addr_inbound->sin_family)
-      {
-        
GNUNET_asprintf(&cs->addr_inbound_str,"[%s]:%u",address,ntohs(cs->addr_inbound->sin_port));
+    *httpSessionCache = con;
+    if (con->msgtok==NULL)
+      con->msgtok = GNUNET_SERVER_mst_create (GNUNET_SERVER_MAX_MESSAGE_SIZE - 
1, &messageTokenizerCallback, con);
 
-      }
-      */
-      if (cs->msgtok==NULL)
-        cs->msgtok = GNUNET_SERVER_mst_create (GNUNET_SERVER_MAX_MESSAGE_SIZE 
- 1, &messageTokenizerCallback, cs);
-    }
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,"HTTP Daemon has new an incoming `%s' 
request from peer `%s'\n",method, GNUNET_i2s(&cs->identity));
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,"HTTP Daemon has new an incoming `%s' 
request from peer `%s'@`%s'\n",method, GNUNET_i2s(&cs->identity),address);
   }
   else
   {
-    cs = *httpSessionCache;
+    con = *httpSessionCache;
+    cs = con->session;
   }
+
   /* Is it a PUT or a GET request */
   if (0 == strcmp (MHD_HTTP_METHOD_PUT, method))
   {
-    /* New  */
-    if ((*upload_data_size == 0) && (cs->is_put_in_progress == GNUNET_NO))
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,"PUT, Upload size: %u addrlen %u\n", 
*upload_data_size, con->addrlen);
+    if ((*upload_data_size == 0) && (con->is_put_in_progress==GNUNET_NO))
     {
-      if (cs->pending_inbound_msg.bytes_recv !=0 )
-      {
-        GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                    _("Incoming message from peer `%s', while existing message 
with %u bytes was not forwarded to transport'\n"),
-                    GNUNET_i2s(&cs->identity), 
cs->pending_inbound_msg.bytes_recv);
-        cs->pending_inbound_msg.bytes_recv = 0;
-      }
-      /* not yet ready */
-      cs->is_put_in_progress = GNUNET_YES;
-      cs->is_bad_request = GNUNET_NO;
+      con->is_put_in_progress = GNUNET_YES;
       return MHD_YES;
     }
 
-    if ((*upload_data_size > 0) && (cs->is_bad_request != GNUNET_YES))
+    /* Transmission of all data complete */
+    if ((*upload_data_size == 0) && (con->is_put_in_progress == GNUNET_YES))
     {
-      if (*upload_data_size + cs->pending_inbound_msg.bytes_recv < 
GNUNET_SERVER_MAX_MESSAGE_SIZE)
-      {
-        /* copy uploaded data to buffer */
-
-        res = GNUNET_SERVER_mst_receive(cs->msgtok, cs, 
upload_data,*upload_data_size, GNUNET_YES, GNUNET_NO);
-        GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,"%u bytes forwarded to MST: 
result: %u\n",*upload_data_size, res);
-        cs->pending_inbound_msg.bytes_recv += *upload_data_size;
-        *upload_data_size = 0;
+        response = MHD_create_response_from_data (strlen 
(HTTP_PUT_RESPONSE),HTTP_PUT_RESPONSE, MHD_NO, MHD_NO);
+        res = MHD_queue_response (mhd_connection, MHD_HTTP_OK, response);
+        GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,"Sent HTTP/1.1: 200 OK as PUT 
Response\n",HTTP_PUT_RESPONSE, strlen (HTTP_PUT_RESPONSE), res );
+        MHD_destroy_response (response);
         return MHD_YES;
-      }
-      else
-      {
-        GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,"%u bytes not added to message of 
%u bytes, message to big\n",*upload_data_size, 
cs->pending_inbound_msg.bytes_recv);
-        cs->is_bad_request = GNUNET_YES;
-        /* (*upload_data_size) bytes not processed */
-        return MHD_YES;
-      }
-    }
 
-    if ((cs->is_put_in_progress == GNUNET_YES) && (cs->is_bad_request == 
GNUNET_YES))
-    {
-      *upload_data_size = 0;
-      response = MHD_create_response_from_data (strlen 
(HTTP_PUT_RESPONSE),HTTP_PUT_RESPONSE, MHD_NO, MHD_NO);
-      res = MHD_queue_response (session, MHD_HTTP_REQUEST_ENTITY_TOO_LARGE, 
response);
-      if (res == MHD_YES)
-      {
-        GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,"Sent HTTP/1.1: 413 Request Entity 
Too Large as PUT Response\n");
-        cs->is_bad_request = GNUNET_NO;
-        cs->is_put_in_progress =GNUNET_NO;
-        cs->pending_inbound_msg.bytes_recv = 0;
-      }
-      MHD_destroy_response (response);
-      return MHD_YES;
+      con->is_put_in_progress = GNUNET_NO;
+      con->is_bad_request = GNUNET_NO;
+      return res;
     }
 
     /* Transmission of all data complete */
-    if ((*upload_data_size == 0) && (cs->is_put_in_progress == GNUNET_YES) && 
(cs->is_bad_request == GNUNET_NO))
+    if ((*upload_data_size > 0) && (con->is_put_in_progress == GNUNET_YES))
     {
-      send_error_to_client = GNUNET_YES;
-      if (cs->pending_inbound_msg.bytes_recv >= sizeof (struct 
GNUNET_MessageHeader))
-          send_error_to_client = GNUNET_NO;
-
-      if (send_error_to_client == GNUNET_NO)
-      {
-        //response = MHD_create_response_from_data (strlen 
(HTTP_PUT_RESPONSE),HTTP_PUT_RESPONSE, MHD_NO, MHD_NO);
-        //res = MHD_queue_response (session, MHD_HTTP_OK, response);
-        //GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,"Sent HTTP/1.1: 200 OK as PUT 
Response\n",HTTP_PUT_RESPONSE, strlen (HTTP_PUT_RESPONSE), res );
-        //MHD_destroy_response (response);
-        return MHD_YES;
-      }
-      else
-      {
-        response = MHD_create_response_from_data (strlen 
(HTTP_PUT_RESPONSE),HTTP_PUT_RESPONSE, MHD_NO, MHD_NO);
-        res = MHD_queue_response (session, MHD_HTTP_BAD_REQUEST, response);
-        MHD_destroy_response (response);
-        GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,"Sent HTTP/1.1: 400 BAD REQUEST as 
PUT Response\n");
-      }
-      cs->is_put_in_progress = GNUNET_NO;
-      cs->is_bad_request = GNUNET_NO;
-      cs->pending_inbound_msg.bytes_recv = 0;
-      return res;
+      res = GNUNET_SERVER_mst_receive(con->msgtok, cs, 
upload_data,*upload_data_size, GNUNET_YES, GNUNET_NO);
+      (*upload_data_size) = 0;
+      return MHD_YES;
     }
+    else
+      return MHD_NO;
   }
   if ( 0 == strcmp (MHD_HTTP_METHOD_GET, method) )
   {
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,"Got GET Request\n");
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,"URL: `%s'\n",url);
     response = MHD_create_response_from_data (strlen 
(HTTP_PUT_RESPONSE),HTTP_PUT_RESPONSE, MHD_NO, MHD_NO);
-    res = MHD_queue_response (session, MHD_HTTP_OK, response);
+    res = MHD_queue_response (mhd_connection, MHD_HTTP_OK, response);
     MHD_destroy_response (response);
     return res;
   }
@@ -798,7 +845,7 @@
  * @return GNUNET_SYSERR if msg not found, GNUNET_OK on success
  */
 
-static int remove_http_message(struct HTTP_Connection * con, struct 
HTTP_Message * msg)
+static int remove_http_message(struct HTTP_Connection_out * con, struct 
HTTP_Message * msg)
 {
   
GNUNET_CONTAINER_DLL_remove(con->pending_msgs_head,con->pending_msgs_tail,msg);
   GNUNET_free(msg);
@@ -844,26 +891,13 @@
  */
 static size_t send_read_callback(void *stream, size_t size, size_t nmemb, void 
*ptr)
 {
-  struct HTTP_Connection * con = ptr;
+  struct HTTP_Connection_out * con = ptr;
   struct HTTP_Message * msg = con->pending_msgs_tail;
   size_t bytes_sent;
   size_t len;
 
-  msg = con->pending_msgs_head;
-  unsigned int c = 0;
-  while (msg != NULL)
-  {
-    c++;
-    msg = msg->next;
-  }
-  if (con->pending_msgs_tail != NULL)
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,"readcallback: msg of %u bytes, %u 
msgs in queue\n", con->pending_msgs_tail->size,c);
-  else
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,"readcallback: %u msgs in queue\n", c);
-
   if (con->pending_msgs_tail == NULL)
   {
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,"no msgs in queue, pausing \n");
     con->send_paused = GNUNET_YES;
     return CURL_READFUNC_PAUSE;
   }
@@ -902,8 +936,6 @@
       msg->transmit_cont 
(con->pending_msgs_tail->transmit_cont_cls,&(con->session)->identity,GNUNET_OK);
     remove_http_message(con, msg);
   }
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,"readcallback: sent %u bytes \n", 
bytes_sent);
-
   return bytes_sent;
 }
 
@@ -944,7 +976,7 @@
  * @param ses session to send data to
  * @return bytes sent to peer
  */
-static ssize_t send_initiate (void *cls, struct Session* ses , struct 
HTTP_Connection *con)
+static ssize_t send_initiate (void *cls, struct Session* ses , struct 
HTTP_Connection_out *con)
 {
   struct Plugin *plugin = cls;
   int bytes_sent = 0;
@@ -1015,7 +1047,7 @@
   int running;
   struct CURLMsg *msg;
   CURLMcode mret;
-  struct HTTP_Connection * con = NULL;
+  struct HTTP_Connection_out * con = NULL;
   struct Session * cs = NULL;
   long http_result;
 
@@ -1169,82 +1201,7 @@
 }
 
 
-static char * create_url(void * cls, const void * addr, size_t addrlen)
-{
-  struct Plugin *plugin = cls;
-  char *address;
-  char *url = NULL;
-
-  GNUNET_assert ((addr!=NULL) && (addrlen != 0));
-  if (addrlen == (sizeof (struct IPv4HttpAddress)))
-  {
-    address = GNUNET_malloc(INET_ADDRSTRLEN + 1);
-    inet_ntop(AF_INET, &((struct IPv4HttpAddress *) 
addr)->ipv4_addr,address,INET_ADDRSTRLEN);
-    GNUNET_asprintf (&url,
-                     "http://%s:%u/%s";,
-                     address,
-                     ntohs(((struct IPv4HttpAddress *) addr)->u_port),
-                     (char *) (&plugin->my_ascii_hash_ident));
-    GNUNET_free(address);
-  }
-  else if (addrlen == (sizeof (struct IPv6HttpAddress)))
-  {
-    address = GNUNET_malloc(INET6_ADDRSTRLEN + 1);
-    inet_ntop(AF_INET6, &((struct IPv6HttpAddress *) 
addr)->ipv6_addr,address,INET6_ADDRSTRLEN);
-    GNUNET_asprintf(&url,
-                    "http://%s:%u/%s";,
-                    address,
-                    ntohs(((struct IPv6HttpAddress *) addr)->u6_port),
-                    (char *) (&plugin->my_ascii_hash_ident));
-    GNUNET_free(address);
-  }
-  return url;
-}
-
 /**
- * Check if session already knows this address for a outbound connection to 
this peer
- * If address not in session, add it to the session
- * @param cls the plugin used
- * @param p the session
- * @param addr address
- * @param addr_len address length
- * @return GNUNET_NO if address not known, GNUNET_YES if known
- */
-static struct HTTP_Connection * session_check_address (void * cls, struct 
Session *cs, const void * addr, size_t addr_len)
-{
-  struct Plugin *plugin = cls;
-  struct HTTP_Connection * cc = cs->outbound_connections_head;
-  struct HTTP_Connection * con = NULL;
-
-  GNUNET_assert((addr_len == sizeof (struct IPv4HttpAddress)) || (addr_len == 
sizeof (struct IPv6HttpAddress)));
-
-  while (cc!=NULL)
-  {
-    if (addr_len == cc->addrlen)
-    {
-      if (0 == memcmp(cc->addr, addr, addr_len))
-      {
-        con = cc;
-        break;
-      }
-    }
-    cc=cc->next;
-  }
-  if (con==NULL)
-  {
-    con = GNUNET_malloc(sizeof(struct HTTP_Connection) + addr_len);
-    con->addrlen = addr_len;
-    con->addr=&con[1];
-    con->url=create_url(plugin, addr, addr_len);
-    con->connected = GNUNET_NO;
-    con->session = cs;
-    memcpy(con->addr, addr, addr_len);
-    
GNUNET_CONTAINER_DLL_insert(cs->outbound_connections_head,cs->outbound_connections_tail,con);
-  }
-  return con;
-}
-
-/**
  * Function that can be used by the transport service to transmit
  * a message using the plugin.
  *
@@ -1289,7 +1246,7 @@
   char *url;
   struct Session *cs;
   struct HTTP_Message *msg;
-  struct HTTP_Connection *con;
+  struct HTTP_Connection_out *con;
   //unsigned int ret;
 
   GNUNET_assert(cls !=NULL);
@@ -1298,7 +1255,7 @@
 
   /* get session from hashmap */
   cs = session_get(plugin, target);
-  con = session_check_address(plugin, cs, addr, addrlen);
+  con = session_check_outbound_address(plugin, cs, addr, addrlen);
 
   /* create msg */
   msg = GNUNET_malloc (sizeof (struct HTTP_Message) + msgbuf_size);
@@ -1425,7 +1382,7 @@
  */
 static int
 http_plugin_address_suggested (void *cls,
-                                  void *addr, size_t addrlen)
+                               const void *addr, size_t addrlen)
 {
   struct Plugin *plugin = cls;
   struct IPv4HttpAddress *v4;
@@ -1464,8 +1421,6 @@
         return GNUNET_SYSERR;
       }
     }
-
-
   return GNUNET_OK;
 }
 
@@ -1592,8 +1547,8 @@
 int hashMapFreeIterator (void *cls, const GNUNET_HashCode *key, void *value)
 {
   struct Session * cs = value;
-  struct HTTP_Connection * con = cs->outbound_connections_head;
-  struct HTTP_Connection * tmp_con = cs->outbound_connections_head;
+  struct HTTP_Connection_out * con = cs->outbound_connections_head;
+  struct HTTP_Connection_out * tmp_con = cs->outbound_connections_head;
   struct HTTP_Message * msg = NULL;
   struct HTTP_Message * tmp_msg = NULL;
 
@@ -1602,13 +1557,10 @@
   /* freeing connections */
   while (con!=NULL)
   {
-
-
     GNUNET_free(con->url);
     if (con->curl_handle!=NULL)
       curl_easy_cleanup(con->curl_handle);
     con->curl_handle = NULL;
-
     msg = con->pending_msgs_head;
     while (msg!=NULL)
     {
@@ -1618,13 +1570,10 @@
     }
     tmp_con=con->next;
     GNUNET_free(con);
-    con=tmp_con->next;
+    con=tmp_con;
   }
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,"All sessions freed \n");
 
-  GNUNET_SERVER_mst_destroy (cs->msgtok);
-  GNUNET_free_non_null (cs->addr_in);
-  GNUNET_free_non_null (cs->addr_out);
   GNUNET_free (cs);
   return GNUNET_YES;
 }




reply via email to

[Prev in Thread] Current Thread [Next in Thread]