aboutsummaryrefslogtreecommitdiff
path: root/src/gns
diff options
context:
space:
mode:
authorMartin Schanzenbach <mschanzenbach@posteo.de>2012-08-03 14:54:17 +0000
committerMartin Schanzenbach <mschanzenbach@posteo.de>2012-08-03 14:54:17 +0000
commit8b5d3e0812ce91b3b1d579720eb7a72a194a84e7 (patch)
treeb4b216423869663cecd7940a33101b9c86d96da1 /src/gns
parent2aab65fd2faa1a83a64888c79813b8cb646a1f77 (diff)
downloadgnunet-8b5d3e0812ce91b3b1d579720eb7a72a194a84e7.tar.gz
gnunet-8b5d3e0812ce91b3b1d579720eb7a72a194a84e7.zip
-add httppost, put, fixes
Diffstat (limited to 'src/gns')
-rw-r--r--src/gns/gnunet-gns-proxy.c367
1 files changed, 282 insertions, 85 deletions
diff --git a/src/gns/gnunet-gns-proxy.c b/src/gns/gnunet-gns-proxy.c
index 12a95c955..fee244443 100644
--- a/src/gns/gnunet-gns-proxy.c
+++ b/src/gns/gnunet-gns-proxy.c
@@ -197,6 +197,9 @@ struct ProxyCurlTask
197 /* Handle to cURL */ 197 /* Handle to cURL */
198 CURL *curl; 198 CURL *curl;
199 199
200 /* is curl running? */
201 int curl_running;
202
200 /* Optional header replacements for curl (LEHO) */ 203 /* Optional header replacements for curl (LEHO) */
201 struct curl_slist *headers; 204 struct curl_slist *headers;
202 205
@@ -292,13 +295,19 @@ struct ProxyCurlTask
292 struct MHD_PostProcessor *post_handler; 295 struct MHD_PostProcessor *post_handler;
293 296
294 /* post data */ 297 /* post data */
295 struct ProxyPostData *post_data_head; 298 struct ProxyUploadData *upload_data_head;
296 struct ProxyPostData *post_data_tail; 299 struct ProxyUploadData *upload_data_tail;
297 300
298 int post_done; 301 int post_done;
299 302
300 /* the type of POST encoding */ 303 /* the type of POST encoding */
301 char* post_type; 304 char* post_type;
305
306 struct curl_httppost *httppost;
307
308 struct curl_httppost *httppost_last;
309
310 int is_httppost;
302 311
303}; 312};
304 313
@@ -353,13 +362,21 @@ struct ProxySetCookieHeader
353/** 362/**
354 * Post data structure 363 * Post data structure
355 */ 364 */
356struct ProxyPostData 365struct ProxyUploadData
357{ 366{
358 /* DLL */ 367 /* DLL */
359 struct ProxyPostData *next; 368 struct ProxyUploadData *next;
360 369
361 /* DLL */ 370 /* DLL */
362 struct ProxyPostData *prev; 371 struct ProxyUploadData *prev;
372
373 char *key;
374
375 char *filename;
376
377 char *content_type;
378
379 size_t content_length;
363 380
364 /* value */ 381 /* value */
365 char *value; 382 char *value;
@@ -516,29 +533,84 @@ con_post_data_iter (void *cls,
516 size_t size) 533 size_t size)
517{ 534{
518 struct ProxyCurlTask* ctask = cls; 535 struct ProxyCurlTask* ctask = cls;
519 struct ProxyPostData* pdata; 536 struct ProxyUploadData* pdata;
520 char* enc; 537 char* enc;
538 char* new_value;
521 539
522 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 540 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
523 "Got POST data: '%s : %s' at offset %llu size %lld\n", 541 "Got POST data: '%s : %s' at offset %llu size %lld\n",
524 key, data, off, size); 542 key, data, off, size);
525 543
544 GNUNET_assert (NULL != ctask->post_type);
545
546 if (0 == strcasecmp (MHD_HTTP_POST_ENCODING_MULTIPART_FORMDATA,
547 ctask->post_type))
548 {
549 ctask->is_httppost = GNUNET_YES;
550 /* new part */
551 if (0 == off)
552 {
553 pdata = GNUNET_malloc (sizeof (struct ProxyUploadData));
554 pdata->key = strdup (key);
555
556 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
557 "Copied %lld\n");
558
559 if (NULL != filename)
560 {
561 pdata->filename = strdup (filename);
562 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
563 "Filename %s\n", filename);
564 }
565
566 if (NULL != content_type)
567 {
568 pdata->content_type = strdup (content_type);
569 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
570 "Content-Type %s\n", content_type);
571 }
572
573 pdata->value = GNUNET_malloc (size);
574 pdata->total_bytes = size;
575 memcpy (pdata->value, data, size);
576 GNUNET_CONTAINER_DLL_insert_tail (ctask->upload_data_head,
577 ctask->upload_data_tail,
578 pdata);
579
580 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
581 "Copied %lld bytes of POST Data\n", size);
582 return MHD_YES;
583 }
584
585 pdata = ctask->upload_data_tail;
586 new_value = GNUNET_malloc (size + pdata->total_bytes);
587 memcpy (new_value, pdata->value, pdata->total_bytes);
588 memcpy (new_value+off, data, size);
589 GNUNET_free (pdata->value);
590 pdata->total_bytes += size;
591
592 return MHD_YES;
593
594 }
595
526 if (0 != strcasecmp (MHD_HTTP_POST_ENCODING_FORM_URLENCODED, 596 if (0 != strcasecmp (MHD_HTTP_POST_ENCODING_FORM_URLENCODED,
527 ctask->post_type)) 597 ctask->post_type))
528 { 598 {
529 return MHD_NO; 599 return MHD_NO;
530 } 600 }
601
602 ctask->is_httppost = GNUNET_NO;
531 603
532 if (NULL != ctask->curl) 604 if (NULL != ctask->curl)
533 curl_easy_pause (ctask->curl, CURLPAUSE_SEND); 605 curl_easy_pause (ctask->curl, CURLPAUSE_CONT);
534 606
535 if (0 == off) 607 if (0 == off)
536 { 608 {
537 /* a key */ 609 /* a key */
538 pdata = GNUNET_malloc (sizeof (struct ProxyPostData)); 610 pdata = GNUNET_malloc (sizeof (struct ProxyUploadData));
539 enc = escape_to_urlenc (key); 611 enc = escape_to_urlenc (key);
540 pdata->value = GNUNET_malloc (strlen (enc) + 3); 612 pdata->value = GNUNET_malloc (strlen (enc) + 3);
541 if (NULL != ctask->post_data_head) 613 if (NULL != ctask->upload_data_head)
542 { 614 {
543 pdata->value[0] = '&'; 615 pdata->value[0] = '&';
544 memcpy (pdata->value+1, enc, strlen (enc)); 616 memcpy (pdata->value+1, enc, strlen (enc));
@@ -554,13 +626,13 @@ con_post_data_iter (void *cls,
554 "Escaped POST key: '%s'\n", 626 "Escaped POST key: '%s'\n",
555 pdata->value); 627 pdata->value);
556 628
557 GNUNET_CONTAINER_DLL_insert_tail (ctask->post_data_head, 629 GNUNET_CONTAINER_DLL_insert_tail (ctask->upload_data_head,
558 ctask->post_data_tail, 630 ctask->upload_data_tail,
559 pdata); 631 pdata);
560 } 632 }
561 633
562 /* a value */ 634 /* a value */
563 pdata = GNUNET_malloc (sizeof (struct ProxyPostData)); 635 pdata = GNUNET_malloc (sizeof (struct ProxyUploadData));
564 enc = escape_to_urlenc (data); 636 enc = escape_to_urlenc (data);
565 pdata->value = GNUNET_malloc (strlen (enc) + 1); 637 pdata->value = GNUNET_malloc (strlen (enc) + 1);
566 memcpy (pdata->value, enc, strlen (enc)); 638 memcpy (pdata->value, enc, strlen (enc));
@@ -572,8 +644,8 @@ con_post_data_iter (void *cls,
572 "Escaped POST value: '%s'\n", 644 "Escaped POST value: '%s'\n",
573 pdata->value); 645 pdata->value);
574 646
575 GNUNET_CONTAINER_DLL_insert_tail (ctask->post_data_head, 647 GNUNET_CONTAINER_DLL_insert_tail (ctask->upload_data_head,
576 ctask->post_data_tail, 648 ctask->upload_data_tail,
577 pdata); 649 pdata);
578 return MHD_YES; 650 return MHD_YES;
579} 651}
@@ -626,14 +698,16 @@ con_val_iter (void *cls,
626 else 698 else
627 hdr_val = value; 699 hdr_val = value;
628 700
629 if (0 == strcmp (MHD_HTTP_HEADER_CONTENT_TYPE, 701 if (0 == strcasecmp (MHD_HTTP_HEADER_CONTENT_TYPE,
630 key)) 702 key))
631 { 703 {
632 if (0 == strcmp (value, 704 if (0 == strncasecmp (value,
633 MHD_HTTP_POST_ENCODING_FORM_URLENCODED)) 705 MHD_HTTP_POST_ENCODING_FORM_URLENCODED,
706 strlen (MHD_HTTP_POST_ENCODING_FORM_URLENCODED)))
634 ctask->post_type = MHD_HTTP_POST_ENCODING_FORM_URLENCODED; 707 ctask->post_type = MHD_HTTP_POST_ENCODING_FORM_URLENCODED;
635 else if (0 == strcmp (value, 708 else if (0 == strncasecmp (value,
636 MHD_HTTP_POST_ENCODING_MULTIPART_FORMDATA)) 709 MHD_HTTP_POST_ENCODING_MULTIPART_FORMDATA,
710 strlen (MHD_HTTP_POST_ENCODING_MULTIPART_FORMDATA)))
637 ctask->post_type = MHD_HTTP_POST_ENCODING_MULTIPART_FORMDATA; 711 ctask->post_type = MHD_HTTP_POST_ENCODING_MULTIPART_FORMDATA;
638 else 712 else
639 ctask->post_type = NULL; 713 ctask->post_type = NULL;
@@ -1099,7 +1173,7 @@ mhd_content_cb (void *cls,
1099 ctask->buf_status = BUF_WAIT_FOR_CURL; 1173 ctask->buf_status = BUF_WAIT_FOR_CURL;
1100 1174
1101 if (NULL != ctask->curl) 1175 if (NULL != ctask->curl)
1102 curl_easy_pause (ctask->curl, CURLPAUSE_RECV); 1176 curl_easy_pause (ctask->curl, CURLPAUSE_CONT);
1103 1177
1104 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 1178 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1105 "MHD: copied %d bytes\n", copied); 1179 "MHD: copied %d bytes\n", copied);
@@ -1280,14 +1354,68 @@ curl_download_cb (void *ptr, size_t size, size_t nmemb, void* ctx)
1280 return total; 1354 return total;
1281} 1355}
1282 1356
1357
1358/**
1359 * cURL callback for put data
1360 */
1361static size_t
1362put_read_callback (void *buf, size_t size, size_t nmemb, void *cls)
1363{
1364 struct ProxyCurlTask *ctask = cls;
1365 struct ProxyUploadData *pdata = ctask->upload_data_head;
1366 size_t len = size * nmemb;
1367 size_t to_copy;
1368 char* pos;
1369
1370 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1371 "CURL: put read callback\n");
1372
1373 if (NULL == pdata)
1374 return CURL_READFUNC_PAUSE;
1375
1376 //fin
1377 if (NULL == pdata->value)
1378 {
1379 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1380 "CURL: Terminating PUT\n");
1381
1382 GNUNET_CONTAINER_DLL_remove (ctask->upload_data_head,
1383 ctask->upload_data_tail,
1384 pdata);
1385 GNUNET_free (pdata);
1386 return 0;
1387 }
1388
1389 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1390 "CURL: read callback value %s\n", pdata->value);
1391
1392 to_copy = pdata->bytes_left;
1393 if (to_copy > len)
1394 to_copy = len;
1395
1396 pos = pdata->value + (pdata->total_bytes - pdata->bytes_left);
1397 memcpy (buf, pos, to_copy);
1398 pdata->bytes_left -= to_copy;
1399 if (pdata->bytes_left <= 0)
1400 {
1401 GNUNET_free (pdata->value);
1402 GNUNET_CONTAINER_DLL_remove (ctask->upload_data_head,
1403 ctask->upload_data_tail,
1404 pdata);
1405 GNUNET_free (pdata);
1406 }
1407 return to_copy;
1408}
1409
1410
1283/** 1411/**
1284 * cURL callback for post data 1412 * cURL callback for post data
1285 */ 1413 */
1286static size_t 1414static size_t
1287read_callback (void *buf, size_t size, size_t nmemb, void *cls) 1415post_read_callback (void *buf, size_t size, size_t nmemb, void *cls)
1288{ 1416{
1289 struct ProxyCurlTask *ctask = cls; 1417 struct ProxyCurlTask *ctask = cls;
1290 struct ProxyPostData *pdata = ctask->post_data_head; 1418 struct ProxyUploadData *pdata = ctask->upload_data_head;
1291 size_t len = size * nmemb; 1419 size_t len = size * nmemb;
1292 size_t to_copy; 1420 size_t to_copy;
1293 char* pos; 1421 char* pos;
@@ -1304,8 +1432,8 @@ read_callback (void *buf, size_t size, size_t nmemb, void *cls)
1304 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 1432 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1305 "CURL: Terminating POST data\n"); 1433 "CURL: Terminating POST data\n");
1306 1434
1307 GNUNET_CONTAINER_DLL_remove (ctask->post_data_head, 1435 GNUNET_CONTAINER_DLL_remove (ctask->upload_data_head,
1308 ctask->post_data_tail, 1436 ctask->upload_data_tail,
1309 pdata); 1437 pdata);
1310 GNUNET_free (pdata); 1438 GNUNET_free (pdata);
1311 return 0; 1439 return 0;
@@ -1324,8 +1452,8 @@ read_callback (void *buf, size_t size, size_t nmemb, void *cls)
1324 if (pdata->bytes_left <= 0) 1452 if (pdata->bytes_left <= 0)
1325 { 1453 {
1326 GNUNET_free (pdata->value); 1454 GNUNET_free (pdata->value);
1327 GNUNET_CONTAINER_DLL_remove (ctask->post_data_head, 1455 GNUNET_CONTAINER_DLL_remove (ctask->upload_data_head,
1328 ctask->post_data_tail, 1456 ctask->upload_data_tail,
1329 pdata); 1457 pdata);
1330 GNUNET_free (pdata); 1458 GNUNET_free (pdata);
1331 } 1459 }
@@ -1783,9 +1911,12 @@ create_response (void *cls,
1783 1911
1784 char curlurl[MAX_HTTP_URI_LENGTH]; // buffer overflow! 1912 char curlurl[MAX_HTTP_URI_LENGTH]; // buffer overflow!
1785 int ret = MHD_YES; 1913 int ret = MHD_YES;
1914 int i;
1786 1915
1787 struct ProxyCurlTask *ctask = *con_cls; 1916 struct ProxyCurlTask *ctask = *con_cls;
1788 struct ProxyPostData *fin_post; 1917 struct ProxyUploadData *fin_post;
1918 struct curl_forms forms[5];
1919 struct ProxyUploadData *upload_data_iter;
1789 1920
1790 //FIXME handle 1921 //FIXME handle
1791 if ((0 != strcasecmp (meth, MHD_HTTP_METHOD_GET)) && 1922 if ((0 != strcasecmp (meth, MHD_HTTP_METHOD_GET)) &&
@@ -1806,6 +1937,7 @@ create_response (void *cls,
1806 "Got %s request for %s\n", meth, url); 1937 "Got %s request for %s\n", meth, url);
1807 ctask->mhd = hd; 1938 ctask->mhd = hd;
1808 ctask->curl = curl_easy_init(); 1939 ctask->curl = curl_easy_init();
1940 ctask->curl_running = GNUNET_NO;
1809 if (NULL == ctask->curl) 1941 if (NULL == ctask->curl)
1810 { 1942 {
1811 ctask->response = MHD_create_response_from_buffer (strlen (page), 1943 ctask->response = MHD_create_response_from_buffer (strlen (page),
@@ -1819,9 +1951,36 @@ create_response (void *cls,
1819 return ret; 1951 return ret;
1820 } 1952 }
1821 1953
1954 if (ctask->mhd->is_ssl)
1955 ctask->port = HTTPS_PORT;
1956 else
1957 ctask->port = HTTP_PORT;
1958
1959 MHD_get_connection_values (con,
1960 MHD_HEADER_KIND,
1961 &con_val_iter, ctask);
1962
1963 curl_easy_setopt (ctask->curl, CURLOPT_HEADERFUNCTION, &curl_check_hdr);
1964 curl_easy_setopt (ctask->curl, CURLOPT_HEADERDATA, ctask);
1965 curl_easy_setopt (ctask->curl, CURLOPT_WRITEFUNCTION, &curl_download_cb);
1966 curl_easy_setopt (ctask->curl, CURLOPT_WRITEDATA, ctask);
1967 curl_easy_setopt (ctask->curl, CURLOPT_FOLLOWLOCATION, 0);
1968 curl_easy_setopt (ctask->curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
1969
1970 if (GNUNET_NO == ctask->mhd->is_ssl)
1971 {
1972 sprintf (curlurl, "http://%s:%d%s", ctask->host, ctask->port, ctask->url);
1973 curl_easy_setopt (ctask->curl, CURLOPT_URL, curlurl);
1974 }
1975
1976
1977 curl_easy_setopt (ctask->curl, CURLOPT_FAILONERROR, 1);
1978 curl_easy_setopt (ctask->curl, CURLOPT_CONNECTTIMEOUT, 600L);
1979 curl_easy_setopt (ctask->curl, CURLOPT_TIMEOUT, 600L);
1980
1822 /* Add GNS header */ 1981 /* Add GNS header */
1823 ctask->headers = curl_slist_append (ctask->headers, 1982 //ctask->headers = curl_slist_append (ctask->headers,
1824 "GNS: YES"); 1983 // "GNS: YES");
1825 ctask->accepted = GNUNET_YES; 1984 ctask->accepted = GNUNET_YES;
1826 ctask->download_in_progress = GNUNET_YES; 1985 ctask->download_in_progress = GNUNET_YES;
1827 ctask->buf_status = BUF_WAIT_FOR_CURL; 1986 ctask->buf_status = BUF_WAIT_FOR_CURL;
@@ -1830,52 +1989,32 @@ create_response (void *cls,
1830 ctask->buffer_read_ptr = ctask->buffer; 1989 ctask->buffer_read_ptr = ctask->buffer;
1831 ctask->buffer_write_ptr = ctask->buffer; 1990 ctask->buffer_write_ptr = ctask->buffer;
1832 ctask->pp_task = GNUNET_SCHEDULER_NO_TASK; 1991 ctask->pp_task = GNUNET_SCHEDULER_NO_TASK;
1833 if (ctask->mhd->is_ssl) 1992
1834 ctask->port = HTTPS_PORT;
1835 else
1836 ctask->port = HTTP_PORT;
1837
1838 MHD_get_connection_values (con,
1839 MHD_HEADER_KIND,
1840 &con_val_iter, ctask);
1841 1993
1842 if (0 == strcasecmp (meth, MHD_HTTP_METHOD_PUT)) 1994 if (0 == strcasecmp (meth, MHD_HTTP_METHOD_PUT))
1843 { 1995 {
1844 //FIXME: this prolly works like POST? 1996 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1845 if (0 == *upload_data_size) 1997 "Setting up PUT\n");
1846 {
1847 curl_easy_cleanup (ctask->curl);
1848 GNUNET_free (ctask);
1849 return MHD_NO;
1850 }
1851 ctask->put_read_offset = 0;
1852 ctask->put_read_size = *upload_data_size;
1853 curl_easy_setopt (ctask->curl, CURLOPT_UPLOAD, 1);
1854 curl_easy_setopt (ctask->curl, CURLOPT_READDATA, upload_data);
1855 //curl_easy_setopt (ctask->curl, CURLOPT_READFUNCTION, &curl_read_cb);
1856 1998
1857 GNUNET_log (GNUNET_ERROR_TYPE_INFO, 1999 curl_easy_setopt (ctask->curl, CURLOPT_UPLOAD, 1);
1858 "Got PUT data: %s\n", upload_data); 2000 curl_easy_setopt (ctask->curl, CURLOPT_READDATA, ctask);
1859 curl_easy_cleanup (ctask->curl); 2001 curl_easy_setopt (ctask->curl, CURLOPT_READFUNCTION, &put_read_callback);
1860 GNUNET_free (ctask); 2002 ctask->headers = curl_slist_append (ctask->headers,
1861 return MHD_NO; 2003 "Transfer-Encoding: chunked");
1862 } 2004 }
1863 2005
1864 if (0 == strcasecmp (meth, MHD_HTTP_METHOD_POST)) 2006 if (0 == strcasecmp (meth, MHD_HTTP_METHOD_POST))
1865 { 2007 {
1866 //FIXME handle multipart 2008 //FIXME handle multipart
1867 GNUNET_log (GNUNET_ERROR_TYPE_INFO, 2009 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1868 "Setting up POST processor\n"); 2010 "Setting up POST processor\n");
1869 ctask->post_handler = MHD_create_post_processor (con, 2011 ctask->post_handler = MHD_create_post_processor (con,
1870 POSTBUFFERSIZE, 2012 POSTBUFFERSIZE,
1871 &con_post_data_iter, 2013 &con_post_data_iter,
1872 ctask); 2014 ctask);
1873 curl_easy_setopt (ctask->curl, CURLOPT_POST, 1);
1874 curl_easy_setopt (ctask->curl, CURLOPT_READFUNCTION,
1875 &read_callback);
1876 curl_easy_setopt (ctask->curl, CURLOPT_READDATA, ctask);
1877 ctask->headers = curl_slist_append (ctask->headers, 2015 ctask->headers = curl_slist_append (ctask->headers,
1878 "Transfer-Encoding: chunked"); 2016 "Transfer-Encoding: chunked");
2017 return MHD_YES;
1879 } 2018 }
1880 2019
1881 if (0 == strcasecmp (meth, MHD_HTTP_METHOD_HEAD)) 2020 if (0 == strcasecmp (meth, MHD_HTTP_METHOD_HEAD))
@@ -1885,31 +2024,9 @@ create_response (void *cls,
1885 curl_easy_setopt (ctask->curl, CURLOPT_NOBODY, 1); 2024 curl_easy_setopt (ctask->curl, CURLOPT_NOBODY, 1);
1886 } 2025 }
1887 2026
1888 curl_easy_setopt (ctask->curl, CURLOPT_HEADERFUNCTION, &curl_check_hdr);
1889 curl_easy_setopt (ctask->curl, CURLOPT_HEADERDATA, ctask);
1890 curl_easy_setopt (ctask->curl, CURLOPT_WRITEFUNCTION, &curl_download_cb);
1891 curl_easy_setopt (ctask->curl, CURLOPT_WRITEDATA, ctask);
1892 curl_easy_setopt (ctask->curl, CURLOPT_FOLLOWLOCATION, 0);
1893 curl_easy_setopt (ctask->curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
1894
1895 if (GNUNET_NO == ctask->mhd->is_ssl)
1896 {
1897 sprintf (curlurl, "http://%s:%d%s", ctask->host, ctask->port, ctask->url);
1898 //MHD_get_connection_values (con,
1899 // MHD_GET_ARGUMENT_KIND,
1900 // &get_uri_val_iter, curlurl);
1901 curl_easy_setopt (ctask->curl, CURLOPT_URL, curlurl);
1902 }
1903 2027
1904 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 2028 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1905 "MHD: Adding new curl task for %s\n", ctask->host); 2029 "MHD: Adding new curl task for %s\n", ctask->host);
1906 //MHD_get_connection_values (con,
1907 // MHD_GET_ARGUMENT_KIND,
1908 // &get_uri_val_iter, ctask->url);
1909
1910 curl_easy_setopt (ctask->curl, CURLOPT_FAILONERROR, 1);
1911 curl_easy_setopt (ctask->curl, CURLOPT_CONNECTTIMEOUT, 600L);
1912 curl_easy_setopt (ctask->curl, CURLOPT_TIMEOUT, 600L);
1913 2030
1914 GNUNET_GNS_get_authority (gns_handle, 2031 GNUNET_GNS_get_authority (gns_handle,
1915 ctask->host, 2032 ctask->host,
@@ -1917,6 +2034,7 @@ create_response (void *cls,
1917 ctask); 2034 ctask);
1918 ctask->ready_to_queue = GNUNET_NO; 2035 ctask->ready_to_queue = GNUNET_NO;
1919 ctask->fin = GNUNET_NO; 2036 ctask->fin = GNUNET_NO;
2037 ctask->curl_running = GNUNET_YES;
1920 return MHD_YES; 2038 return MHD_YES;
1921 } 2039 }
1922 2040
@@ -1925,18 +2043,95 @@ create_response (void *cls,
1925 { 2043 {
1926 if (0 != *upload_data_size) 2044 if (0 != *upload_data_size)
1927 { 2045 {
2046
1928 GNUNET_log (GNUNET_ERROR_TYPE_INFO, 2047 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
1929 "Invoking POST processor\n"); 2048 "Invoking POST processor\n");
1930 MHD_post_process (ctask->post_handler, 2049 MHD_post_process (ctask->post_handler,
1931 upload_data, *upload_data_size); 2050 upload_data, *upload_data_size);
1932 *upload_data_size = 0; 2051 *upload_data_size = 0;
2052 if ((GNUNET_NO == ctask->is_httppost) &&
2053 (GNUNET_NO == ctask->curl_running))
2054 {
2055 curl_easy_setopt (ctask->curl, CURLOPT_POST, 1);
2056 curl_easy_setopt (ctask->curl, CURLOPT_READFUNCTION,
2057 &post_read_callback);
2058 curl_easy_setopt (ctask->curl, CURLOPT_READDATA, ctask);
2059
2060 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
2061 "MHD: Adding new curl task for %s\n", ctask->host);
2062
2063 GNUNET_GNS_get_authority (gns_handle,
2064 ctask->host,
2065 &process_get_authority,
2066 ctask);
2067 ctask->ready_to_queue = GNUNET_NO;
2068 ctask->fin = GNUNET_NO;
2069 ctask->curl_running = GNUNET_YES;
2070 }
1933 return MHD_YES; 2071 return MHD_YES;
1934 } 2072 }
1935 else if (GNUNET_NO == ctask->post_done) 2073 else if (GNUNET_NO == ctask->post_done)
1936 { 2074 {
1937 fin_post = GNUNET_malloc (sizeof (struct ProxyPostData)); 2075 if (GNUNET_YES == ctask->is_httppost)
1938 GNUNET_CONTAINER_DLL_insert_tail (ctask->post_data_head, 2076 {
1939 ctask->post_data_tail, 2077 i = 0;
2078 for (upload_data_iter = ctask->upload_data_head;
2079 NULL != upload_data_iter;
2080 upload_data_iter = upload_data_iter->next)
2081 {
2082 if (NULL != upload_data_iter->filename)
2083 {
2084 forms[i].option = CURLFORM_FILENAME;
2085 forms[i].value = upload_data_iter->filename;
2086 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
2087 "Adding filename %s\n",
2088 forms[i].value);
2089 i++;
2090 }
2091 if (NULL != upload_data_iter->content_type)
2092 {
2093 forms[i].option = CURLFORM_CONTENTTYPE;
2094 forms[i].value = upload_data_iter->content_type;
2095 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
2096 "Adding content type %s\n",
2097 forms[i].value);
2098 i++;
2099 }
2100 forms[i].option = CURLFORM_PTRCONTENTS;
2101 forms[i].value = upload_data_iter->value;
2102 forms[i+1].option = CURLFORM_END;
2103
2104 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
2105 "Adding formdata for %s (len=%lld)\n",
2106 upload_data_iter->key,
2107 upload_data_iter->total_bytes);
2108
2109 curl_formadd(&ctask->httppost, &ctask->httppost_last,
2110 CURLFORM_COPYNAME, upload_data_iter->key,
2111 CURLFORM_CONTENTSLENGTH, upload_data_iter->total_bytes,
2112 CURLFORM_ARRAY, forms,
2113 CURLFORM_END);
2114 }
2115 curl_easy_setopt (ctask->curl, CURLOPT_HTTPPOST,
2116 ctask->httppost);
2117
2118 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
2119 "MHD: Adding new curl task for %s\n", ctask->host);
2120
2121 GNUNET_GNS_get_authority (gns_handle,
2122 ctask->host,
2123 &process_get_authority,
2124 ctask);
2125 ctask->ready_to_queue = GNUNET_YES;
2126 ctask->fin = GNUNET_NO;
2127 ctask->curl_running = GNUNET_YES;
2128 ctask->post_done = GNUNET_YES;
2129 return MHD_YES;
2130 }
2131
2132 fin_post = GNUNET_malloc (sizeof (struct ProxyUploadData));
2133 GNUNET_CONTAINER_DLL_insert_tail (ctask->upload_data_head,
2134 ctask->upload_data_tail,
1940 fin_post); 2135 fin_post);
1941 ctask->post_done = GNUNET_YES; 2136 ctask->post_done = GNUNET_YES;
1942 return MHD_YES; 2137 return MHD_YES;
@@ -2954,6 +3149,8 @@ do_shutdown (void *cls,
2954 if (NULL != ctask->response) 3149 if (NULL != ctask->response)
2955 MHD_destroy_response (ctask->response); 3150 MHD_destroy_response (ctask->response);
2956 3151
3152 //FIXME free pdata here
3153
2957 3154
2958 GNUNET_free (ctask); 3155 GNUNET_free (ctask);
2959 } 3156 }