diff options
author | Martin Schanzenbach <mschanzenbach@posteo.de> | 2012-07-14 12:44:43 +0000 |
---|---|---|
committer | Martin Schanzenbach <mschanzenbach@posteo.de> | 2012-07-14 12:44:43 +0000 |
commit | 7e29d78478948cfabc8cb207c3b3538b4c28a6d6 (patch) | |
tree | 15cd0b0c97e713c5644d48622e9be294da35f451 /src | |
parent | b8613716fc69f1ce5ebe8dca4e9b9979da06ad47 (diff) | |
download | gnunet-7e29d78478948cfabc8cb207c3b3538b4c28a6d6.tar.gz gnunet-7e29d78478948cfabc8cb207c3b3538b4c28a6d6.zip |
-start post
Diffstat (limited to 'src')
-rw-r--r-- | src/gns/gnunet-gns-proxy.c | 135 |
1 files changed, 129 insertions, 6 deletions
diff --git a/src/gns/gnunet-gns-proxy.c b/src/gns/gnunet-gns-proxy.c index d14e8f872..f568a16e8 100644 --- a/src/gns/gnunet-gns-proxy.c +++ b/src/gns/gnunet-gns-proxy.c | |||
@@ -37,6 +37,7 @@ | |||
37 | #define GNUNET_GNS_PROXY_PORT 7777 | 37 | #define GNUNET_GNS_PROXY_PORT 7777 |
38 | #define MHD_MAX_CONNECTIONS 300 | 38 | #define MHD_MAX_CONNECTIONS 300 |
39 | #define MAX_HTTP_URI_LENGTH 2048 | 39 | #define MAX_HTTP_URI_LENGTH 2048 |
40 | #define POSTBUFFERSIZE 4096 | ||
40 | 41 | ||
41 | /* MHD/cURL defines */ | 42 | /* MHD/cURL defines */ |
42 | #define BUF_WAIT_FOR_CURL 0 | 43 | #define BUF_WAIT_FOR_CURL 0 |
@@ -278,6 +279,13 @@ struct ProxyCurlTask | |||
278 | /*put*/ | 279 | /*put*/ |
279 | size_t put_read_offset; | 280 | size_t put_read_offset; |
280 | size_t put_read_size; | 281 | size_t put_read_size; |
282 | |||
283 | /*post*/ | ||
284 | struct MHD_PostProcessor *post_handler; | ||
285 | |||
286 | /* post data */ | ||
287 | struct ProxyPostData *post_data_head; | ||
288 | struct ProxyPostData *post_data_tail; | ||
281 | 289 | ||
282 | }; | 290 | }; |
283 | 291 | ||
@@ -329,6 +337,25 @@ struct ProxySetCookieHeader | |||
329 | char *cookie; | 337 | char *cookie; |
330 | }; | 338 | }; |
331 | 339 | ||
340 | /** | ||
341 | * Post data structure | ||
342 | */ | ||
343 | struct ProxyPostData | ||
344 | { | ||
345 | /* DLL */ | ||
346 | struct ProxyPostData *next; | ||
347 | |||
348 | /* DLL */ | ||
349 | struct ProxyPostData *prev; | ||
350 | |||
351 | /* key */ | ||
352 | char *key; | ||
353 | |||
354 | /* value */ | ||
355 | char *value; | ||
356 | }; | ||
357 | |||
358 | |||
332 | /* The port the proxy is running on (default 7777) */ | 359 | /* The port the proxy is running on (default 7777) */ |
333 | static unsigned long port = GNUNET_GNS_PROXY_PORT; | 360 | static unsigned long port = GNUNET_GNS_PROXY_PORT; |
334 | 361 | ||
@@ -415,6 +442,88 @@ is_tld(const char* name, const char* tld) | |||
415 | return GNUNET_YES; | 442 | return GNUNET_YES; |
416 | } | 443 | } |
417 | 444 | ||
445 | /** | ||
446 | * convert integer to string representation | ||
447 | * | ||
448 | * @param i integer | ||
449 | * @return the character | ||
450 | */ | ||
451 | char i_to_hexchar (char i) | ||
452 | { | ||
453 | static char hexmap[] = "0123456789abcdef"; | ||
454 | GNUNET_assert (sizeof (hexmap) > (i & 15)); | ||
455 | return hexmap[i & 15]; | ||
456 | } | ||
457 | |||
458 | /** | ||
459 | * Escape giben 0-terminated string | ||
460 | * | ||
461 | * @param to_esc string to escapse | ||
462 | * @return allocated new escaped string (MUST free!) | ||
463 | */ | ||
464 | static char* | ||
465 | escape_to_urlenc (const char *to_esc) | ||
466 | { | ||
467 | char *pos = (char*)to_esc; | ||
468 | char *res = GNUNET_malloc (strlen (to_esc) * 3 + 1); | ||
469 | char *rpos = res; | ||
470 | |||
471 | while ('\0' != *pos) | ||
472 | { | ||
473 | if (isalnum (*pos) || | ||
474 | ('-' == *pos) || ('_' == *pos) || | ||
475 | ('.' == *pos) || ('~' == *pos)) | ||
476 | *rpos++ = *pos; | ||
477 | else if (' ' == *pos) | ||
478 | *rpos++ = '+'; | ||
479 | else | ||
480 | { | ||
481 | *rpos++ = '%'; | ||
482 | *rpos++ = i_to_hexchar (*pos >> 4); | ||
483 | *rpos++ = i_to_hexchar (*pos >> 15); | ||
484 | } | ||
485 | pos++; | ||
486 | } | ||
487 | *rpos = '\0'; | ||
488 | return res; | ||
489 | } | ||
490 | |||
491 | static int | ||
492 | con_post_data_iter (void *cls, | ||
493 | enum MHD_ValueKind kind, | ||
494 | const char *key, | ||
495 | const char *filename, | ||
496 | const char *content_type, | ||
497 | const char *transfer_encoding, | ||
498 | const char *data, | ||
499 | uint64_t off, | ||
500 | size_t size) | ||
501 | { | ||
502 | struct ProxyCurlTask* ctask = cls; | ||
503 | struct ProxyPostData* pdata; | ||
504 | |||
505 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | ||
506 | "Got POST data: '%s : %s' at offset %llu size %lld\n", | ||
507 | key, data, off, size); | ||
508 | |||
509 | /* FIXME ! if transfer enc == urlenc! */ | ||
510 | |||
511 | pdata = GNUNET_malloc (sizeof (struct ProxyPostData)); | ||
512 | pdata->key = escape_to_urlenc (key); | ||
513 | pdata->value = escape_to_urlenc (data); | ||
514 | |||
515 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | ||
516 | "Escaped POST data: '%s : %s'\n", | ||
517 | pdata->key, pdata->value); | ||
518 | |||
519 | GNUNET_CONTAINER_DLL_insert_tail (ctask->post_data_head, | ||
520 | ctask->post_data_tail, | ||
521 | pdata); | ||
522 | |||
523 | return MHD_YES; | ||
524 | } | ||
525 | |||
526 | |||
418 | static int | 527 | static int |
419 | get_uri_val_iter (void *cls, | 528 | get_uri_val_iter (void *cls, |
420 | enum MHD_ValueKind kind, | 529 | enum MHD_ValueKind kind, |
@@ -1589,11 +1698,13 @@ create_response (void *cls, | |||
1589 | { | 1698 | { |
1590 | if (0 == *upload_data_size) | 1699 | if (0 == *upload_data_size) |
1591 | { | 1700 | { |
1592 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, | 1701 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, |
1593 | "NO data for post!\n"); | 1702 | "Setting up POST processor\n"); |
1594 | curl_easy_cleanup (ctask->curl); | 1703 | ctask->post_handler = MHD_create_post_processor (con, |
1595 | GNUNET_free (ctask); | 1704 | POSTBUFFERSIZE, |
1596 | return MHD_NO; | 1705 | &con_post_data_iter, |
1706 | ctask); | ||
1707 | return MHD_YES; | ||
1597 | } | 1708 | } |
1598 | curl_easy_setopt (ctask->curl, CURLOPT_POST, 1); | 1709 | curl_easy_setopt (ctask->curl, CURLOPT_POST, 1); |
1599 | curl_easy_setopt (ctask->curl, CURLOPT_POSTFIELDSIZE, *upload_data_size); | 1710 | curl_easy_setopt (ctask->curl, CURLOPT_POSTFIELDSIZE, *upload_data_size); |
@@ -1642,7 +1753,19 @@ create_response (void *cls, | |||
1642 | } | 1753 | } |
1643 | 1754 | ||
1644 | ctask = (struct ProxyCurlTask *) *con_cls; | 1755 | ctask = (struct ProxyCurlTask *) *con_cls; |
1645 | 1756 | if (0 == strcasecmp (meth, MHD_HTTP_METHOD_POST)) | |
1757 | { | ||
1758 | if (0 != *upload_data_size) | ||
1759 | { | ||
1760 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, | ||
1761 | "Invoking POST processor\n"); | ||
1762 | MHD_post_process (ctask->post_handler, | ||
1763 | upload_data, *upload_data_size); | ||
1764 | *upload_data_size = 0; | ||
1765 | return MHD_YES; | ||
1766 | } | ||
1767 | return MHD_NO; | ||
1768 | } | ||
1646 | if (GNUNET_YES != ctask->ready_to_queue) | 1769 | if (GNUNET_YES != ctask->ready_to_queue) |
1647 | return MHD_YES; /* wait longer */ | 1770 | return MHD_YES; /* wait longer */ |
1648 | 1771 | ||