payto parser: extract 'subject' parameter.

This commit is contained in:
MS 2020-07-27 12:48:48 +02:00
parent e1fcb2b26c
commit 7c2de4c5e6
No known key found for this signature in database
GPG Key ID: 8D526861953F4C0F
3 changed files with 59 additions and 0 deletions

View File

@ -297,6 +297,15 @@ TALER_payto_get_method (const char *payto_uri);
char *
TALER_xtalerbank_account_from_payto (const char *payto);
/**
* Extract the subject value from the URI parameters.
*
* @param payto_uri the URL to parse
* @return NULL if the subject parameter is not found.
* The caller should free the returned value.
*/
char *
TALER_payto_get_subject (const char *payto_uri);
/**
* Possible values for a binary filter.

View File

@ -28,6 +28,45 @@
#define PAYTO "payto://"
/**
* Extract the subject value from the URI parameters.
*
* @param payto_uri the URL to parse
* @return NULL if the subject parameter is not found.
* The caller should free the returned value.
*/
char *
TALER_payto_get_subject (const char *payto_uri)
{
const char *key;
const char *value_start;
const char *value_end;
key = strchr (payto_uri,
(unsigned char) '?');
if (NULL == key)
return NULL;
do {
if (0 == strncasecmp (++key,
"subject",
strlen ("subject")))
{
value_start = strchr (key,
(unsigned char) '=');
if (NULL == value_start)
return NULL;
value_end = strchrnul (value_start,
(unsigned char) '&');
return GNUNET_strndup (value_start + 1,
value_end - value_start - 1);
}
} while ( (key = strchr (key,
(unsigned char) '&')) );
return NULL;
}
/**
* Obtain the payment method from a @a payto_uri. The
* format of a payto URI is 'payto://$METHOD/$SOMETHING'.

View File

@ -22,6 +22,8 @@
#include "taler_util.h"
#define CHECK(a,b) do { \
GNUNET_assert (a != NULL); \
GNUNET_assert (b != NULL); \
if (0 != strcmp (a,b)) { \
GNUNET_break (0); \
fprintf (stderr, "Got %s, wanted %s\n", b, a); \
@ -52,6 +54,15 @@ main (int argc,
"payto://x-taler-bank/localhost:1080/alice?subject=hello&amount=EUR:1");
CHECK ("alice",
r);
r = TALER_payto_get_subject (
"payto://x-taler-bank/localhost:1080/alice?subject=hello&amount=EUR:1");
CHECK ("hello",
r);
r = TALER_payto_get_subject (
"payto://x-taler-bank/localhost:1080/alice");
GNUNET_assert (r == NULL);
return 0;
}