diff options
author | Martin Schanzenbach <mschanzenbach@posteo.de> | 2012-08-03 14:54:17 +0000 |
---|---|---|
committer | Martin Schanzenbach <mschanzenbach@posteo.de> | 2012-08-03 14:54:17 +0000 |
commit | 8b5d3e0812ce91b3b1d579720eb7a72a194a84e7 (patch) | |
tree | b4b216423869663cecd7940a33101b9c86d96da1 /src/gns | |
parent | 2aab65fd2faa1a83a64888c79813b8cb646a1f77 (diff) | |
download | gnunet-8b5d3e0812ce91b3b1d579720eb7a72a194a84e7.tar.gz gnunet-8b5d3e0812ce91b3b1d579720eb7a72a194a84e7.zip |
-add httppost, put, fixes
Diffstat (limited to 'src/gns')
-rw-r--r-- | src/gns/gnunet-gns-proxy.c | 367 |
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 | */ |
356 | struct ProxyPostData | 365 | struct 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 | */ | ||
1361 | static size_t | ||
1362 | put_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 | */ |
1286 | static size_t | 1414 | static size_t |
1287 | read_callback (void *buf, size_t size, size_t nmemb, void *cls) | 1415 | post_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 | } |