aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMartin Schanzenbach <mschanzenbach@posteo.de>2012-07-14 12:44:43 +0000
committerMartin Schanzenbach <mschanzenbach@posteo.de>2012-07-14 12:44:43 +0000
commit7e29d78478948cfabc8cb207c3b3538b4c28a6d6 (patch)
tree15cd0b0c97e713c5644d48622e9be294da35f451 /src
parentb8613716fc69f1ce5ebe8dca4e9b9979da06ad47 (diff)
downloadgnunet-7e29d78478948cfabc8cb207c3b3538b4c28a6d6.tar.gz
gnunet-7e29d78478948cfabc8cb207c3b3538b4c28a6d6.zip
-start post
Diffstat (limited to 'src')
-rw-r--r--src/gns/gnunet-gns-proxy.c135
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 */
343struct 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) */
333static unsigned long port = GNUNET_GNS_PROXY_PORT; 360static 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 */
451char 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 */
464static char*
465escape_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
491static int
492con_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
418static int 527static int
419get_uri_val_iter (void *cls, 528get_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