gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r21738 - gnunet/src/gns


From: gnunet
Subject: [GNUnet-SVN] r21738 - gnunet/src/gns
Date: Sun, 3 Jun 2012 12:46:07 +0200

Author: schanzen
Date: 2012-06-03 12:46:07 +0200 (Sun, 03 Jun 2012)
New Revision: 21738

Modified:
   gnunet/src/gns/gnunet-gns-proxy.c
Log:
-fixes


Modified: gnunet/src/gns/gnunet-gns-proxy.c
===================================================================
--- gnunet/src/gns/gnunet-gns-proxy.c   2012-06-03 09:15:41 UTC (rev 21737)
+++ gnunet/src/gns/gnunet-gns-proxy.c   2012-06-03 10:46:07 UTC (rev 21738)
@@ -85,6 +85,7 @@
   struct ProxyCurlTask *next;
 
   CURL *curl;
+  char url[2048];
   char buffer[CURL_MAX_WRITE_SIZE];
   int buf_status;
   unsigned int bytes_downloaded;
@@ -123,7 +124,15 @@
   return MHD_YES;
 }
 
+
 /**
+ * schedule mhd
+ */
+static void
+run_httpd (void);
+
+
+/**
  * Process cURL download bits
  *
  * @param ptr buffer with data
@@ -173,7 +182,26 @@
   return total;
 }
 
+
+
 /**
+ * Callback to free content
+ *
+ * @param cls content to free
+ */
+static void
+mhd_content_free (void *cls)
+{
+  struct ProxyCurlTask *ctask = cls;
+
+  if (ctask->curl != NULL)
+    curl_easy_cleanup (ctask->curl);
+
+  GNUNET_free (ctask);
+
+}
+
+/**
  * Callback for MHD response
  *
  * @param cls closure
@@ -195,6 +223,8 @@
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                 "MHD: sending response\n");
     ctask->download_in_progress = GNUNET_NO;
+    curl_multi_remove_handle (curl_multi, ctask->curl);
+    curl_easy_cleanup (ctask->curl);
     return MHD_CONTENT_READER_END_OF_STREAM;
   }
   
@@ -202,8 +232,10 @@
       (ctask->buf_status == BUF_WAIT_FOR_CURL))
   {
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                "MHD: error sending response\n");
+                "MHD: sending error response\n");
     ctask->download_in_progress = GNUNET_NO;
+    curl_multi_remove_handle (curl_multi, ctask->curl);
+    curl_easy_cleanup (ctask->curl);
     return MHD_CONTENT_READER_END_WITH_ERROR;
   }
 
@@ -234,11 +266,6 @@
 }
 
 
-/**
- * schedule mhd
- */
-static void
-run_httpd (void);
 
 /**
  * Task that is run when we are ready to receive more data
@@ -324,6 +351,7 @@
   struct CURLMsg *msg;
   CURLMcode mret;
   struct ProxyCurlTask *ctask;
+  int num_ctasks;
 
   curl_download_task = GNUNET_SCHEDULER_NO_TASK;
 
@@ -340,11 +368,27 @@
   do
   {
     running = 0;
+    num_ctasks = 0;
     
     mret = curl_multi_perform (curl_multi, &running);
 
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                 "Running curl tasks: %d\n", running);
+
+    ctask = ctasks_head;
+    for (; ctask != NULL; ctask = ctask->next)
+    {
+      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                  "CTask: %s\n", ctask->url);
+      num_ctasks++;
+    }
+
+    if (num_ctasks != running)
+    {
+      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                  "%d ctasks, %d curl running\n", num_ctasks, running);
+    }
+    
     do
     {
       ctask = ctasks_head;
@@ -360,25 +404,27 @@
          if ((msg->data.result != CURLE_OK) &&
              (msg->data.result != CURLE_GOT_NOTHING))
          {
-           GNUNET_log (GNUNET_ERROR_TYPE_INFO,
-                       "Download curl failed %s\n",
-                      curl_easy_strerror (msg->data.result));
+           GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                       "Download curl failed");
             
            for (; ctask != NULL; ctask = ctask->next)
            {
-             if (memcmp (msg->easy_handle, ctask->curl, sizeof (CURL)) == 0)
-             {
-               GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                           "cURL task found.\n");
-               ctask->download_successful = GNUNET_NO;
-               ctask->download_error = GNUNET_YES;
-               curl_multi_remove_handle (curl_multi, ctask->curl);
-               curl_easy_cleanup (ctask->curl);
-               GNUNET_CONTAINER_DLL_remove (ctasks_head, ctasks_tail,
-                                            ctask);
-               break;
-             }
+             if (memcmp (msg->easy_handle, ctask->curl, sizeof (CURL)) != 0)
+               continue;
+             
+             GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                         "Download curl failed for task %s: %s.\n",
+                         ctask->url,
+                         curl_easy_strerror (msg->data.result));
+             ctask->download_successful = GNUNET_NO;
+             ctask->download_error = GNUNET_YES;
+             //curl_multi_remove_handle (curl_multi, ctask->curl);
+             //curl_easy_cleanup (ctask->curl);
+             GNUNET_CONTAINER_DLL_remove (ctasks_head, ctasks_tail,
+                                          ctask);
+             break;
            }
+           GNUNET_assert (ctask != NULL);
          }
          else
          {
@@ -387,37 +433,54 @@
 
            for (; ctask != NULL; ctask = ctask->next)
            {
-             if (memcmp (msg->easy_handle, ctask->curl, sizeof (CURL)) == 0)
-             {
-               GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                           "cURL task found.\n");
-               ctask->download_successful = GNUNET_YES;
-               curl_multi_remove_handle (curl_multi, ctask->curl);
-               curl_easy_cleanup (ctask->curl);
-               GNUNET_CONTAINER_DLL_remove (ctasks_head, ctasks_tail,
-                                            ctask);
-               break;
-             }
-             else
-               GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                           "cURL task skipped.\n");
+             if (memcmp (msg->easy_handle, ctask->curl, sizeof (CURL)) != 0)
+               continue;
+             
+             GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                         "cURL task %s found.\n", ctask->url);
+             ctask->download_successful = GNUNET_YES;
+             //curl_multi_remove_handle (curl_multi, ctask->curl);
+             //curl_easy_cleanup (ctask->curl);
+             GNUNET_CONTAINER_DLL_remove (ctasks_head, ctasks_tail,
+                                          ctask);
+             break;
            }
-           run_httpd ();
-           //TODO iterate list, find ctask
+           GNUNET_assert (ctask != NULL);
          }
+         GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                     "curl end %s\n", curl_easy_strerror(msg->data.result));
+         run_httpd ();
          break;
        default:
+         GNUNET_assert (0);
          break;
       }
     } while (msgnum > 0);
+    
+    num_ctasks=0;
+    for (ctask=ctasks_head; ctask != NULL; ctask = ctask->next)
+    {
+      num_ctasks++;
+    }
+    
+    if (num_ctasks != running)
+    {
+      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                  "%d ctasks, %d curl running\n", num_ctasks, running);
+    }
+
+    GNUNET_assert ( num_ctasks == running );
+
+    run_httpd ();
+
   } while (mret == CURLM_CALL_MULTI_PERFORM);
-
+  
+  
   if (mret != CURLM_OK)
   {
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "%s failed at %s:%d: `%s'\n",
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "%s failed at %s:%d: `%s'\n",
                 "curl_multi_perform", __FILE__, __LINE__,
                 curl_multi_strerror (mret));
-    //TODO cleanup
   }
   curl_download_prepare();
 }
@@ -520,13 +583,14 @@
   curl_easy_setopt (ctask->curl, CURLOPT_MAXREDIRS, 4);
   /* no need to abort if the above failed */
   sprintf (curlurl, "http://%s%s";, host, url);
+  strcpy (ctask->url, curlurl);
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Adding new curl task for %s\n", curlurl);
   
   curl_easy_setopt (ctask->curl, CURLOPT_URL, curlurl);
   curl_easy_setopt (ctask->curl, CURLOPT_FAILONERROR, 1);
-  curl_easy_setopt (ctask->curl, CURLOPT_CONNECTTIMEOUT, 60L);
-  curl_easy_setopt (ctask->curl, CURLOPT_TIMEOUT, 60L);
+  curl_easy_setopt (ctask->curl, CURLOPT_CONNECTTIMEOUT, 600L);
+  curl_easy_setopt (ctask->curl, CURLOPT_TIMEOUT, 600L);
 
   mret = curl_multi_add_handle (curl_multi, ctask->curl);
 
@@ -536,9 +600,16 @@
                 "%s failed at %s:%d: `%s'\n",
                 "curl_multi_add_handle", __FILE__, __LINE__,
                 curl_multi_strerror (mret));
+    response = MHD_create_response_from_buffer (strlen (page),
+                                                (void*)page,
+                                                MHD_RESPMEM_PERSISTENT);
+    ret = MHD_queue_response (con,
+                              MHD_HTTP_OK,
+                              response);
+    MHD_destroy_response (response);
+
     curl_easy_cleanup (ctask->curl);
     GNUNET_free (ctask);
-    //TODO maybe error display here
     return ret;
   }
   
@@ -549,9 +620,11 @@
   response = MHD_create_response_from_callback (-1, -1,
                                                 &mhd_content_cb,
                                                 ctask,
-                                                NULL); //TODO Destroy resp here
+                                                &mhd_content_free);
   
   ret = MHD_queue_response (con, MHD_HTTP_OK, response);
+  
+  //MHD_destroy_response (response);
 
   return ret;
 }
@@ -669,8 +742,8 @@
 
   if ((NULL != tc->read_ready) &&
       (GNUNET_NETWORK_fdset_isset (tc->write_ready, s5r->remote_sock)) &&
-      (len = GNUNET_NETWORK_socket_send (s5r->remote_sock, s5r->rbuf,
-                                         s5r->rbuf_len)))
+      ((len = GNUNET_NETWORK_socket_send (s5r->remote_sock, s5r->rbuf,
+                                         s5r->rbuf_len)>0)))
   {
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                 "Successfully sent %d bytes to remote socket\n",
@@ -715,8 +788,8 @@
 
   if ((NULL != tc->read_ready) &&
       (GNUNET_NETWORK_fdset_isset (tc->write_ready, s5r->sock)) &&
-      (len = GNUNET_NETWORK_socket_send (s5r->sock, s5r->wbuf,
-                                         s5r->wbuf_len)))
+      ((len = GNUNET_NETWORK_socket_send (s5r->sock, s5r->wbuf,
+                                         s5r->wbuf_len)>0)))
   {
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                 "Successfully sent %d bytes to socket\n",




reply via email to

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