gnunet-svn
[Top][All Lists]
Advanced

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

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


From: gnunet
Subject: [GNUnet-SVN] r11591 - gnunet/src/transport
Date: Tue, 1 Jun 2010 15:39:00 +0200

Author: wachs
Date: 2010-06-01 15:39:00 +0200 (Tue, 01 Jun 2010)
New Revision: 11591

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


Modified: gnunet/src/transport/plugin_transport_http.c
===================================================================
--- gnunet/src/transport/plugin_transport_http.c        2010-06-01 12:24:30 UTC 
(rev 11590)
+++ gnunet/src/transport/plugin_transport_http.c        2010-06-01 13:39:00 UTC 
(rev 11591)
@@ -276,7 +276,7 @@
 
 
 /**
- * Our primary task for http daemon handling IPv6 connections
+ * The task sending data
  */
 static GNUNET_SCHEDULER_TaskIdentifier http_task_send;
 

Modified: gnunet/src/transport/test_plugin_transport_http.c
===================================================================
--- gnunet/src/transport/test_plugin_transport_http.c   2010-06-01 12:24:30 UTC 
(rev 11590)
+++ gnunet/src/transport/test_plugin_transport_http.c   2010-06-01 13:39:00 UTC 
(rev 11591)
@@ -52,7 +52,7 @@
 /**
  * How long until we give up on transmitting the message?
  */
-#define TEST_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 
20)
+#define TEST_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 
10)
 
 /**
  * How long between recieve and send?
@@ -60,6 +60,17 @@
 #define WAIT_INTERVALL GNUNET_TIME_relative_multiply 
(GNUNET_TIME_UNIT_SECONDS, 1)
 
 /**
+ *  Message to send using http
+ */
+struct HTTP_Message
+{
+  char *buf;
+  size_t pos;
+  size_t size;
+  size_t len;
+};
+
+/**
  * Our public key.
  */
 /* static struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded my_public_key; */
@@ -184,19 +195,36 @@
  */
 static CURLM *multi_handle;
 
+/**
+ * Test message to send
+ */
+struct HTTP_Message * msg;
 
 /**
+ * The task sending data
+ */
+static GNUNET_SCHEDULER_TaskIdentifier http_task_send;
+
+/**
  * Shutdown testcase
  */
 static void
 shutdown_clean ()
 {
+  curl_multi_cleanup(multi_handle);
+
   if (ti_send != GNUNET_SCHEDULER_NO_TASK)
   {
     GNUNET_SCHEDULER_cancel(sched,ti_send);
     ti_send = GNUNET_SCHEDULER_NO_TASK;
   }
 
+  if (http_task_send != GNUNET_SCHEDULER_NO_TASK)
+  {
+    GNUNET_SCHEDULER_cancel(sched,http_task_send);
+    http_task_send = GNUNET_SCHEDULER_NO_TASK;
+  }
+
   if (ti_timeout != GNUNET_SCHEDULER_NO_TASK)
   {
     GNUNET_SCHEDULER_cancel(sched,ti_timeout);
@@ -206,6 +234,12 @@
   GNUNET_assert (NULL == GNUNET_PLUGIN_unload 
("libgnunet_plugin_transport_http", api));
 
   GNUNET_SCHEDULER_shutdown(sched);
+
+
+
+  //GNUNET_free(msg);
+  //GNUNET_free(msg->buf);
+
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Exiting testcase\n");
   exit(fail);
   return;
@@ -273,17 +307,6 @@
   return GNUNET_TIME_UNIT_ZERO;
 }
 
-/**
- *  Message to send using http
- */
-struct HTTP_Message
-{
-  char *buf;
-  size_t pos;
-  size_t size;
-  size_t len;
-};
-
  int done;
 static size_t
 putBuffer (void *stream, size_t size, size_t nmemb, void *ptr)
@@ -311,26 +334,163 @@
   return size * nmemb;
 }
 
+static size_t send_prepare( void );
+
+static void send_execute (void *cls,
+             const struct GNUNET_SCHEDULER_TaskContext *tc)
+{
+  int running;
+  struct CURLMsg *msg;
+  CURLMcode mret;
+
+  http_task_send = GNUNET_SCHEDULER_NO_TASK;
+  if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN))
+    return;
+
+  do
+    {
+      running = 0;
+      mret = curl_multi_perform (multi_handle, &running);
+      if (running == 0)
+        {
+          do
+            {
+
+              msg = curl_multi_info_read (multi_handle, &running);
+              GNUNET_break (msg != NULL);
+              if (msg == NULL)
+                break;
+              /* get session for affected curl handle */
+              //cs = find_session_by_curlhandle (msg->easy_handle);
+              //GNUNET_assert ( cs != NULL );
+              switch (msg->msg)
+                {
+
+                case CURLMSG_DONE:
+                  if ( (msg->data.result != CURLE_OK) &&
+                       (msg->data.result != CURLE_GOT_NOTHING) )
+                    {
+
+                    GNUNET_log(GNUNET_ERROR_TYPE_INFO,
+                               _("curl failed for `%s' at %s:%d: `%s'\n"),
+                               "curl_multi_perform",
+                               __FILE__,
+                               __LINE__,
+                               curl_easy_strerror (msg->data.result));
+                    /* sending msg failed*/
+                    //if ( NULL != cs->transmit_cont)
+                    //  cs->transmit_cont (NULL,&cs->sender,GNUNET_SYSERR);
+                    }
+                  else
+                    {
+                    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                                "Send completed.\n");
+                    //if (GNUNET_OK != remove_http_message(cs, 
cs->pending_outbound_msg))
+                      //GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Message could 
not be removed from session `%s'", GNUNET_i2s(&cs->sender));
+
+                    curl_easy_cleanup(curl_handle);
+                    curl_handle=NULL;
+                    shutdown_clean();
+
+                    }
+                  return;
+                default:
+                  break;
+                }
+
+            }
+          while ( (running > 0) );
+        }
+    }
+  while (mret == CURLM_CALL_MULTI_PERFORM);
+  send_prepare();
+}
+
 /**
+ * Function setting up file descriptors and scheduling task to run
+ * @param ses session to send data to
+ * @return bytes sent to peer
+ */
+static size_t send_prepare( void )
+{
+  fd_set rs;
+  fd_set ws;
+  fd_set es;
+  int max;
+  struct GNUNET_NETWORK_FDSet *grs;
+  struct GNUNET_NETWORK_FDSet *gws;
+  long to;
+  CURLMcode mret;
+
+  max = -1;
+  FD_ZERO (&rs);
+  FD_ZERO (&ws);
+  FD_ZERO (&es);
+  mret = curl_multi_fdset (multi_handle, &rs, &ws, &es, &max);
+  if (mret != CURLM_OK)
+    {
+      GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                  _("%s failed at %s:%d: `%s'\n"),
+                  "curl_multi_fdset", __FILE__, __LINE__,
+                  curl_multi_strerror (mret));
+      return -1;
+    }
+  mret = curl_multi_timeout (multi_handle, &to);
+  if (mret != CURLM_OK)
+    {
+      GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                  _("%s failed at %s:%d: `%s'\n"),
+                  "curl_multi_timeout", __FILE__, __LINE__,
+                  curl_multi_strerror (mret));
+      return -1;
+    }
+
+  grs = GNUNET_NETWORK_fdset_create ();
+  gws = GNUNET_NETWORK_fdset_create ();
+  GNUNET_NETWORK_fdset_copy_native (grs, &rs, max + 1);
+  GNUNET_NETWORK_fdset_copy_native (gws, &ws, max + 1);
+  http_task_send = GNUNET_SCHEDULER_add_select (sched,
+                                   GNUNET_SCHEDULER_PRIORITY_DEFAULT,
+                                   GNUNET_SCHEDULER_NO_TASK,
+                                   GNUNET_TIME_relative_multiply 
(GNUNET_TIME_UNIT_SECONDS, 0),
+                                   grs,
+                                   gws,
+                                   &send_execute,
+                                   NULL);
+  GNUNET_NETWORK_fdset_destroy (gws);
+  GNUNET_NETWORK_fdset_destroy (grs);
+
+  /* FIXME: return bytes REALLY sent */
+  return 0;
+}
+
+/**
  * function to send data to server
  */
 static int send_data(struct HTTP_Message *msg, char * url)
 {
-  struct HTTP_Message cbc;
-
-
+  //return GNUNET_OK;
+  curl_handle = curl_easy_init();
+  if( NULL == curl_handle)
+  {
+    printf("easy_init failed \n");
+    return GNUNET_SYSERR;
+  }
+  curl_easy_setopt(curl_handle, CURLOPT_VERBOSE, 1L);
   curl_easy_setopt(curl_handle, CURLOPT_URL, url);
   curl_easy_setopt(curl_handle, CURLOPT_PUT, 1L);
   curl_easy_setopt (curl_handle, CURLOPT_WRITEFUNCTION, &copyBuffer);
-  curl_easy_setopt (curl_handle, CURLOPT_WRITEDATA, &cbc);
+  curl_easy_setopt (curl_handle, CURLOPT_WRITEDATA, msg);
   curl_easy_setopt (curl_handle, CURLOPT_READFUNCTION, &putBuffer);
-  curl_easy_setopt (curl_handle, CURLOPT_READDATA, &cbc);
+  curl_easy_setopt (curl_handle, CURLOPT_READDATA, msg);
   curl_easy_setopt(curl_handle, CURLOPT_INFILESIZE_LARGE, (curl_off_t) 
msg->len);
-  //curl_easy_setopt(curl_handle, CURLOPT_TIMEOUT, (timeout.value / 1000 ));
-  //curl_easy_setopt(curl_handle, CURLOPT_CONNECTTIMEOUT, 
HTTP_CONNECT_TIMEOUT);
+  curl_easy_setopt(curl_handle, CURLOPT_TIMEOUT, 30);
+  curl_easy_setopt(curl_handle, CURLOPT_CONNECTTIMEOUT, 20);
 
   curl_multi_add_handle(multi_handle, curl_handle);
 
+  send_prepare();
+
   return GNUNET_OK;
 }
 
@@ -462,7 +622,7 @@
 {
   if (NULL==address)
     return;
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,"Plugin returnedp pretty address: 
`%s'\n",address);
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,"Plugin returned pretty address: 
`%s'\n",address);
   fail_pretty_printer_count++;
 }
 
@@ -596,20 +756,20 @@
   /* test sending to client */
   multi_handle = curl_multi_init();
 
-
   /*building messages */
-  struct HTTP_Message msg;
+  msg = GNUNET_malloc (sizeof (struct HTTP_Message));
+  msg->size = 2048;
+  msg->pos = 0;
+  msg->buf = GNUNET_malloc (2048);
 
+  res = send_data (msg, "http://localhost:12389/";);
 
-  res = send_data (&msg, "http://localhost:12389/";);
-
-
   /* testing finished, shutting down */
   if ((fail_notify_address == GNUNET_NO) && (fail_pretty_printer == GNUNET_NO) 
&& (fail_addr_to_str == GNUNET_NO) )
     fail = 0;
   else
     fail = 1;
-  shutdown_clean();
+  //shutdown_clean();
   return;
 }
 




reply via email to

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